天天看點

hive優化之并行執行任務

1、與Oracle并行技術一樣,hive在執行mapreduce作業時也可以執行并行查詢。針對于不同業務場景SQL語句的執行情況,有些場景下SQL的執行是需要分割成幾段去執行的,而且期間并不全是存在依賴關系。預設情況下,hive隻會一段一段的執行mapreduce任務。使用并行的好處在于可以讓伺服器可以同時去執行那些不想關的業務場景,比如:

select deptno,count(1) from emp01 group by deptno

union all

select deptno ,count(1) from emp02 group by deptno;

或者

from emp_full

insert into table emp01 partitioned(pt='01')

select empno,ename,sal,comm,hiredate,deptno

insert into table emp02 partitioned(pt='02')

select empno,ename,sal,comm,hiredate,deptno;

2、hive中控制并行執行的參數有如下幾個:

$ bin/hive -e set | grep parall

hive.exec.parallel=false

hive.exec.parallel.thread.number=8

hive.stats.map.parallelism=1

其中:hive.exec.parallel=false、hive.exec.parallel.thread.number=8分别控制着hive并行執行的特性。hive.exec.parallel=false表示預設沒有啟用并行參數,可以将其設定為true,在執行作業前進行session級别設定;hive.exec.parallel.thread.number=8表示每個SQL執行并行的線程最大值,預設是8.

例如:

set hive.exec.parallel=true;

set hive.exec.parallel.thread.number=8;

select deptno,count(1) from emp group by deptno

select deptno ,count(1) from emp group by deptno;

上面這個SQL的執行既可以啟動并行,既可以同時執行不相關任務,而不需要一步一步順序執行。

3、注意點:在hadoop上自行mapreduce任務數是有限制的,針對于叢集資源充足的情況,并行自行可以很大程度提高性能,但如果叢集資源本身就很緊張,那麼并行并不能啟動有效效果。

一個可能的hive作業設定為:

set mapred.max.split.size=100000000;

set mapred.min.split.size.per.node=100000000;

set mapred.min.split.size.per.rack=100000000;

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

set hive.exec.reducers.bytes.per.reducer=1000000000;

set hive.exec.reducers.max=256;

set hive.merge.mapfiles=true;

set hive.merge.mapredfiles =ture;

set hive.merge.size.per.task=256000000;

set hive.merge.smallfiles.avgsize=16000000;

set hive.exec.compress.intermediate=true;

set mapred.map.output.compression.codec= org.apache.hadoop.io.compress.SnappyCodec;

set hive.exec.compress.output=true;

set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;