Hive調(diào)優(yōu)的示例分析

小編給大家分享一下Hive調(diào)優(yōu)的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

我們提供的服務(wù)有:成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、金沙ssl等。為上千余家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢(xún)和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的金沙網(wǎng)站制作公司

1、Fetch抓取

       Fetch抓取是指,Hive中對(duì)某些情況的查詢(xún)可以不必使用MapReduce計(jì)算。例如:SELECT * FROM emp;在這種情況下,Hive可以簡(jiǎn)單地讀取emp對(duì)應(yīng)的存儲(chǔ)目錄下的文件,然后輸出查詢(xún)結(jié)果到控制臺(tái)。

       在hive-default.xml.template文件中hive.fetch.task.conversion默認(rèn)是more,老版本hive默認(rèn)是minimal,該屬性修改為more以后,在全局查找、字段查找、limit查找等都不走mapreduce。

<property>
    <name>hive.fetch.task.conversion</name>
    <value>more</value>
    <description>
      Expects one of [none, minimal, more].
      Some select queries can be converted to single FETCH task minimizing latency.
      Currently the query should be single sourced not having any subquery and should not have any aggregations or distincts (which incurs RS), lateral views and joins.
      0. none : disable hive.fetch.task.conversion
      1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only
      2. more  : SELECT, FILTER, LIMIT only (support TABLESAMPLE and virtual columns)
    </description>
</property>

案例實(shí)操:

(1)把hive.fetch.task.conversion設(shè)置成none,然后執(zhí)行查詢(xún)語(yǔ)句,都會(huì)執(zhí)行mapreduce程序。
	hive (default)> set hive.fetch.task.conversion=none;
	hive (default)> select * from emp;
	hive (default)> select ename from emp;
	hive (default)> select ename from emp limit 3;

(2)把hive.fetch.task.conversion設(shè)置成more,然后執(zhí)行查詢(xún)語(yǔ)句,如下查詢(xún)方式都不會(huì)執(zhí)行mapreduce程序。
	hive (default)> set hive.fetch.task.conversion=more;
	hive (default)> select * from emp;
	hive (default)> select ename from emp;
	hive (default)> select ename from emp limit 3;

2、本地模式

       大多數(shù)的Hadoop Job是需要Hadoop提供的完整的可擴(kuò)展性來(lái)處理大數(shù)據(jù)集的。不過(guò),有時(shí)Hive的輸入數(shù)據(jù)量是非常小的。在這種情況下,為查詢(xún)觸發(fā)執(zhí)行任務(wù)消耗的時(shí)間可能會(huì)比實(shí)際job的執(zhí)行時(shí)間要多的多。對(duì)于大多數(shù)這種情況,Hive可以通過(guò)本地模式在單臺(tái)機(jī)器上處理所有的任務(wù)。對(duì)于小數(shù)據(jù)集,執(zhí)行時(shí)間可以明顯被縮短。

       用戶可以通過(guò)設(shè)置hive.exec.mode.local.auto的值為true,來(lái)讓Hive在適當(dāng)?shù)臅r(shí)候自動(dòng)啟動(dòng)這個(gè)優(yōu)化。

//開(kāi)啟本地mr
	set hive.exec.mode.local.auto=true;  

//設(shè)置local mr的最大輸入數(shù)據(jù)量,當(dāng)輸入數(shù)據(jù)量小于這個(gè)值時(shí)采用local  mr的方式
--默認(rèn)為134217728,即128M
	set hive.exec.mode.local.auto.inputbytes.max=50000000;

//設(shè)置local mr的最大輸入文件個(gè)數(shù),當(dāng)輸入文件個(gè)數(shù)小于這個(gè)值時(shí)采用local mr的方式
--默認(rèn)為4
	set hive.exec.mode.local.auto.input.files.max=10;

案例實(shí)操:

(1)開(kāi)啟本地模式,并執(zhí)行查詢(xún)語(yǔ)句
	hive (default)> set hive.exec.mode.local.auto=true; 
	hive (default)> select * from emp cluster by deptno;
	Time taken: 1.328 seconds, Fetched: 14 row(s)

