在做容量規劃的時候,我們需要關注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>> 0 </code><code>and</code> <code>b.</code><code>size</code> <code>> 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,如需轉載請自行聯系原作者