目录
1. 并行执行
2. 严格模式
3. JVM重用
4. 压缩
(1)开启Map输出阶段压缩(snappy压缩)
(2)开启Reduce输出阶段压缩(snappy压缩)
5. 合理设置Map和Reduce个数
(1)小文件过多,减少map数
(2)小文件进行合并
(3)文件比较大、文件处理逻辑复杂,增大map数
(4)合理设置Reduce个数
开启map输出阶段压缩可以减少job中map和Reduce task间数据传输量。具体配置如下:
1. 开启hive中间传输数据压缩功能
hive (default)>set hive.exec.compress.intermediate=true;
2. 开启mapreduce中map输出压缩功能
hive (default)>set mapreduce.map.output.compress=true;
3. 设置mapreduce中map输出数据的压缩方式
hive (default)>set mapreduce.map.output.compress.codec = org.apache.hadoop.io.compress.SnappyCodec;
当Hive将输出写入到表中时,输出内容同样可以进行压缩。配置如下:
1. 开启hive最终输出数据压缩功能
hive (default)>set hive.exec.compress.output=true;
2. 开启mapreduce最终输出数据压缩
hive (default)>set mapreduce.output.fileoutputformat.compress=true;
3. 设置mapreduce最终数据输出压缩方式
hive (default)> set mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io.compress.SnappyCodec;
4. 设置mapreduce最终数据输出压缩为块压缩
hive (default)> set mapreduce.output.fileoutputformat.compress.type=BLOCK;
5. 合理设置Map和Reduce个数
(1)小文件过多,减少map数
开启的map数越多,启动和关闭JVM花费的时间也就越多;
如果一个任务有很多小文件(远小于块大小128M),每个小文件会被当做一个块,每个块用一个map任务来完成,这样小文件的逻辑处理时间远小于每一个map任务启动和初始化的时间,就会造成很大的资源浪费;并且同时可执行的map数是受限的。
这种情况就需要减少map数。
(2)小文件进行合并
第一种情况,在map执行前合并小文件,减少map数
set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
第二种情况,在map-reduce任务结束后,对生成的小文件进行合并
1. 在map-only任务结束时合并小文件,默认true
set hive.merge.mapfiles = true;
2. 在map-reduce任务结束时合并小文件,默认false
set hive.merge.mapredfiles = true;
3. 当输出文件平均大小小于该值时,启动一个独立的MR进行文件合并
set hive.merge.smallfiles.avgsize = 16777216;
4. 合并后文件大小,默认256M
set hive.merge.size.per.task = 268435456;
3)文件比较大、文件处理逻辑复杂,增大map数
例如有一个127M的文件,正常会用一个map来处理,但这个文件只有一个或两个小字段,却有几千万行记录,也就是说map的处理逻辑比较复杂,这种情况如果还用一个map去处理,肯定会比较耗时,这种就需要增加map数,使得每个map处理的数据量减少,提高执行效率。
依据Hadoop中map源码公式:
computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))=blocksize=128M
(默认切片大小blockSize是128M,minSize大小默认是1M,maxSize默认>128M)
增加mapper个数,减小切片大小:减小maxSize的值<128M,那么切片大小为maxSize;
减少mapper个数,增大切片大小:增大minSize的值>128M,那么切片大小为minSize;
eg:减小切片大小,增加切片个数,增加mapper数
set mapreduce.input.fileinputformat.split.maxsize=100;
在Hadoop的mapred-default.xml文件中修改,设置每个job的Reduce个数:-1代表使用默认值。
set mapreduce.job.reduces = -1
ps:reduce个数并非越多越好,过多启动和初始化reduce会消耗时间和资源,
另外一个reduce产生一个输出文件,如果reduce过多,会产生很多小文件;如果这些小文件作为下一个job的输入,也会出现小文件过多的问题。