(2)關(guān)閉本地模式,并執(zhí)行查詢(xún)語(yǔ)句
	hive (default)> set hive.exec.mode.local.auto=false; 
	hive (default)> select * from emp cluster by deptno;
	Time taken: 20.09 seconds, Fetched: 14 row(s)

3、表的優(yōu)化

3.1、小表、大表join

       將key相對(duì)分散,并且數(shù)據(jù)量小的表放在join的左邊,這樣可以有效減少內(nèi)存溢出錯(cuò)誤發(fā)生的幾率;再進(jìn)一步,可以使用map join讓小的維度表(1000條以下的記錄條數(shù))先進(jìn)內(nèi)存。在map端完成reduce。

       實(shí)際測(cè)試發(fā)現(xiàn):新版的hive已經(jīng)對(duì)小表JOIN大表和大表JOIN小表進(jìn)行了優(yōu)化。小表放在左邊和右邊已經(jīng)沒(méi)有明顯區(qū)別。

3.2、大表join大表

1) 空key過(guò)濾

       有時(shí)join超時(shí)是因?yàn)槟承﹌ey對(duì)應(yīng)的數(shù)據(jù)太多,而相同key對(duì)應(yīng)的數(shù)據(jù)都會(huì)發(fā)送到相同的reducer上,從而導(dǎo)致內(nèi)存不夠。此時(shí)我們應(yīng)該仔細(xì)分析這些異常的key,很多情況下,這些key對(duì)應(yīng)的數(shù)據(jù)是異常數(shù)據(jù),我們需要在SQL語(yǔ)句中進(jìn)行過(guò)濾。例如key對(duì)應(yīng)的字段為空,操作如下:

案例實(shí)操:

(1)配置歷史服務(wù)器
配置mapred-site.xml
	<property>
		<name>mapreduce.jobhistory.address</name>
		<value>hadoop102:10020</value>
	</property>
	<property>
		<name>mapreduce.jobhistory.webapp.address</name>
		<value>hadoop102:19888</value>
	</property>
啟動(dòng)歷史服務(wù)器
sbin/mr-jobhistory-daemon.sh start historyserver
查看jobhistory
http://hadoop102:19888/jobhistory

(2)創(chuàng)建空id表
	// 創(chuàng)建空id表
	create table nullidtable(
	id bigint,
	t bigint,
	uid string,
	keyword string,
	url_rank int,
	click_num int,
	click_url string
	)
	row format delimited fields terminated by '\t';

(3)加載空id數(shù)據(jù)到空id表中
	load data local inpath '/opt/module/hive/datas/nullid' into table nullidtable;

(4)測(cè)試不過(guò)濾空id
	insert overwrite table jointable select n.* from nullidtable n
	left join bigtable o on n.id = o.id;
	Time taken: 42.038 seconds
	Time taken: 37.284 seconds

(5)測(cè)試過(guò)濾空id
	insert overwrite table jointable select n.* from (
		select *
		from nullidtable 
		where id is not null
		) n  
		left join bigtable o on n.id = o.id;
	Time taken: 31.725 seconds
	Time taken: 28.876 seconds

2) 空key轉(zhuǎn)換

       有時(shí)雖然某個(gè)key為空對(duì)應(yīng)的數(shù)據(jù)很多,但是相應(yīng)的數(shù)據(jù)不是異常數(shù)據(jù),必須要包含在join的結(jié)果中,此時(shí)我們可以表a中key為空的字段賦一個(gè)隨機(jī)的值,使得數(shù)據(jù)隨機(jī)均勻地分布到不同的reducer上。例如:

案例實(shí)操:

不隨機(jī)分布空null值:
(1)設(shè)置5個(gè)reduce個(gè)數(shù)
	set mapreduce.job.reduces = 5;

(2)JOIN兩張表
	insert overwrite table jointable
	select n.* from nullidtable n left join bigtable b 
	on n.id = b.id;
結(jié)果:如下圖所示,可以看出來(lái),出現(xiàn)了數(shù)據(jù)傾斜,某些reducer的資源消耗遠(yuǎn)大于其他reducer。

Hive調(diào)優(yōu)的示例分析

