天天看點

hive中表狀态資料的擷取

在做容量規劃的時候,我們需要關注hive中表的占用空間大小,檔案數量,平均檔案大小,已及存儲格式,雖然在hive中也有statistcs的功能,但是值并準确(相比mysql的show table status相差很多)

我們可以通過一些簡單地方法去拿到這個值,比如通過hadoop fs -du 來擷取表占用的空間大小,通過hadoop fs -count擷取表的檔案數量,然後定期取值并load到資料庫中。

在中繼資料庫中,通過建立view來擷取資料庫,hdfs路徑,表類型,存儲格式等資訊

1

2

3

4

5

6

7

8

9

10

11

12

13

<code>CREATE</code> <code>OR</code> <code>REPLACE</code> <code>VIEW</code> <code>table_location_type </code><code>AS</code> <code>SELECT</code> <code>CONCAT_WS(</code><code>'.'</code><code>,a.</code><code>NAME</code><code>,b.TBL_NAME) </code><code>AS</code> <code>db_table,SUBSTR(c.LOCATION,18) </code><code>AS</code> <code>db_location,b.TBL_TYPE </code><code>AS</code> <code>type,SUBSTRING_INDEX(c.INPUT_FORMAT, </code><code>'.'</code><code>, -1)</code>

<code>AS</code> <code>IN_FOR </code><code>FROM</code> <code>dbs a,tbls b,sds c </code><code>WHERE</code> <code>a.DB_ID=b.DB_ID </code><code>AND</code> <code>b.SD_ID=c.SD_ID;</code>

<code>資料如下:</code>

<code>select</code> <code>* </code><code>from</code> <code>table_location_type limit 5;</code>

<code>+</code><code>----------------------------------+---------------------------------------------------------+---------------+-------------------+</code>

<code>| db_table                         | db_location                                             | type          | IN_FOR            |</code>

<code>| xxxx         | /bip/hive_warehouse/cdnlog.db/dnion_log_origin          | MANAGED_TABLE | TextInputFormat   |</code>

<code>| xxxx     | /bip/hive_warehouse/cdnlog.db/chinacache_log_origin     | MANAGED_TABLE | TextInputFormat   |</code>

<code>| xxxx | /bip/hive_warehouse/cdnlog.db/chinanetcenter_log_origin | MANAGED_TABLE | TextInputFormat   |</code>

<code>| xxxxx                 | /bip/hive_warehouse/cdnlog.db/dnion_log                 | MANAGED_TABLE | RCFileInputFormat |</code>

<code>| xxxx        | /bip/hive_warehouse/cdnlog.db/chinanetcenter_log        | MANAGED_TABLE | RCFileInputFormat |</code>

然後通過和我們自己收集的資訊做join就可以擷取相關的資料:

比如檔案數量最多top 20

<code>select</code> <code>a.db_table </code><code>as</code> <code>tb,round(b.</code><code>size</code><code>/(1024*1024*1024),2) </code><code>as</code> <code>size</code><code>,c.</code><code>size</code> <code>as</code> <code>num,round(b.</code><code>size</code><code>/(c.</code><code>size</code><code>*1024*1024),2) </code><code>as</code> <code>avg</code><code>,</code>

<code>a.type,a.in_for </code><code>from</code> <code>table_location_type  a,file_size b,file_num  c </code><code>where</code> <code>a.db_location=b.location </code><code>and</code> <code>a.db_location=c.location </code><code>and</code> <code>c.dt=</code><code>'20140325'</code>

<code>and</code> <code>b.dt=</code><code>'20140325'</code> <code>and</code> <code>c.</code><code>size</code> <code>&gt; 0 </code><code>and</code> <code>b.</code><code>size</code> <code>&gt; 1000000000 </code><code>order</code> <code>by</code> <code>c.</code><code>size</code><code>+0 </code><code>desc</code> <code>limit 20;</code>

在實際的使用中,我們收集了檔案數最多的表,占用空間最大的表,平均檔案最小的表,并通過報表的形式方式處理,這樣就可以簡單了解到hive中表的一些資訊,另外還會收集一些job的資訊,比如job的map和reduce的數量,使用情況等,對job做詳細的分析和優化。

報表如下:

<a href="http://s3.51cto.com/wyfs02/M01/23/30/wKioL1M0ObTStkEDAAH_PwkDkP4831.jpg" target="_blank"></a>

本文轉自菜菜光 51CTO部落格,原文連結:http://blog.51cto.com/caiguangguang/1385603,如需轉載請自行聯系原作者