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 API
会为外部进程开启一个IO管道,然后数据会被传给外部进程,
这个进程会从标准输入中读取数据,然后通过标准输出来写结果数据,最后返回到Streaming API Job
注意:Streaming的执行效率通常会比对应的编写UDF
或改写InputFormat
对象的方式要低,但胜在方便,可权衡取舍