隨機(jī)分布空null值
(1)設(shè)置5個(gè)reduce個(gè)數(shù)
	set mapreduce.job.reduces = 5;
(2)JOIN兩張表
	insert overwrite table jointable
	select n.* from nullidtable n full join bigtable o 
	on nvl(n.id,rand()) = o.id;
結(jié)果:如下圖所示,可以看出來(lái),消除了數(shù)據(jù)傾斜,負(fù)載均衡reducer的資源消耗

Hive調(diào)優(yōu)的示例分析

3.3、MapJoin

       如果不指定MapJoin或者不符合MapJoin的條件,那么Hive解析器會(huì)將Join操作轉(zhuǎn)換成Common Join,即:在Reduce階段完成join。容易發(fā)生數(shù)據(jù)傾斜。可以用MapJoin把小表全部加載到內(nèi)存在map端進(jìn)行join,避免reducer處理。

1) 開(kāi)啟mapjoin參數(shù)設(shè)置

(1)設(shè)置自動(dòng)選擇Mapjoin
	set hive.auto.convert.join = true; 默認(rèn)為true

(2)大表小表的閾值設(shè)置(默認(rèn)25M以下認(rèn)為是小表):
	set hive.mapjoin.smalltable.filesize=25000000;

2)MapJoin‘工作機(jī)制

Hive調(diào)優(yōu)的示例分析

3)案例實(shí)操:

(1)開(kāi)啟Mapjoin功能
	set hive.auto.convert.join = true; 默認(rèn)為true

(2)執(zhí)行小表JOIN大表語(yǔ)句
注意:此時(shí)小表作為主表,所有數(shù)據(jù)都要寫(xiě)出去,因此此時(shí)會(huì)走reduce,mapjoin失效
	insert overwrite table jointable
	select b.id, b.t, b.uid, b.keyword, b.url_rank, b.click_num, b.click_url
	from smalltable s
	left join bigtable  b
	on s.id = b.id;
Time taken: 24.594 seconds

(3)執(zhí)行大表JOIN小表語(yǔ)句
	insert overwrite table jointable
	select b.id, b.t, b.uid, b.keyword, b.url_rank, b.click_num, b.click_url
	from bigtable  b
	left join smalltable  s
	on s.id = b.id;
Time taken: 24.315 seconds

3.4、Group By

       默認(rèn)情況下,Map階段同一Key數(shù)據(jù)分發(fā)給一個(gè)reduce,當(dāng)一個(gè)key數(shù)據(jù)過(guò)大時(shí)就傾斜了。

Hive調(diào)優(yōu)的示例分析

       并不是所有的聚合操作都需要在Reduce端完成,很多聚合操作都可以先在Map端進(jìn)行部分聚合,最后在Reduce端得出最終結(jié)果。

1)開(kāi)啟Map端聚合參數(shù)設(shè)置

(1)是否在Map端進(jìn)行聚合,默認(rèn)為T(mén)rue
	set hive.map.aggr = true

(2)在Map端進(jìn)行聚合操作的條目數(shù)目
	set hive.groupby.mapaggr.checkinterval = 100000

(3)有數(shù)據(jù)傾斜的時(shí)候進(jìn)行負(fù)載均衡(默認(rèn)是false)
	set hive.groupby.skewindata = true

注意:
    當(dāng)選項(xiàng)設(shè)定為 true,生成的查詢(xún)計(jì)劃會(huì)有兩個(gè)MR Job。第一個(gè)MR Job中,Map的輸出結(jié)果會(huì)隨機(jī)分布
到Reduce中,每個(gè)Reduce做部分聚合操作,并輸出結(jié)果,這樣處理的結(jié)果是相同的Group By Key有可能被
分發(fā)到不同的Reduce中,從而達(dá)到負(fù)載均衡的目的;第二個(gè)MR Job再根據(jù)預(yù)處理的數(shù)據(jù)結(jié)果按照Group By
Key分布到Reduce中(這個(gè)過(guò)程可以保證相同的Group By Key被分布到同一個(gè)Reduce中),最后完成最終
的聚合操作。

案例實(shí)操:

