【SQL】詳細講解如何進行Hive性能優化

2021-02-19 DataGo數據狗

首先,我們來看看Hadoop的計算框架特性,在此特性下會衍生哪些問題?

數據量大不是問題,數據傾斜是個問題。

jobs數比較多的作業運行效率相對比較低,比如即使有幾百行的表,如果多次關聯多次匯總,產生十幾個jobs,耗時很長。原因是map reduce作業初始化的時間是比較長的。

sum,count,max,min等UDAF,不怕數據傾斜問題,hadoop在map端的匯總合併優化,使數據傾斜不成問題。

count(distinct ),在數據量大的情況下,效率較低,如果是多count(distinct )效率更低,因為count(distinct)是按group by 欄位分組,按distinct欄位排序,一般這種分布方式是很傾斜的。舉個例子:比如男uv,女uv,像淘寶一天30億的pv,如果按性別分組,分配2個reduce,每個reduce處理15億數據。

面對這些問題,我們能有哪些有效的優化手段呢?下面列出一些在工作有效可行的優化手段:

好的模型設計事半功倍。

解決數據傾斜問題。

減少job數。

設置合理的map reduce的task數,能有效提升性能。(比如,10w+級別的計算,用160個reduce,那是相當的浪費,1個足夠)。

了解數據分布,自己動手解決數據傾斜問題是個不錯的選擇。set hive.groupby.skewindata=true;這是通用的算法優化,但算法優化有時不能適應特定業務背景,開發人員了解業務,了解數據,可以通過業務邏輯精確有效的解決數據傾斜問題。

數據量較大的情況下,慎用count(distinct),count(distinct)容易產生傾斜問題。

對小文件進行合併,是行至有效的提高調度效率的方法,假如所有的作業設置合理的文件數,對雲梯的整體調度效率也會產生積極的正向影響。

優化時把握整體,單個作業最優不如整體最優。

而接下來,我們心中應該會有一些疑問,影響性能的根源是什麼?

2.性能低下的根源

hive性能優化時,把HiveQL當做M/R程序來讀,即從M/R的運行角度來考慮優化性能,從更底層思考如何優化運算性能,而不僅僅局限於邏輯代碼的替換層面。

RAC(Real Application Cluster)真正應用集群就像一輛機動靈活的小貨車,響應快;Hadoop就像吞吐量巨大的輪船,啟動開銷大,如果每次只做小數量的輸入輸出,利用率將會很低。所以用好Hadoop的首要任務是增大每次任務所搭載的數據量。

Hadoop的核心能力是parition和sort,因而這也是優化的根本。

觀察Hadoop處理數據的過程,有幾個顯著的特徵:

數據的大規模並不是負載重點,造成運行壓力過大是因為運行數據的傾斜。

jobs數比較多的作業運行效率相對比較低,比如即使有幾百行的表,如果多次關聯對此匯總,產生幾十個jobs,將會需要30分鐘以上的時間且大部分時間被用於作業分配,初始化和數據輸出。M/R作業初始化的時間是比較耗時間資源的一個部分。

在使用SUM,COUNT,MAX,MIN等UDAF函數時,不怕數據傾斜問題,Hadoop在Map端的匯總合併優化過,使數據傾斜不成問題。

COUNT(DISTINCT)在數據量大的情況下,效率較低,如果多COUNT(DISTINCT)效率更低,因為COUNT(DISTINCT)是按GROUP BY欄位分組,按DISTINCT欄位排序,一般這種分布式方式是很傾斜的;比如:男UV,女UV,淘寶一天30億的PV,如果按性別分組,分配2個reduce,每個reduce處理15億數據。

數據傾斜是導致效率大幅降低的主要原因,可以採用多一次 Map/Reduce 的方法, 避免傾斜。

最後得出的結論是:避實就虛,用 job 數的增加,輸入量的增加,佔用更多存儲空間,充分利用空閒 CPU 等各種方法,分解數據傾斜造成的負擔。

3.配置角度優化

我們知道了性能低下的根源,同樣,我們也可以從Hive的配置解讀去優化。Hive系統內部已針對不同的查詢預設定了優化方法,用戶可以通過調整配置進行控制, 以下舉例介紹部分優化的策略以及優化控制選項。

3.1列裁剪

Hive 在讀數據的時候,可以只讀取查詢中所需要用到的列,而忽略其它列。例如,若有以下查詢:

