Hive on Spark 小文件问题

 总所周知,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的文件大小了。

你可能感兴趣的:(hive,hive,hadoop,spark)