hive (default)> select deptno from emp group by deptno;
Stage-Stage-1: Map: 1  Reduce: 5   Cumulative CPU: 23.68 sec   HDFS Read: 19987 HDFS Write: 9 SUCCESS
Total MapReduce CPU Time Spent: 23 seconds 680 msec

OK
deptno
10
20
30
-------------------------------------------------------------------------------------
優(yōu)化以后
hive (default)> set hive.groupby.skewindata = true;
hive (default)> select deptno from emp group by deptno;
Stage-Stage-1: Map: 1  Reduce: 5   Cumulative CPU: 28.53 sec   HDFS Read: 18209 HDFS Write: 534 SUCCESS
Stage-Stage-2: Map: 1  Reduce: 5   Cumulative CPU: 38.32 sec   HDFS Read: 15014 HDFS Write: 9 SUCCESS
Total MapReduce CPU Time Spent: 1 minutes 6 seconds 850 msec

OK
deptno
10
20
30

3.5、Count(Distinct) 去重統(tǒng)計(jì)

       數(shù)據(jù)量小的時(shí)候無(wú)所謂,數(shù)據(jù)量大的情況下,由于COUNT DISTINCT操作需要用一個(gè)Reduce Task來(lái)完成,這一個(gè)Reduce需要處理的數(shù)據(jù)量太大,就會(huì)導(dǎo)致整個(gè)Job很難完成,一般COUNT DISTINCT使用先GROUP BY再COUNT的方式替換,但是需要注意group by造成的數(shù)據(jù)傾斜問(wèn)題.

案例實(shí)操:

(1)創(chuàng)建一張大表
	create table bigtable(
	id bigint, time bigint, uid string, keyword
	string, url_rank int, click_num int, click_url string
	)
	row format delimited fields terminated by '\t';

(2)加載數(shù)據(jù)
	load data local inpath '/opt/module/datas/bigtable' into table bigtable;

(3)設(shè)置5個(gè)reduce個(gè)數(shù)
	set mapreduce.job.reduces = 5;

(4)執(zhí)行去重id查詢(xún)
	select count(distinct id) from bigtable;
	Stage-Stage-1: Map: 1  Reduce: 1   Cumulative CPU: 7.12 sec   HDFS Read: 120741990 HDFS Write: 7 SUCCESS
	Total MapReduce CPU Time Spent: 7 seconds 120 msec

	OK
	c0
	99947
	Time taken: 23.607 seconds, Fetched: 1 row(s)

(5)采用GROUP by去重id
	hive (default)> select count(id) from (select id from bigtable group by id) a;
	Stage-Stage-1: Map: 1  Reduce: 5   Cumulative CPU: 17.53 sec   HDFS Read: 120752703 HDFS Write: 580 SUCCESS
	Stage-Stage-2: Map: 1  Reduce: 1   Cumulative CPU: 4.29 sec2   HDFS Read: 9409 HDFS Write: 7 SUCCESS
	Total MapReduce CPU Time Spent: 21 seconds 820 msec

	OK
	_c0
	99947
	Time taken: 50.795 seconds, Fetched: 1 row(s)


值得說(shuō)的是:
	雖然會(huì)多用一個(gè)Job來(lái)完成,但在數(shù)據(jù)量大的情況下,這個(gè)絕對(duì)是值得的。

3.6、笛卡爾積

       盡量避免笛卡爾積,join的時(shí)候不加on條件,或者無(wú)效的on條件,Hive只能使用1個(gè)reducer來(lái)完成笛卡爾積。

3.7、行列過(guò)濾

       列處理:在SELECT中,只拿需要的列,如果有,盡量使用分區(qū)過(guò)濾,少用SELECT *。

       行處理:在分區(qū)剪裁中,當(dāng)使用外關(guān)聯(lián)時(shí),如果將副表的過(guò)濾條件寫(xiě)在Where后面,那么就會(huì)先全表關(guān)聯(lián),之后再過(guò)濾,比如:

案例實(shí)操:

1)測(cè)試先關(guān)聯(lián)兩張表,再用where條件過(guò)濾
	select o.id 
	from bigtable b join bigtable o 
	on o.id = b.id
	where o.id <= 10;
	Time taken: 34.406 seconds, Fetched: 100 row(s)

