赞
踩
hive通过将查询划分成一个或多个MapReduce任务达到并行处理的目的。每个任务都可能具有多个mapper和reducer任务,其中至少有一些是可以并行执行的。确定最佳的mapper个数和reducer个数取决于多个变量,例如输入的数据量大小以及对这些数据执行的操作类型等。保持平衡性是很有必要的,对于Spark/Hadoop这样的大数据系统来讲,数据量大并不可怕,可怕的是数据倾斜,每个节点处理的运算不均衡。如果有太多的mapper或reducer任务,就会导致启动阶段、调度和运行job过程中产生过多的开销;而如果设置的数量太少,那就有可能没充分利用好集群内在并行性。
千万不要以为一条hive sql语句只会产生一个application哦!!!
不多bb,上硬货:
1、Hive.fetch.task.conversion 默认为minimal,修改为more
fetch task 为执行hive时,不用执行MapReduce,如select * from emp; 修改当前会话: set hive.fetch.task.conversion=more; 执行SELECT id, money FROM m limit 10; 不走mr |
2、并行执行
当一个sql中有多个job时候,且这多个job之间没有依赖,则可以让顺序执行变为并行执行(一般为用到union all )
// 开启任务并行执行 set hive.exec.parallel=true; // 同一个sql允许并行任务的最大线程数 set hive.exec.parallel.thread.number=8; |
3、jvm 重用
JVM重用对hive的性能具有非常大的 影响,特别是对于很难避免小文件的场景或者task特别多的场景,这类场景大多数执行时间都很短。jvm的启动过程可能会造成相当大的开销,尤其是执行的job包含有成千上万个task任务的情况。
set mapred.job.reuse.jvm.num.tasks=10; |
JVM的一个缺点是,开启JVM重用将会一直占用使用到的task插槽,以便进行重用,直到任务完成后才能释放。如果某个“不平衡“的job中有几个 reduce task 执行的时间要比其他reduce task消耗的时间多得多的话,那么保留的插槽就会一直空闲着却无法被其他的job使用,直到所有的task都结束了才会释放。
4、设置reduce的数目
reduce个数的设定极大影响任务执行效率,不指定reduce个数的情况下,Hive会猜测确定一个reduce个数,基于以下两个设定: hive.exec.reducers.bytes.per.reducer(每个reduce任务处理的数据量,在Hive 0.14.0版本之前默认值是1G(1,000,000,000);而从Hive 0.14.0开始,默认值变成了256M(256,000,000) ) hive.exec.reducers.max(每个任务最大的reduce数,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。