獲取原文
簡短介紹
是不是有很多小夥伴,上完一天班之後感覺啥也沒幹呢?是不是每天就跑了幾次hivesql一天就結束了呢?
那麼優化hivesql可以給我們帶來如下的提公升:
是不是每天可以執行更多hivesql了,做更多的資料需求了呢?^_^
了解底層技術引擎的工作流程,能夠更好的告訴我們該如何優化。
mapreduce工作流程圖
mapreduce工作流程圖
說明:2個圖都是mapreduce的工作過程,只是圖中所標註過程說明不同。
從工作流程圖我們可以了解到mapreduce分為map和reduce階段。
可以簡單理解為:讀取資料,將資料分類,之後合併計算,最後資料合併。那麼整個mapreduce過程就是資料讀取和計算。
個人小提公升:
mapreduce過程中涉及到5次解壓4次壓縮
。因為集群中儲存的資料塊為了節省空間,增加複製速度,大多是經過演算法壓縮的。所以計算過程需要解壓。當計算完成又會壓縮,便於移動和拷貝。
1、從觀察日誌開始(在使用mapreduce計算引擎的情況下)。
hivesql執行過程中我們可以看到如下這些日誌。
說明:我們提交的sql會被解析為sql片段,之後每次採用mapreduce為最小任務來執行。也就是說小夥伴提交的一條sql會被拆解為1個或者多個小sql段,之後採用mapreduce來執行。
其實我們最終的優化就是針對job個數,map塊,reduce次數來優化的。那麼我們如何知道一條sql提交多少個job呢?我這有幾個測試sql,小夥伴們先觀察下。
-- 產生1個job(即:執行一次mapreduce過程)
select dt from dc_ods.ods_metadata_hive_dbs_ds group by dt;
-- 產生1個job(即:執行一次mapreduce過程)
select count(1) from dc_ods.ods_metadata_hive_dbs_ds;
-- 產生1個job(即:執行一次mapreduce過程)
select count(1) from dc_ods.ods_metadata_hive_tbls_ds t inner join dc_ods.ods_metadata_hive_dbs_ds d on t.db_id = d.db_id;
-- 產生2個job(即:執行二次mapreduce過程)
select count(1) from (select dt from dc_ods.ods_metadata_hive_dbs_ds group by dt) a;
-- 產生3個job(即:執行三次mapreduce過程)
select dt from dc_ods.ods_metadata_hive_dbs_ds where dt>='20201001' group by dt union all select dt from dc_ods.ods_metadata_hive_dbs_ds where dt
-- 產生3個job(即:執行三次mapreduce過程)
select count(1) from (select dt from dc_ods.ods_metadata_hive_dbs_ds where dt>='20201001' group by dt union all select dt from dc_ods.ods_metadata_hive_dbs_ds where dt
個人小提公升(map個數計算),感興趣可細讀:
-- map個數的計算和分片大小(splitsize)計算公式
long splitsize = math.max(minsize, math.min(maxsize, blocksize))
-- minsize: math.max(1, mapreduce.input.fileinputformat.split.minsize配置的大小 預設是1)
-- maxsize: mapreduce.input.fileinputformat.split.maxsize 配置的大小,預設為long.max_value
-- blocksize: hdfs快的大小,看集群配置(現在預設128m,以前是64m)
-- 產生2個job(即:執行二次mapreduce過程)
3、hivesql編寫優化
① 小表放前,大表放後
hive假定查詢中最後的乙個表是大表。它會將其它表快取起來,然後掃瞄最後那個表。因此通常需要將小表放前面,或者標記哪張表是大表:/*streamtable(table_name) */
② 使用相同的連線鍵
當對3個或者更多個表進行join連線時,如果每個on子句都使用相同的連線鍵的話,那麼只會產生乙個mapreduce job。
③ 盡早地過濾資料
減少每個階段的資料量,對於分割槽表要加分割槽,同時只選擇需要使用到的字段。
④ 盡量原子化操作(多用臨時表)
盡量避免乙個sql包含複雜邏輯,可以使用中間表來完成複雜的邏輯
⑤ 用insert into替換union all
-- 優化前(此處會產生3個job)
insert into 表 select 字段 from 表1 union all select 字段 from 表2;
-- 優化後(每條產生1個job)
insert into 表 select 字段 from 表1;
insert into 表 select 字段 from 表2;
⑥ order by & sort by
order by : 對查詢結果進行全域性排序消耗時間長,需要set hive.mapred.mode=nostrict
sort by : 區域性排序,並非全域性有序,提高效率。
⑧ 並行執行
對於sql執行中,讓相互沒有依賴關係的mapreduce可同時執行
set hive.exec.parallel=true;可以開啟併發執行。
set hive.exec.parallel.thread.number=16; //同乙個sql允許最大並行度,預設為8。
對hivesql優化小夥伴們是否有了深刻的了解呢?多練習,多觀察,多了解底層會有幫助的。俗話說:溫故而知新嘛。這裡還有乙個知識點沒有提到哦(資料傾斜)。小夥伴們對資料傾斜有什麼解決之道呢?可以相互交流下哦! 面試題(七) 大資料相關知識
大資料相關知識 01.kafka 基本特性 kafka 將訊息儲存在磁碟中,並且讀寫磁碟的方式是順序讀寫,避免了隨機讀寫磁碟 尋道時間過長 導致的效能瓶頸 磁碟的順序讀寫速度超過記憶體隨機讀寫。kafka 入門與實踐 02.核心概念 1.每個 topic 可以劃分為多個分割槽,每個訊息在分割槽中都會...
行業 分析 大資料對於銀行七大應用
如今,hadoop幾乎存在於各個方面,其通過利用大資料來分析資訊和增加競爭力。許多金融機構和公司已經開始使用hadoop成功地解決問題,即便他們本沒有計畫這樣做。因為如果他們不這樣做,就會面臨市場份額損失的巨大風險。以下是一些特別有趣且重要的大資料和hadoop用例。詐騙是金融犯罪和資料洩露中成本最...
行業 分析 大資料對於銀行七大應用
如今,hadoop幾乎存在於各個方面,其通過利用大資料來分析資訊和增加競爭力。許多金融機構和公司已經開始使用hadoop成功地解決問題,即便他們本沒有計畫這樣做。因為如果他們不這樣做,就會面臨市場份額損失的巨大風險。以下是一些特別有趣且重要的大資料和hadoop用例。詐騙是金融犯罪和資料洩露中成本最...