cqc3073
1/29/2018 - 8:54 AM

Hive 技巧、案例 归集

Hive 技巧、案例 归集

Hive 技巧、案例 归集

创建的文件数超过hive的限制

hive使用hive.exec.max.created.files参数来控制一个SQL允许的文件创建数量,默认是100000。
比如有这么一条sql

insert overwrite into table new_tmp partition(ds) 
  select * from tmp

其中,tmp表有500g(为方便计算,1g=1000m),根据ds来可有50个分区,意味着一个mapper就会分别往50个分区文件夹下生成一个文件, 当mapper的数量超过2000个,就会使SQL执行失败。最简单的方式就是加大hive.exec.max.created.files限制, 不过需要考量下单个文件的大小。本例中假如刚好100000个文件,那么500g/100000的话,每个文件才5m, 这就浪费了许多的空间。 那么采取的优化办法就是将相同分区的数据放到同一个reduce中执行,50个分区就产生50个reduce产生50个文件

insert overwrite into table new_tmp partition(ds) 
  select * from tmp
  distribute by ds

这样就能极大提升空间利用率,缺点就是:1.增加了reduce环节,提高的执行时间。 2.不同分区的数据可能会比较不均衡,加长单个reduce的执行时间,甚至让内存溢出。

权衡空间和时间,可以进一步优化如下:

set hive.exec.reducers.bytes.per.reducer=5000000000;
insert overwrite into table new_tmp partition(ds) 
  select * from tmp
  distribute by rand()

控制每个reduce的处理数据大小为5g,那么将产生100个reduce,产生100*50个文件

利用Hive Streaming对数据进行转换

Hive Streaming API会为外部进程开启一个IO管道,然后数据会被传给外部进程, 这个进程会从标准输入中读取数据,然后通过标准输出来写结果数据,最后返回到Streaming API Job

注意:Streaming的执行效率通常会比对应的编写UDF或改写InputFormat对象的方式要低,但胜在方便,可权衡取舍