markdown Hive技巧,案例归集

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown 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`对象的方式要低,但胜在方便,可权衡取舍

以上是关于markdown Hive技巧,案例归集的主要内容,如果未能解决你的问题,请参考以下文章

markdown Hive常用命令

批量自动归集

HIVE 统计函数一些小技巧

hive进阶 技巧

Hive查询技巧

Hive查询技巧