背景:最近執(zhí)行一個(gè) select count(*)喇伯,發(fā)現(xiàn)mapreduce計(jì)算分片數(shù)很慢堕义,且分片數(shù)的大小對(duì)不上
- 確定 hive 默認(rèn)開啟 map 任務(wù)前進(jìn)行合并小文件的設(shè)置:
hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
- 確認(rèn) hdfs 的 block 大小為:
set dfs.blocksize=128M
- 確認(rèn)建表存儲(chǔ)格式指定為 textfile
SET hive.exec.compress.output=true;
SET mapred.output.compress=true;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
再往里插入數(shù)據(jù),hdfs上生成單文件500M的.gz文件
- 數(shù)據(jù)的最小分割單元常潮,單位(B):
set mapred.min.split.size=1
- 數(shù)據(jù)的最大分割單元翼馆,單位(B):
set mapred.max.split.size=256000000
- 當(dāng)未開啟 map 端合并小文件且為使用壓縮表,分片規(guī)則:
minSize=mapred.min.split.size;
maxSize=mapred.max.split.size;
blockSize=dfs.blocksize;
splitSize=Math.max(minSize,Math.min(maxSize, blockSize))
- 當(dāng) 開啟 map 端合并小文件后启具,
splitSize=maxSize
- 當(dāng) 涉及到壓縮后本讥,情況又有變;gzip壓縮文件不支持分片
- 如果一張表開啟 map 前合并小文件鲁冯,且為gzip壓縮
- 現(xiàn)其 hdfs 上存在10個(gè)文件拷沸,每個(gè)文件大小 500M
- mapred.max.split.size=256000000
- 最終
number of splits:10
,因?yàn)間zip壓縮不支持分片薯演,所以一個(gè)文件不可以切分