SELECT a,b FROM q WHERE e<10;

在實施此項查詢中,Q 表有 5 列(a,b,c,d,e),Hive 只讀取查詢邏輯中真實需要 的 3 列 a、b、e,而忽略列 c,d;這樣做節省了讀取開銷,中間表存儲開銷和數據整合開銷。

裁剪所對應的參數項為:hive.optimize.cp=true(默認值為真)

3.2分區裁剪

可以在查詢的過程中減少不必要的分區。例如,若有以下查詢:

SELECT * FROM (SELECTT a1,COUNT(1) FROM T GROUP BY a1) subq WHERE subq.prtn=100; #(多餘分區)SELECT * FROM T1 JOIN (SELECT * FROM T2) subq ON (T1.a1=subq.a2) WHERE subq.prtn=100;

查詢語句若將「subq.prtn=100」條件放入子查詢中更為高效,可以減少讀入的分區 數目。Hive 自動執行這種裁剪優化。

分區參數為:hive.optimize.pruner=true(默認值為真)

3.3JOIN操作

在編寫帶有 join 操作的代碼語句時,應該將條目少的表/子查詢放在 Join 操作符的左邊。因為在 Reduce 階段,位於 Join 操作符左邊的表的內容會被加載進內存,載入條目較少的表 可以有效減少 OOM(out of memory)即內存溢出。所以對於同一個 key 來說,對應的 value 值小的放前,大的放後,這便是「小表放前」原則。若一條語句中有多個 Join,依據 Join 的條件相同與否,有不同的處理方法。

3.3.1JOIN原則

在使用寫有 Join 操作的查詢語句時有一條原則:應該將條目少的表/子查詢放在 Join 操作符的左邊。原因是在 Join 操作的 Reduce 階段,位於 Join 操作符左邊的表的內容會被加載進內存,將條目少的表放在左邊,可以有效減少發生 OOM 錯誤的機率。對於一條語句中有多個 Join 的情況,如果 Join 的條件相同,比如查詢:

INSERT OVERWRITE TABLE pv_users

SELECT pv.pageid, u.age FROM page_view p

JOIN user u ON (pv.userid = u.userid)

JOIN newuser x ON (u.userid = x.userid);

如果 Join 的條件不相同,比如:

INSERT OVERWRITE TABLE pv_users

SELECT pv.pageid, u.age FROM page_view p

JOIN user u ON (pv.userid = u.userid)

JOIN newuser x on (u.age = x.age);

Map-Reduce 的任務數目和 Join 操作的數目是對應的,上述查詢和以下查詢是等價的:

INSERT OVERWRITE TABLE tmptable

SELECT * FROM page_view p JOIN user u

ON (pv.userid = u.userid);

INSERT OVERWRITE TABLE pv_users

SELECT x.pageid, x.age FROM tmptable x

JOIN newuser y ON (x.age = y.age);

3.4MAP JOIN操作

Join 操作在 Map 階段完成,不再需要Reduce,前提條件是需要的數據在 Map 的過程中可以訪問到。比如查詢:

INSERT OVERWRITE TABLE pv_users

SELECT /*+ MAPJOIN(pv) */ pv.pageid, u.age

FROM page_view pv

JOIN user u ON (pv.userid = u.userid);

可以在 Map 階段完成 Join.

相關的參數為:

hive.join.emit.interval = 1000

hive.mapjoin.size.key = 10000

hive.mapjoin.cache.numrows = 10000

3.5GROUP BY操作

進行GROUP BY操作時需要注意一下幾點:

事實上並不是所有的聚合操作都需要在reduce部分進行,很多聚合操作都可以先在Map端進行部分聚合,然後reduce端得出最終結果。

這裡需要修改的參數為:

hive.map.aggr=true(用於設定是否在 map 端進行聚合,默認值為真) hive.groupby.mapaggr.checkinterval=100000(用於設定 map 端進行聚合操作的條目數)

此處需要設定 hive.groupby.skewindata,當選項設定為 true 是,生成的查詢計劃有兩 個 MapReduce 任務。在第一個 MapReduce 中,map 的輸出結果集合會隨機分布到 reduce 中, 每個 reduce 做部分聚合操作,並輸出結果。這樣處理的結果是,相同的 Group By Key 有可 能分發到不同的 reduce 中,從而達到負載均衡的目的;第二個 MapReduce 任務再根據預處 理的數據結果按照 Group By Key 分布到 reduce 中(這個過程可以保證相同的 Group By Key 分布到同一個 reduce 中),最後完成最終的聚合操作。

