赞
踩
1、输入中小文件过多
主要是通过参数调节
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat :设置Inputformat。
set mapred.max.split.size=256000000:用来设置每个Map最大的输入大小。
set mapred.min.split.size.per.node=100000000:用来设置每个map中从一个node读取的最小数据量。合并的时候,会优先把一个node下的数据合并到一个split里,这样比较容易保证数据节点和计算节点本地行。
set mapred.min.split.size.per.rack=100000000:用来设置每个map中从一个机架上读取的最小数据量。如果没法保证一个split中数据尽量在一个node上,会尽量保证数据在一个机架上。
2,输出小文件过多
2.1 只有map,没有reduce的场景
对于部分简单的sql查询,可能只有map阶段,没有reduce阶段。如下面的sql:insert overwrite table t1 elect c1 from t2 ;
方法1:还是用CombineInputformat,通过让一个map处理更多的数据量,一个map的结果会写到一个输出里。
方法2:参数调节。会单独起一个mapreduce任务完成小文件合并,会额外浪费一些集群资源。
set hive.merge.mapfiles = true : 该参数默认为true,故无需设置
set hive.merge.size.per.task = 256000000 :设置每个task合并的size
set hive.merge.smallfiles.avgsize=16000000 :当map的平均输出大小小于该值时,才会启动第二轮的merge任务。
2.2 既有map,也有reduce场景
set hive.merge.mapredfiles = true :该参数默认为false,需要手动设置
set hive.merge.size.per.task = 256000000
set hive.merge.smallfiles.avgsize=16000000
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。