背景:最近执行一个 select count(*),发现mapreduce计算分片数很慢,且分片数的大小对不上
- 确定 hive 默认开启 map 任务前进行合并小文件的设置:
hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
- 确认 hdfs 的 block 大小为:
set dfs.blocksize=128M
- 确认建表存储格式指定为 textfile
SET hive.exec.compress.output=true;
SET mapred.output.compress=true;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
再往里插入数据,hdfs上生成单文件500M的.gz文件
- 数据的最小分割单元,单位(B):
set mapred.min.split.size=1
- 数据的最大分割单元,单位(B):
set mapred.max.split.size=256000000
- 当未开启 map 端合并小文件且为使用压缩表,分片规则:
minSize=mapred.min.split.size;
maxSize=mapred.max.split.size;
blockSize=dfs.blocksize;
splitSize=Math.max(minSize,Math.min(maxSize, blockSize))
- 当 开启 map 端合并小文件后,
splitSize=maxSize
- 当 涉及到压缩后,情况又有变;gzip压缩文件不支持分片
- 如果一张表开启 map 前合并小文件,且为gzip压缩
- 现其 hdfs 上存在10个文件,每个文件大小 500M
- mapred.max.split.size=256000000
- 最终
number of splits:10
,因为gzip压缩不支持分片,所以一个文件不可以切分
网友评论