hive map数的控制

背景:最近执行一个 select count(*),发现mapreduce计算分片数很慢,且分片数的大小对不上

  1. 确定 hive 默认开启 map 任务前进行合并小文件的设置:hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
  2. 确认 hdfs 的 block 大小为: set dfs.blocksize=128M
  3. 确认建表存储格式指定为 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文件

  1. 数据的最小分割单元,单位(B):set mapred.min.split.size=1
  2. 数据的最大分割单元,单位(B):set mapred.max.split.size=256000000
  3. 未开启 map 端合并小文件且为使用压缩表,分片规则:
minSize=mapred.min.split.size;
maxSize=mapred.max.split.size;
blockSize=dfs.blocksize;
splitSize=Math.max(minSize,Math.min(maxSize, blockSize))
  1. 开启 map 端合并小文件后splitSize=maxSize
  2. 涉及到压缩后,情况又有变;gzip压缩文件不支持分片
  • 如果一张表开启 map 前合并小文件,且为gzip压缩
  • 现其 hdfs 上存在10个文件,每个文件大小 500M
  • mapred.max.split.size=256000000
  • 最终 number of splits:10,因为gzip压缩不支持分片,所以一个文件不可以切分

你可能感兴趣的:(hive map数的控制)