导航
- hive outline
- hive 小文件产生的原因
- hive 小文件的危害
- hive 小文件解决方案
- 预防小文件的产生
- 小文件已经产生
- 文件接近128m,需要谨慎的地方:
hive outline
链接
hive 小文件产生的原因
- 动态分区插入数据的时候,会产生大量的小文件
- 数据源本身就包含有大量的小文件
- 做增量导入时(比如Sqoop数据导入,一些增量insert)
hive 小文件的危害
- mr中每个小文件会启动一个MapTask进行计算处理,而每个MapTask都会对应启动一个JVM进程,造成资源严重浪费
- 占用hdfs的namenode的元数据内存
hive 小文件解决方案
分为了2个方向,一个是预防小文件的产生,另一个大量小文件已经产生,应该怎么解决
预防小文件的产生
当我们使用多个Reduce进行聚合计算时,我们并不清楚每个Reduce最终会生成的结果的数据大小,无法控制用几个Reduce来处理。hive中为我们提供了一个特殊的机制,可以自动的判断是否是小文件,如果是小文件可以自动将小文件进行合并
- 开启hive中自动合并小文件机制
- 少使用动态分区,若必须使用时,要配合distribute by rand()随机分区来使用
例如
原因:
使用distribute by rand()后,可以控制在map端随机拆分数据给reduce端
小文件已经产生
类似sqoop增量导入,还有对表的查询增量导入,这些肯定是有小文件的,还有所以要定期对小文件合并,还有就是数据源本身就包含有大量的小文件的情况,可以使用 hadoop 的 archive 将小文件归档,也可以在读取小文件时,使用hive中也提供一种输入类CombineHiveInputFormat
- har归档
使用以下命令进行归档:
对已归档的分区恢复为原文件:
- 使用CombineHiveInputFormat类
文件接近128m,需要谨慎的地方:
虽然文件都接近128m
的文件,但这个文件如果只有一个或者两个小字段
,却
有几千万的记录,此时再用一个mapTask去处理,肯定也比较耗时。这时,需要增加mapTask的并行度。要去hadoop的配置文件中去修改
mr-MapTask ReduceTask并行度决定机制 FileInputFormat切片源码解析