小白篇 七 大資料HiveSql優化

2021-10-10 08:25:59 字數 3726 閱讀 3473

獲取原文

簡短介紹

是不是有很多小夥伴,上完一天班之後感覺啥也沒幹呢?是不是每天就跑了幾次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用例。詐騙是金融犯罪和資料洩露中成本最...