3.6合併小文件

我們知道文件數目小,容易在文件存儲端造成瓶頸,給 HDFS 帶來壓力,影響處理效率。對此,可以通過合併Map和Reduce的結果文件來消除這樣的影響。

用於設置合併屬性的參數有:

是否合併Map輸出文件:hive.merge.mapfiles=true(默認值為真)

是否合併Reduce 端輸出文件:hive.merge.mapredfiles=false(默認值為假)

合併文件的大小:hive.merge.size.per.task=256*1000*1000(默認值為 256000000)

4.程序角度優化

4.1熟練使用SQL提高查詢

熟練地使用 SQL,能寫出高效率的查詢語句。

場景:有一張 user 表,為賣家每天收到表,user_id,ds(日期)為 key,屬性有主營類目,指標有交易金額,交易筆數。每天要取前10天的總收入,總筆數,和最近一天的主營類目。

 解決方法 1

如下所示:常用方法

INSERT OVERWRITE TABLE t1

SELECT user_id,substr(MAX(CONCAT(ds,cat),9) AS main_cat) FROM users

WHERE ds=20120329 // 20120329 為日期列的值,實際代碼中可以用函數表示出當天日期 GROUP BY user_id;

INSERT OVERWRITE TABLE t2

SELECT user_id,sum(qty) AS qty,SUM(amt) AS amt FROM users

WHERE ds BETWEEN 20120301 AND 20120329

GROUP BY user_id

SELECT t1.user_id,t1.main_cat,t2.qty,t2.amt FROM t1

JOIN t2 ON t1.user_id=t2.user_id

下面給出方法1的思路,實現步驟如下:

第一步:利用分析函數,取每個 user_id 最近一天的主營類目,存入臨時表 t1。

第二步:匯總 10 天的總交易金額,交易筆數,存入臨時表 t2。

第三步:關聯 t1,t2,得到最終的結果。

解決方法 2

如下所示:優化方法

SELECT user_id,substr(MAX(CONCAT(ds,cat)),9) AS main_cat,SUM(qty),SUM(amt) FROM users

WHERE ds BETWEEN 20120301 AND 20120329

GROUP BY user_id

在工作中我們總結出:方案 2 的開銷等於方案 1 的第二步的開銷,性能提升,由原有的 25 分鐘完成,縮短為 10 分鐘以內完成。節省了兩個臨時表的讀寫是一個關鍵原因,這種方式也適用於 Oracle 中的數據查找工作。

SQL 具有普適性,很多 SQL 通用的優化方案在 Hadoop 分布式計算方式中也可以達到效果。

4.2無效ID在關聯時的數據傾斜問題

問題:日誌中常會出現信息丟失,比如每日約為 20 億的全網日誌,其中的 user_id 為主 鍵,在日誌收集過程中會丟失,出現主鍵為 null 的情況,如果取其中的 user_id 和 bmw_users 關聯,就會碰到數據傾斜的問題。原因是 Hive 中,主鍵為 null 值的項會被當做相同的 Key 而分配進同一個計算 Map。

解決方法 1:user_id 為空的不參與關聯,子查詢過濾 null

SELECT * FROM log a

JOIN bmw_users b ON a.user_id IS NOT NULL AND a.user_id=b.user_id

UNION All SELECT * FROM log a WHERE a.user_id IS NULL

解決方法 2 如下所示:函數過濾 null

SELECT * FROM log a LEFT OUTER

JOIN bmw_users b ON

CASE WHEN a.user_id IS NULL THEN CONCAT(『dp_hive』,RAND()) ELSE a.user_id END =b.user_id;

調優結果:原先由於數據傾斜導致運行時長超過 1 小時,解決方法 1 運行每日平均時長 25 分鐘,解決方法 2 運行的每日平均時長在 20 分鐘左右。優化效果很明顯。

