您好,登錄后才能下訂單哦!
好程序員大數(shù)據(jù)學習路線分享hive的運行方式,hive的屬性設(shè)置: 1、在cli端設(shè)置 (只針對當前的session) 3、在java代碼中設(shè)置 (當前連接) 2、在配置文件中設(shè)置 (所有session有效)
設(shè)置屬性的優(yōu)先級依次降低。 cli端只能設(shè)置非hive啟動需要的屬性。(log屬性,元數(shù)據(jù)連接屬性)
查找所有屬性: hive>set; 查看當前屬性的值:通常是hadoop hive> set -v; 模糊查找屬性: hive -S -e "set" | grep current; hive -S -e "set" | grep index;
hive變量:system 、 env 、hivevar 、hiveconf
system :系統(tǒng)級別環(huán)境變量(jvm、hadoop等),可讀可寫 hive> set system:min.limit = 3; hive> set system:min.limit; system:min.limit=3
env:環(huán)境變量 (HADOOP_HOME),只讀不能寫。 hive> set env:PWD; env:PWD=/usr/local/hive-1.2.1
hivevar:自定義臨時變量(可讀可寫)
hive> set hivevar:min.limit=3;
hive> set hivevar:min.limit;
hivevar:min.limit=3
hive> set hivevar:min.limit=2;
hive> set hivevar:min.limit;
hivevar:min.limit=2
hiveconf:自定義臨時屬性變量(可讀可寫)
hive> set hiveconf:max.limit=10;
hive> set hiveconf:max.limit;
hiveconf:max.limit=10
hive> set hiveconf:max.limit=6;
hive> set hiveconf:max.limit;
hiveconf:max.limit=6
hive的運行方式: 1、cli端運行 (臨時統(tǒng)計、開發(fā)) 2、hive -S -e "hql 語句"; (適合單個hql的query語句) 3、hive -S -f /hql文件; (hql文件的腳本)
不帶參數(shù)
hive -S -e "use qf1603;select * from user1;" hive -S -f /home/su.hql;
hive在0.9版本以前是不支持的-f 帶參數(shù)的執(zhí)行:
hive --hivevar min_limit=3 -hivevar -hivevar t_n=user1 -e 'use qf1603;select * from {hive:t_n} limit {hivevar:min_limit};'
hive --hiveconf min_lit=3 -e "use qf1603;select * from user1 limit ${hiveconf:min_lit};"
hive -S --hiveconf t_n=user1 --hivevar min_limit=3 -f ./su.hql
hive中注釋: --注釋內(nèi)容
insert overwrite local directory '/home/out/05'
select * from user1 limit 3;
###三、hive 優(yōu)化 1、環(huán)境優(yōu)化(linux 句柄數(shù)、應(yīng)用內(nèi)存分配、是否負載等) 2、應(yīng)用配置屬性方面的優(yōu)化。 3、代碼優(yōu)化(hql,嘗試換一種hql的寫法)。
1、學會看explain
explain :顯示hql查詢的計劃。 explain extended :顯示hql查詢的計劃。還會顯示hql的抽象表達式樹。(就是解釋器干得事)
explain select from user1;
explain extended select from user1;
一個hql語句將會有一個或者多個stage構(gòu)成。每一個stage相當于一個mr的job, stage可以是一個Fetch 、 map join 、 limit 等操作。 每一個stage都會按照依賴關(guān)系依次執(zhí)行,沒有依賴關(guān)系的可以并行執(zhí)行。
2、對limit的優(yōu)化:
hive.limit.row.max.size=100000
hive.limit.optimize.limit.file=10
hive.limit.optimize.enable=false
3、對join的優(yōu)化:
永遠是小表驅(qū)動大表(小結(jié)果集驅(qū)動大結(jié)果集) 必要時候使用小表標識 /+STREAMTABLE(小表別名)/ 將業(yè)務(wù)調(diào)整為能盡量使用map-side join: hive.auto.convert.join: smalltable: ?盡量避免笛卡爾積的join查詢,即便有咯也需要使用on 或者where 來過濾。 hive目前的join 只支持等值連接(= and)。其它的不行
4、使用hive本地模式(在一個jvm里面運行)
hive.exec.mode.local.auto=false
hive.exec.mode.local.auto.inputbytes.max=134217728
hive.exec.mode.local.auto.input.files.max=4
5、hive并行執(zhí)行(stage之間沒有相互依賴關(guān)系的可以并行執(zhí)行)
hive.exec.parallel=false
hive.exec.parallel.thread.number=8
6、嚴格模式:
hive提供的嚴格模式阻擋三種查詢: 1、帶有分區(qū)的表的查詢 2、帶有orderby的查詢 3、join查詢語句,不帶on條件 或者 where條件。
7、設(shè)置mapper 和 reduce個數(shù)
mapper個數(shù)太多,啟動耗時,個數(shù)太少,資源利用不充分 reducer個數(shù)太多,啟動耗時,個數(shù)太少,資源利用不充分
mapper個數(shù): 手動設(shè)置:
set mapred.map.tasks=2;
適當調(diào)整塊大小,從而改變分片數(shù),來改變mapper個數(shù):
通過合并文件小文件來減少mapper個數(shù):
set mapred.max.split.size=25600000; 256M
set mapred.min.split.per.node=1
set mapred.min.split.per.rack=1
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
reducer個數(shù)(通常手動設(shè)置):
set mapreduce.job.reduces=-1;
8、hive使用jvm重用
mapreduce.job.jvm.numtasks=1 ?set mapred.job.reuse.jvm.num=8; ##jvm里運行task的任務(wù)數(shù)
9、數(shù)據(jù)傾斜(查看:Hive優(yōu)化.docx文檔)
數(shù)據(jù)傾斜:數(shù)據(jù)某列的值分布不均勻。 造成數(shù)據(jù)傾斜的原因: 1、原本數(shù)據(jù)就傾斜 2、hql語句可能造成 3、join 極容易造成 4、count(distinct col) 5、group by語句也容易
解決方法: 1、如果數(shù)據(jù)本身傾斜,看數(shù)據(jù)能否直接分離(找到傾斜的數(shù)據(jù)) 2、將傾斜的數(shù)據(jù)單獨出來計算,然后和正常的數(shù)據(jù)進行union all 3、將傾斜的數(shù)據(jù)賦予隨機數(shù)來進行join查詢,均衡每個task的任務(wù)量。 4、試圖不變需求改寫hql語句。
傾斜解決的幾個屬性設(shè)置:
hive.map.aggr=true
hive.groupby.skewindata=false
hive.optimize.skewjoin=false ?
10、job數(shù)量的控制
連接查詢的on中的連接字段類型盡可能相同。 通常是一個簡單hql語句生成一個job,有join 、limit 、group by 都將有可能會生成一個獨立job。
select
u.uid,
u.uname
from user1 u
where u.uid in (select l.uid from login l where l.uid=1 limit 1)
;
select
u.uid,
u.uname
from user1 u
join login l
on u.uid = l.uid
where l.uid = 1
;
分區(qū) 、分桶 、索引 這些本身就是hive的一種優(yōu)化。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。