2)通過(guò)子查詢(xún)后,再關(guān)聯(lián)表
	select b.id 
	from bigtable b join (
		select id 
		from bigtable 
		where id <= 10 
	) o
	on b.id = o.id;
	Time taken: 30.058 seconds, Fetched: 100 row(s)

3.8、分區(qū)

       詳見(jiàn)04Hive學(xué)習(xí)之路(DML數(shù)據(jù)操作、分區(qū)表和分桶表)---2.1、分區(qū)表

3.9、分桶

       詳見(jiàn)04Hive學(xué)習(xí)之路(DML數(shù)據(jù)操作、分區(qū)表和分桶表)---2.2、分桶表

4、合理設(shè)置Map及Reduce數(shù)

1)通常情況下,作業(yè)會(huì)通過(guò)input的目錄產(chǎn)生一個(gè)或者多個(gè)map任務(wù)。
主要的決定因素有:input的文件總個(gè)數(shù),input的文件大小,集群設(shè)置的文件塊大小。

2)是不是map數(shù)越多越好?
     答案是否定的。如果一個(gè)任務(wù)有很多小文件(遠(yuǎn)遠(yuǎn)小于塊大小128m),則每個(gè)小文件也會(huì)被當(dāng)做一個(gè)
塊,用一個(gè)map任務(wù)來(lái)完成,而一個(gè)map任務(wù)啟動(dòng)和初始化的時(shí)間遠(yuǎn)遠(yuǎn)大于邏輯處理的時(shí)間,就會(huì)造成很大的
資源浪費(fèi)。而且,同時(shí)可執(zhí)行的map數(shù)是受限的。

3)是不是保證每個(gè)map處理接近128m的文件塊,就高枕無(wú)憂了?
     答案也是不一定。比如有一個(gè)127m的文件,正常會(huì)用一個(gè)map去完成,但這個(gè)文件只有一個(gè)或者兩個(gè)小
字段,卻有幾千萬(wàn)的記錄,如果map處理的邏輯比較復(fù)雜,用一個(gè)map任務(wù)去做,肯定也比較耗時(shí)。

       針對(duì)上面的問(wèn)題2和3,我們需要采取兩種方式來(lái)解決:即減少map數(shù)和增加map數(shù)。

4.1、復(fù)雜文件增加Map數(shù)
   當(dāng)input的文件都很大,任務(wù)邏輯復(fù)雜,map執(zhí)行非常慢的時(shí)候,可以考慮增加Map數(shù),來(lái)使得每個(gè)map處
理的數(shù)據(jù)量減少,從而提高任務(wù)的執(zhí)行效率。

增加map的方法為:根據(jù)
      computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))=blocksize=128M
公式,調(diào)整maxSize最大值。讓maxSize最大值低于blocksize就可以增加map的個(gè)數(shù)。

案例實(shí)操:

1)執(zhí)行查詢(xún)
	hive (default)> select count(*) from emp;
	Hadoop job information for Stage-1: number of mappers: 1;number of reducers: 1
	
2)設(shè)置最大切片值為100個(gè)字節(jié)
	hive (default)> set mapreduce.input.fileinputformat.split.maxsize=100;
	hive (default)> select count(*) from emp;
	Hadoop job information for Stage-1: number of mappers: 6;number of reducers: 1
4.2、小文件進(jìn)行合并
1)在map執(zhí)行前合并小文件,減少map數(shù):CombineHiveInputFormat具有對(duì)小文件進(jìn)行合并的功能
(系統(tǒng)默認(rèn)的格式)。HiveInputFormat沒(méi)有對(duì)小文件合并功能。
	set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

2)在Map-Reduce的任務(wù)結(jié)束時(shí)合并小文件的設(shè)置:
	//在map-only任務(wù)結(jié)束時(shí)合并小文件,默認(rèn)true
	SET hive.merge.mapfiles = true;

	//在map-reduce任務(wù)結(jié)束時(shí)合并小文件,默認(rèn)false
	SET hive.merge.mapredfiles = true;

	//合并文件的大小,默認(rèn)256M
	SET hive.merge.size.per.task = 268435456;

	//當(dāng)輸出文件的平均大小小于該值時(shí),啟動(dòng)一個(gè)獨(dú)立的map-reduce任務(wù)進(jìn)行文件merge
	SET hive.merge.smallfiles.avgsize = 16777216;