我們在工作中總結出:解決方法2比解決方法1效果更好,不但IO少了,而且作業數也少了。解決方法1中log讀取兩次,job 數為2。解決方法2中 job 數是1。這個優化適合無效 id(比如-99、 『』,null 等)產生的傾斜問題。把空值的 key 變成一個字符串加上隨機數,就能把傾斜的 數據分到不同的Reduce上,從而解決數據傾斜問題。因為空值不參與關聯,即使分到不同 的 Reduce 上,也不會影響最終的結果。附上 Hadoop 通用關聯的實現方法是:關聯通過二次排序實現的,關聯的列為 partion key,關聯的列和表的 tag 組成排序的 group key,根據 pariton key分配Reduce。同一Reduce內根據group key排序。

4.3不同數據類型關聯產生的傾斜問題

問題:不同數據類型 id 的關聯會產生數據傾斜問題。

一張表 s8 的日誌,每個商品一條記錄,要和商品表關聯。但關聯卻碰到傾斜的問題。s8 的日誌中有 32 為字符串商品 id,也有數值商品 id,日誌中類型是 string 的,但商品中的 數值 id 是 bigint 的。猜想問題的原因是把 s8 的商品 id 轉成數值 id 做 hash 來分配 Reduce, 所以字符串 id 的 s8 日誌,都到一個 Reduce 上了,解決的方法驗證了這個猜測。

解決方法:把數據類型轉換成字符串類型

SELECT * FROM s8_log a LEFT OUTERJOIN r_auction_auctions b ON a.auction_id=CASE(b.auction_id AS STRING)

調優結果顯示:數據表處理由 1 小時 30 分鐘經代碼調整後可以在 20 分鐘內完成。

4.4利用Hive對UNION ALL優化的特性

多表 union all 會優化成一個 job。

問題:比如推廣效果表要和商品表關聯,效果表中的 auction_id 列既有 32 為字符串商 品 id,也有數字 id,和商品表關聯得到商品的信息。

解決方法:Hive SQL 性能會比較好

SELECT * FROM effect a

JOIN

(SELECT auction_id AS auction_id FROM auctions

UNION All

SELECT auction_string_id AS auction_id FROM auctions) b

ON a.auction_id=b.auction_id

比分別過濾數字 id,字符串 id 然後分別和商品表關聯性能要好。

這樣寫的好處:1 個 MapReduce 作業,商品表只讀一次,推廣效果表只讀取一次。把 這個 SQL 換成 Map/Reduce 代碼的話,Map 的時候,把 a 表的記錄打上標籤 a,商品表記錄 每讀取一條,打上標籤 b,變成兩個<key,value>對,<(b,數字 id),value>,<(b,字符串 id),value>。

所以商品表的 HDFS 讀取只會是一次。

4.5解決Hive對UNION ALL優化的短板

Hive 對 union all 的優化的特性:對 union all 優化只局限於非嵌套查詢。

示例 1:子查詢內有 group by

SELECT * FROM

(SELECT * FROM t1 GROUP BY c1,c2,c3 UNION ALL SELECT * FROM t2 GROUP BY c1,c2,c3)t3

GROUP BY c1,c2,c3

從業務邏輯上說,子查詢內的 GROUP BY 怎麼都看顯得多餘(功能上的多餘,除非有 COUNT(DISTINCT)),如果不是因為 Hive Bug 或者性能上的考量(曾經出現如果不執行子查詢 GROUP BY,數據得不到正確的結果的 Hive Bug)。所以這個 Hive 按經驗轉換成如下所示:

SELECT * FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t2)t3 GROUP BY c1,c2,c3

調優結果:經過測試,並未出現 union all 的 Hive Bug,數據是一致的。MapReduce 的 作業數由 3 減少到 1。

t1 相當於一個目錄,t2 相當於一個目錄,對 Map/Reduce 程序來說,t1,t2 可以作為 Map/Reduce 作業的 mutli inputs。這可以通過一個 Map/Reduce 來解決這個問題。Hadoop 的 計算框架,不怕數據多,就怕作業數多。

但如果換成是其他計算平臺如 Oracle,那就不一定了,因為把大的輸入拆成兩個輸入, 分別排序匯總後 merge(假如兩個子排序是並行的話),是有可能性能更優的(比如希爾排 序比冒泡排序的性能更優)。

SELECT * FROM

(SELECT * FROM t1

UNION ALL SELECT c1,c2,c3 COUNT(DISTINCT c4) FROM t2 GROUP BY c1,c2,c3) t3

GROUP BY c1,c2,c3;

