1. map阶段输出数据压缩 ,在这个阶段,优先选择一个低CPU开销的算法。
set hive.exec.compress.intermediate=true set mapred.map.output.compression.codec= org.apache.hadoop.io.compress.SnappyCodec set mapred.map.output.compression.codec=com.hadoop.compression.lzo.LzoCodec;
2. 对最终输出结果压缩
set hive.exec.compress.output=true set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec当然,也可以在hive建表时指定表的文件格式和压缩编码
设置map输入的小文件合并
set mapred.max.split.size=256000000; //一个节点上split的至少的大小(这个值决定了多个DataNode上的文件是否需要合并) set mapred.min.split.size.per.node=100000000; //一个交换机下split的至少的大小(这个值决定了多个交换机上的文件是否需要合并) set mapred.min.split.size.per.rack=100000000; //执行Map前进行小文件合并 set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; #设置map输出和reduce输出进行合并的相关参数: //设置map端输出进行合并,默认为true set hive.merge.mapfiles = true //设置reduce端输出进行合并,默认为false set hive.merge.mapredfiles = true //设置合并文件的大小 set hive.merge.size.per.task = 256*1000*1000 //当输出文件的平均大小小于该值时,启动一个独立的MapReduce任务进行文件merge。 set hive.merge.smallfiles.avgsize=16000000 set hive.auto.convert.sortmerge.join=true; set hive.optimize.bucketmapjoin = true; set hive.optimize.bucketmapjoin.sortedmerge = true; set hive.auto.convert.sortmerge.join.noconditionaltask=true; // 让可以不走mapreduce任务的,就不走mapreduce任务 hive> set hive.fetch.task.conversion=more; // 开启任务并行执行 set hive.exec.parallel=true; // 解释:当一个sql中有多个job时候,且这多个job之间没有依赖, //则可以让顺序执行变为并行执行(一般为用到union all的时候) // 同一个sql允许并行任务的最大线程数 set hive.exec.parallel.thread.number=8; // 设置jvm重用 // JVM重用对hive的性能具有非常大的 影响,特别是对于很难避免小文件的场景或者task特别多的场景, //这类场景大多数执行时间都很短。jvm的启动过程可能会造成相当大的开销, //尤其是执行的job包含有成千上万个task任务的情况。 set mapred.job.reuse.jvm.num.tasks=10; // 合理设置reduce的数目 // 方法1:调整每个reduce所接受的数据量大小 set hive.exec.reducers.bytes.per.reducer=500000000; (500M) // 方法2:直接设置reduce数量 set mapred.reduce.tasks = 20 // map端聚合,降低传给reduce的数据量 set hive.map.aggr=true // 开启hive内置的数倾优化机制 set hive.groupby.skewindata=true