4.3、合理設(shè)置Reduce數(shù)
1)調(diào)整reduce個(gè)數(shù)方法一
	①每個(gè)Reduce處理的數(shù)據(jù)量默認(rèn)是256MB
	--hive.exec.reducers.bytes.per.reducer=256000000

	②每個(gè)任務(wù)最大的reduce數(shù),默認(rèn)為1009
	--hive.exec.reducers.max=1009

	③計(jì)算reducer數(shù)的公式
	--N=min(參數(shù)2,總輸入數(shù)據(jù)量/參數(shù)1)

2)調(diào)整reduce個(gè)數(shù)方法二
在hadoop的mapred-default.xml文件中修改
	//設(shè)置每個(gè)job的Reduce個(gè)數(shù)
	set mapreduce.job.reduces = 15;

3)reduce個(gè)數(shù)并不是越多越好
(1)過(guò)多的啟動(dòng)和初始化reduce也會(huì)消耗時(shí)間和資源;
(2)另外,有多少個(gè)reduce,就會(huì)有多少個(gè)輸出文件,如果生成了很多個(gè)小文件,那么如果這些小文件作
為下一個(gè)任務(wù)的輸入,則也會(huì)出現(xiàn)小文件過(guò)多的問(wèn)題;


注意:在設(shè)置reduce個(gè)數(shù)的時(shí)候也需要考慮這兩個(gè)原則:
--處理大數(shù)據(jù)量利用合適的reduce數(shù);
--使單個(gè)reduce任務(wù)處理數(shù)據(jù)量大小要合適;

5、并行執(zhí)行

       Hive會(huì)將一個(gè)查詢(xún)轉(zhuǎn)化成一個(gè)或者多個(gè)階段。這樣的階段可以是MapReduce階段、抽樣階段、合并階段、limit階段?;蛘逪ive執(zhí)行過(guò)程中可能需要的其他階段。默認(rèn)情況下,Hive一次只會(huì)執(zhí)行一個(gè)階段。不過(guò),某個(gè)特定的job可能包含眾多的階段,而這些階段可能并非完全互相依賴(lài)的,也就是說(shuō)有些階段是可以并行執(zhí)行的,這樣可能使得整個(gè)job的執(zhí)行時(shí)間縮短。不過(guò),如果有更多的階段可以并行執(zhí)行,那么job可能就越快完成。

       通過(guò)設(shè)置參數(shù)hive.exec.parallel值為true,就可以開(kāi)啟并發(fā)執(zhí)行。不過(guò),在共享集群中,需要注意下,如果job中并行階段增多,那么集群利用率就會(huì)增加。

set hive.exec.parallel=true;              //打開(kāi)任務(wù)并行執(zhí)行,默認(rèn)為false
set hive.exec.parallel.thread.number=16; //同一個(gè)sql允許最大并行度,默認(rèn)為8。

       當(dāng)然,得是在系統(tǒng)資源比較空閑的時(shí)候才有優(yōu)勢(shì),否則,沒(méi)資源,并行也起不來(lái)。

6、嚴(yán)格模式

Hive可以通過(guò)設(shè)置防止一些危險(xiǎn)操作:
1)分區(qū)表不使用分區(qū)過(guò)濾
    將hive.strict.checks.no.partition.filter設(shè)置為true時(shí),對(duì)于分區(qū)表,除非where語(yǔ)句中含有
分區(qū)字段過(guò)濾條件來(lái)限制范圍,否則不允許執(zhí)行。換句話說(shuō),就是用戶不允許掃描所有分區(qū)。進(jìn)行這個(gè)限制
的原因是,通常分區(qū)表都擁有非常大的數(shù)據(jù)集,而且數(shù)據(jù)增加迅速。沒(méi)有進(jìn)行分區(qū)限制的查詢(xún)可能會(huì)消耗令
人不可接受的巨大資源來(lái)處理這個(gè)表。