由於子查詢裡頭有 COUNT(DISTINCT)操作,直接去 GROUP BY 將達不到業務目標。這時採用 臨時表消滅 COUNT(DISTINCT)作業不但能解決傾斜問題,還能有效減少 jobs。

INSERT t4 SELECT c1,c2,c3,c4 FROM t2 GROUP BY c1,c2,c3;

SELECT c1,c2,c3,SUM(income),SUM(uv) FROM

(SELECT c1,c2,c3,income,0 AS uv FROM t1

UNION ALL

SELECT c1,c2,c3,0 AS income,1 AS uv FROM t2) t3

GROUP BY c1,c2,c3;

job 數是 2,減少一半,而且兩次 Map/Reduce 比 COUNT(DISTINCT)效率更高。

調優結果:千萬級別的類目表,member 表,與 10 億級得商品表關聯。原先 1963s 的任務經過調整,1152s 即完成。

SELECT * FROM

(SELECT * FROM t1 UNION ALL SELECT * FROM t4 UNION ALL SELECT * FROM t2 JOIN t3 ON t2.id=t3.id) x

GROUP BY c1,c2;

上面代碼運行會有 5 個 jobs。加入先 JOIN 生存臨時表的話 t5,然後 UNION ALL,會變成 2 個 jobs。

INSERT OVERWRITE TABLE t5

SELECT * FROM t2 JOIN t3 ON t2.id=t3.id;

SELECT * FROM (t1 UNION ALL t4 UNION ALL t5);

調優結果顯示:針對千萬級別的廣告位表,由原先 5 個 Job 共 15 分鐘,分解為 2 個 job 一個 8-10 分鐘,一個3分鐘。

4.6GROUP BY替代COUNT(DISTINCT)達到優化效果

計算 uv 的時候,經常會用到 COUNT(DISTINCT),但在數據比較傾斜的時候 COUNT(DISTINCT) 會比較慢。這時可以嘗試用 GROUP BY 改寫代碼計算 uv。

INSERT OVERWRITE TABLE s_dw_tanx_adzone_uv PARTITION (ds=20120329)SELECT 20120329 AS thedate,adzoneid,COUNT(DISTINCT acookie) AS uv FROM s_ods_log_tanx_pv t WHERE t.ds=20120329 GROUP BY adzoneid

關於COUNT(DISTINCT)的數據傾斜問題不能一概而論,要依情況而定,下面是我測試的一組數據:

測試數據:169857條

#統計每日IP

CREATE TABLE ip_2014_12_29 AS SELECT COUNT(DISTINCT ip) AS IP FROM logdfs WHERE logdate=』2014_12_29′;

耗時:24.805 seconds

#統計每日IP(改造)

CREATE TABLE ip_2014_12_29 AS SELECT COUNT(1) AS IP FROM (SELECT DISTINCT ip from logdfs WHERE logdate=』2014_12_29′) tmp;

耗時:46.833 seconds

測試結果表名:明顯改造後的語句比之前耗時,這是因為改造後的語句有2個SELECT,多了一個job,這樣在數據量小的時候,數據不會存在傾斜問題。

5.優化總結

優化時,把hive sql當做mapreduce程序來讀,會有意想不到的驚喜。理解hadoop的核心能力,是hive優化的根本。這是這一年來,項目組所有成員寶貴的經驗總結。

不怕數據多,就怕數據傾斜。

對jobs數比較多的作業運行效率相對比較低,比如即使有幾百行的表,如果多次關聯多次匯總,產生十幾個jobs,沒半小時是跑不完的。map reduce作業初始化的時間是比較長的。

對sum,count來說,不存在數據傾斜問題。

對count(distinct ),效率較低,數據量一多,準出問題,如果是多count(distinct )效率更低。

好的模型設計事半功倍。

解決數據傾斜問題。

減少job數。

設置合理的map reduce的task數,能有效提升性能。(比如,10w+級別的計算,用160個reduce,那是相當的浪費,1個足夠)。

自己動手寫sql解決數據傾斜問題是個不錯的選擇。set hive.groupby.skewindata=true;這是通用的算法優化,但算法優化總是漠視業務,習慣性提供通用的解決方法。Etl開發人員更了解業務,更了解數據,所以通過業務邏輯解決傾斜的方法往往更精確,更有效。

對count(distinct)採取漠視的方法,尤其數據大的時候很容易產生傾斜問題,不抱僥倖心理。自己動手,豐衣足食。

