Hive如何处理大量小文件

Hive如何处理大量小文件,第1张

1.动态分区插入数据的时候,会产生大量的小文件,从而导致map数量的暴增

2.数据源本身就包含有大量的小文件

3.reduce个数越多,生成的小文件也越多

1 从HIVE角度来看的话呢,小文件越多,map的个数也会越多,每一个map都会开启一个JVM虚拟机,每个虚拟机都要创建任务,执行任务,这些流程都会造成大量的资源浪费,严重影响性能

2 在HDFS中,每个小文件约占150byte,如果小文件过多则会占用大量的内存。这样namenode内存容量严重制约了集群的发展

4.1 使用Hadoop achieve把小文件进行归档

4.2 重建表,建表时减少reduce的数量

4.3 通过参数调节,设置map/reduce的数量

4.3.1设置map输入合并小文件的相关参数:

4.3.2 设置map输出和reduce输出进行合并的相关参数:

hive优化之小文件合并

文件数目过多,会给HDFS带来压力,并且会影响处理效率,可以通过合并Map和Reduce的结果文件来消除这样的影响:

set hive.merge.mapfiles = true ##在 map only 的任务结束时合并小文件

set hive.merge.mapredfiles = false ## true 时在 MapReduce 的任务结束时合并小文件

set hive.merge.size.per.task = 256*1000*1000 ##合并文件的大小

set mapred.max.split.size=256000000##每个 Map 最大分割大小

set mapred.min.split.size.per.node=1##一个节点上 split 的最少值

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat##执行 Map 前进行小文件合并

数仓面试高频考点:

【在Hive中如何解析小文件过多问题,指定的是:处理表中数据时,有很多小文件】

| Table Parameters: | NULL | NULL |

| | bucketing_version | 2 |

| | numFiles | 1 |

| | numRows| 0 |

| | rawDataSize| 0 |

| | totalSize | 656 |

| | transient_lastDdlTime | 1631525001|

如果没有显示表的统计信息,执行如下命令,再次查看表信息

ANALYZE TABLE db_hive.emp COMPUTE STATISTICS

| Table Parameters: | NULL | NULL|

| | COLUMN_STATS_ACCURATE | {"BASIC_STATS":"true"} |

| | bucketing_version | 2 |

| | numFiles | 1 |

| | numRows| 14 |

| | rawDataSize| 643 |

| | totalSize | 656 |

| | transient_lastDdlTime | 1655113125 |

| | NULL | NULL|

第一种,将小文件合并成一个大文件

第二种,使用SparkContext中提供: wholeTextFiles 方法,专门读取小文件数据。

将每个文件作为一条KV存储在RDD中, K:文件名的绝对路径,V:文件的内容

用于解决小文件的问题,可以将多个小文件变成多个KV,自由指定分区个数


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11643757.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存