2)使用order by沒(méi)有l(wèi)imit過(guò)濾
    將hive.strict.checks.orderby.no.limit設(shè)置為true時(shí),對(duì)于使用了order by語(yǔ)句的查詢(xún),要求
必須使用limit語(yǔ)句。因?yàn)閛rder by為了執(zhí)行排序過(guò)程會(huì)將所有的結(jié)果數(shù)據(jù)分發(fā)到同一個(gè)Reducer中進(jìn)行處
理,強(qiáng)制要求用戶增加這個(gè)LIMIT語(yǔ)句可以防止Reducer額外執(zhí)行很長(zhǎng)一段時(shí)間。

3)笛卡爾積
    將hive.strict.checks.cartesian.product設(shè)置為true時(shí),會(huì)限制笛卡爾積的查詢(xún)。對(duì)關(guān)系型數(shù)據(jù)
庫(kù)非常了解的用戶可能期望在 執(zhí)行JOIN查詢(xún)的時(shí)候不使用ON語(yǔ)句而是使用where語(yǔ)句,這樣關(guān)系數(shù)據(jù)庫(kù)的執(zhí)
行優(yōu)化器就可以高效地將WHERE語(yǔ)句轉(zhuǎn)化成那個(gè)ON語(yǔ)句。不幸的是,Hive并不會(huì)執(zhí)行這種優(yōu)化,因此,如果
表足夠大,那么這個(gè)查詢(xún)就會(huì)出現(xiàn)不可控的情況。

7、JVM重用

       JVM重用是Hadoop調(diào)優(yōu)參數(shù)的內(nèi)容,其對(duì)Hive的性能具有非常大的影響,特別是對(duì)于很難避免小文件的場(chǎng)景或task特別多的場(chǎng)景,這類(lèi)場(chǎng)景大多數(shù)執(zhí)行時(shí)間都很短。

       Hadoop的默認(rèn)配置通常是使用派生JVM來(lái)執(zhí)行map和Reduce任務(wù)的。這時(shí)JVM的啟動(dòng)過(guò)程可能會(huì)造成相當(dāng)大的開(kāi)銷(xiāo),尤其是執(zhí)行的job包含有成百上千task任務(wù)的情況。JVM重用可以使得JVM實(shí)例在同一個(gè)job中重新使用N次。N的值可以在Hadoop的mapred-site.xml文件中進(jìn)行配置。通常在10-20之間,具體多少需要根據(jù)具體業(yè)務(wù)場(chǎng)景測(cè)試得出。

<property>
  <name>mapreduce.job.jvm.numtasks</name>
  <value>10</value>
  <description>How many tasks to run per jvm. If set to -1, there is no limit. </description>
</property>

       這個(gè)功能的缺點(diǎn)是,開(kāi)啟JVM重用將一直占用使用到的task插槽,以便進(jìn)行重用,直到任務(wù)完成后才能釋放。如果某個(gè)“不平衡的”job中有某幾個(gè)reduce task執(zhí)行的時(shí)間要比其他Reduce task消耗的時(shí)間多的多的話,那么保留的插槽就會(huì)一直空閑著卻無(wú)法被其他的job使用,直到所有的task都結(jié)束了才會(huì)釋放。

8、壓縮

       詳見(jiàn)07Hive學(xué)習(xí)之路(壓縮和存儲(chǔ))

9、執(zhí)行計(jì)劃(Explain)

1)基本語(yǔ)法

       EXPLAIN [EXTENDED | DEPENDENCY | AUTHORIZATION] query

2)案例實(shí)操:

①查看下面這條語(yǔ)句的執(zhí)行計(jì)劃
	explain select * from emp;
	explain select deptno, avg(sal) avg_sal from emp group by deptno;
	
②查看詳細(xì)執(zhí)行計(jì)劃
	explain extended select * from emp;
	explain extended select deptno, avg(sal) avg_sal from emp group by deptno;

以上是“Hive調(diào)優(yōu)的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

名稱(chēng)欄目:Hive調(diào)優(yōu)的示例分析
本文網(wǎng)址:http://bm7419.com/article16/gigjdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作虛擬主機(jī)、微信小程序、定制網(wǎng)站、、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)