总所周知,hadoop namenode会对hdfs上的每个文件在内存中都会维护一份元数据信息。如果集群产生大量小文件而不处理,长期下去,必将给namenode造成巨大压力。同时,对于hive,spark计算时,小文件意味着需要更多的task和资源,影响计算速度,同样也可能将节点弄挂掉。
因此,小文件问题,需要引起重视,在日常开发和日常监控中需要额外注意。
- Hive on Spark
关闭hive.merge.sparkfiles,shuffle会产生大量小文件,因此写入hdfs存在小文件问题。
开启hive.merge.sparkfiles后,开启后会额外开启一个Spark Merge File Work阶段(是否开启取决于hive.merge.smallfiles.avgsize的大小)。
在hive.merge.sparkFiles=true的情况下,如果merge file相关参数设置合理是不需要担心小文件问题的。
我们都知道,mr控制map,reduce数量及合并小文件大小的相关参数,其实hive on spark同时适用。
-- 控制map阶段的并行度:
-- 每个Map最大输入大小,决定合并后的文件数
set mapred.max.split.size=268435456;
-- 一个节点上split的至少的大小 ,决定了多个data node上的文件是否需要合并
set mapred.min.split.size.per.node=268435456;
-- 一个交换机下split的至少的大小,决定了多个交换机上的文件是否需要合并
set mapred.min.split.size.per.rack=268435456;
-- 执行Map前进行小文件合并; 在map执行前合并小文件,减少map数
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
-- 控制shuffle的并行度:
-- 每个Reduce处理的数据量
set hive.exec.reducers.bytes.per.reducer=268435456;
-- 最大reduce数量
set hive.exec.reducers.max=1099;
-- 控制最终输出hdfs的单个文件大小,影响merge阶段的并行度(hive.merge.sparkFiles=true生效):
-- 合并后每个文件的大小
set hive.merge.size.per.task=268435456;
-- 平均文件大小,是决定是否执行merge阶段 *** 作的阈值,当输出文件的平均大小小于该值时,启动一个独立的任务进行文件merge
set hive.merge.smallfiles.avgsize=134217728;
我们只需要合理控制上述参数,针对于Hive on Spark的任务就能合理的控制任务的并行度以及写入到hdfs的文件大小了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)