天天看点

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,如需转载请自行联系原作者