hive中表状态数据的获取

  在做容量规划的时候,我们需要关注hive中表的占用空间大小,文件数量,平均文件大小,已及存储格式,虽然在hive中也有statistcs的功能,但是值并准确(相比mysql的show table status相差很多)

  我们可以通过一些简单地方法去拿到这个值,比如通过hadoop fs -du 来获取表占用的空间大小,通过hadoop fs -ls -R |wc -l获取表的文件数量,然后定期取值并load到数据库中。

  在元数据库中,通过创建view来获取数据库,hdfs路径,表类型,存储格式等信息

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

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

  数据如下:

  select * from table_location_type limit 5;

  | db_table                         | db_location                                             | type          | IN_FOR            |

  | xxxx         | /bip/hive_warehouse/cdnlog.db/dnion_log_origin          | MANAGED_TABLE | TextInputFormat   |

  | xxxx     | /bip/hive_warehouse/cdnlog.db/chinacache_log_origin     | MANAGED_TABLE | TextInputFormat   |

  | xxxx | /bip/hive_warehouse/cdnlog.db/chinanetcenter_log_origin | MANAGED_TABLE | TextInputFormat   |

  | xxxxx                 | /bip/hive_warehouse/cdnlog.db/dnion_log                 | MANAGED_TABLE | RCFileInputFormat |

  | xxxx        | /bip/hive_warehouse/cdnlog.db/chinanetcenter_log        | MANAGED_TABLE | RCFileInputFormat |

  然后通过和我们自己收集的信息做join就可以获取相关的数据:

  比如文件数量最多top 20

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

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

  and b.dt='20140325' and c.size > 0 and b.size > 1000000000 order by c.size+0 desc limit 20;

  在实际的使用中,我们收集了文件数最多的表,占用空间最大的表,平均文件最小的表,并通过报表的形式方式处理,这样就可以简单了解到hive中表的一些信息,另外还会收集一些job的信息,比如job的map和reduce的数量,使用情况等,对job做详细的分析和优化。

 

发表评论

邮箱地址不会被公开。 必填项已用*标注