對小文件進行合併,是行至有效的提高調度效率的方法,假如我們的作業設置合理的文件數,對雲梯的整體調度效率也會產生積極的影響。

優化時把握整體,單個作業最優不如整體最優。

6.優化的常用手段

主要由三個屬性來決定:

hive.exec.reducers.bytes.per.reducer   #這個參數控制一個job會有多少個reducer來處理,依據的是輸入文件的總大小。默認1GB。

hive.exec.reducers.max    #這個參數控制最大的reducer的數量, 如果 input / bytes per reduce > max  則會啟動這個參數所指定的reduce個數。  這個並不會影響mapre.reduce.tasks參數的設置。默認的max是999。

mapred.reduce.tasks #這個參數如果指定了,hive就不會用它的estimation函數來自動計算reduce的個數,而是用這個參數來啟動reducer。默認是-1。

6.1參數設置的影響

如果reduce太少:如果數據量很大,會導致這個reduce異常的慢,從而導致這個任務不能結束,也有可能會OOM 2、如果reduce太多:  產生的小文件太多,合併起來代價太高,namenode的內存佔用也會增大。如果我們不指定mapred.reduce.tasks, hive會自動計算需要多少個reducer。

來源:浪尖聊大數據

相關焦點

  • hive sql 優化心得
    如何寫好一個hql作為一個數據開發工程師,hive sql是我們必備的技能,可能大家都知道一些基本的優化方法(例如:使用分區、小表join大表、不使用distinct、where條件儘量寫到子查詢裡面減少數據量等等),但是你有沒有想過為什麼?是不是真的對執行效率有提升。
  • HiveSQL優化方法與實踐(推薦收藏)
    很多聚合操作可以現在map端進行,最後在Reduce端完成結果輸出:Set hive.map.aggr = true;# 是否在Map端進行聚合,默認為true;Set hive.groupby.mapaggr.checkinterval = 1000000;# 在Map端進行聚合操作的條目數目;當使用Group
  • SparkSQL操作insert overwrite table到hive慢
    在使用spark寫hive過程中,發現最耗時的部分是將產生的結果寫入hive,舉個例子,對3g*1G表的join來講,將結果使用以下方式直接寫入hive表需要超過半小時的時間:dataframe.registerTempTable("result")sql(s"""INSERT OVERWRITE Table $outputTable PARTITION (dt ='$outputDate
  • Hive SQL基本使用詳解
    一:簡介Hive是一個數據倉庫基礎的應用工具,在Hadoop中用來處理結構化數據,它架構在Hadoop之上,通過SQL來對數據進行操作。>hive create database test;>hive use test;>hive create table if not exists employee( id bigint, username string
  • 大數據分析工程師入門9-Spark SQL
    本文為《大數據分析師入門課程》系列的第9篇,在本系列的第8篇-Spark基礎中,已經對Spark做了一個入門介紹,在此基礎上本篇拎出Spark SQL,主要站在使用者的角度來進行講解,需要注意的是本文中的例子的代碼均使用Scala語言。
  • Hadoop數據分析之Hive
    對AST進行語法分析,比如表是否存在、欄位是否存在、SQL語義是否有誤• 編譯器(Physical Plan):將AST編譯生成邏輯執行計劃• 優化器(Query Optimizer):對邏輯執行計劃進行優化• 執行器(Execution):把邏輯執行計劃轉換成可以運行的物理計劃。
  • Hive 如何快速拉取大批量數據
    同樣,因為hive基於都支持sql92協議,所以你也可以同樣的方案去解決大數據量的問題。分頁的解決方案會有什麼問題?首先,我們要明白分頁是如何完成的,首先資料庫server會根據條件運算出所有或部分符合條件的數據(取決是否有額外的排序),然後再根據分頁偏移信息,獲取相應的數據。所以,一次次的分頁,則必定涉及到一次次的數據運算。
  • Hive性能調優 | Fetch抓取
    但就算設置成none,也只有部分sql語句會不走mapreduce程序,那有沒有什麼辦法可以優化這個問題呢?本地模式大多數的Hadoop Job是需要Hadoop提供的完整的可擴展性來處理大數據集的。不過,有時Hive的輸入數據量是非常小的。在這種情況下,為查詢觸發執行任務時消耗可能會比實際job的執行時間要多的多。
  • 提升SQL語句性能的方法
    用具體案例進行SQL語句性能提升的方法。先用實際案例分析了優化SQL語句的方法,然後再結合nat123這個實際案例分析了如何實現外網訪問內網Mysql資料庫的方法。優化方法:優化的總體思路是拆分sql,將排序操作和查詢所有信息的操作分開。
  • spark結構化數據處理:Spark SQL、DataFrame和Dataset
    本文主要講解Spark 1.6.x的結構化數據處理相關東東,但因Spark發展迅速(本文的寫作時值Spark 1.6.2發布之際,並且Spark 2.0的預覽版本也已發布許久),因此請隨時關注Spark SQL官方文檔以了解最新信息。文中使用Scala對Spark SQL進行講解,並且代碼大多都能在spark-shell中運行,關於這點請知曉。
  • 「大數據進擊之路」——Apache Hive的架構及其特性總結
    解釋器、編譯器、優化器完成HQL查詢語句從詞法分析、語法分析、編譯、優化及其查詢計劃(plan)的生成!生成的查詢計劃存儲在HDFS中,並在隨後有MR(MapReduce)調用執行!>Hive是基於Hadoop的數據倉庫:數據存儲能力:Hadoop HDFS數據分析能力:Hadoop MR(MapReduce)把一份結構化數據映射成為一張表,通過提供用戶編號sql
  • 大數據分析師工程師入門6-HIVE進階
    窗口函數要講HIVE進階,窗口函數不得不提,作者之前的文章《Hive窗口函數進階指南》已經很詳細地講解了這部分內容,為了省去大家點連結跳來跳去的麻煩,下面將其核心內容摘錄出來,如下所示。性能調優由於Hive的執行依賴於底層的MapReduce作業,因此對MapReduce作業的調整優化是提高Hive性能的基礎。所以可以從以下幾個方面進行一系列的調優,來大幅度地提高Hive的查詢性能。 在Hive中對中間數據或最終數據做壓縮,是提高數據吞吐量和性能的一種手段。
  • 數據分析工具篇——HQL原理及優化
    很多聚合操作可以現在map端進行,最後在Reduce端完成結果輸出:Set hive.map.aggr = true; # 是否在Map端進行聚合,默認為true;Set hive.groupby.mapaggr.checkinterval = 1000000; # 在Map端進行聚合操作的條目數目;
  • 手把手教你在 Windows 平臺搭建本地 Hive 訪問環境
    為了減少廣大讀者環境帶來的坑,我刪除了原有的老版本,專門下載新版本的spark和對應的hadoop版本進行測試。按照本文的方法搭建好之後,你就可以直接在windows上啟動hdfs、hive和spark各組件,並直接跑起來,然後我會演示如何使用python調用spark,並讓pyspark訪問現有的hive集群的數據。
  • 資料庫性能優化之 SQL 語句優化 1
    :)一、問題的提出在應用系統開發初期,由於開發資料庫數據比較少,對於查詢SQL語句,複雜視圖的的編寫等體會不出SQL語句各種寫法的性能優劣,但是如果將應用系統提交實際應用後,隨著資料庫中數據的增加,系統的響應速度就成為目前系統需要解決的最主要的問題之一。系統優化中一個很重要的方面就是SQL語句的優化。
  • hive強制select * 進行MapReduce任務
    簡介    由於hive本身的優化機制,一些簡單的語句如select *,select 欄位1,欄位2 from table,hive
  • 訪問Hive數據的幾種騷姿勢
    conn = DriverManager.getConnection(hiveConfigModel.getUrl(),                hiveConfigModel.getUsername(), hiveConfigModel.getPassword());        String sql = "show tables";
  • Hive高級-調優
    從以下幾個方面調優:1、架構調優2、參數調優3、SQL優化架構優化執行引擎Hive支持多種執行引擎,分別是MR、Tez、Spark、Flink,可以通過hive-site.xml文件中的hive.execution.engine屬性配置。
  • Hive 的Map/Reduce
    Hive是基於Hadoop的一個數據倉庫工具,用來進行數據提取、轉化、加載,這是一種可以存儲、查詢和分析存儲在Hadoop中的大規模數據的機制
  • SQL語句性能調整之ORACLE的執行計劃
    如何產生執行計劃  要為一個語句生成執行計劃,可以有3種方法:  1).最簡單的辦法  Sql> set autotrace on  Sql> select * from dual;  執行完語句後,會顯示explain