軟體環境:hive1.2.1 /hadoop2.6.4 ;直接使用hive cli模式執行;
1. 設定執行引擎
set hive.execution.engine=mr;
set hive.execution.engine=spark;
如果設定執行引擎為mr,那麼就會呼叫hadoop的maprecude來執行需要執行job的程式;如果設定執行引擎為spark,那麼就會呼叫spark來執行任務。有條件的話,就設定執行引擎為spark,因為實在是執行的比hadoop的mapreduce快了很多。
2. 針對mr調優,可以設定引數(針對map端):
set mapred.max.split.size=1000000;
這個設定每個map處理的資料大小,如果現在有乙個10m的資料,那麼設定引數如上,執行可以有多少個map任務呢?
10個 = 10 m / 1000000
mapreduce.map.memory.mb=4096 // 設定申請map資源 記憶體
mapreduce.map.cpu.vcores=1 //設定申請cpu資源(useless)
第乙個引數是設定map申請的記憶體大小,單位是m,這是設定也就是4g;第二個引數設定是map的cpu資源,不過這個設定沒有效果(在實驗的過程中因為在yarn的配置中並沒有做這個配置,所以導致失效,也就是不管設定為多少其占用都是1個;如果要觀察到實驗效果,那麼可以考慮配置集群yarn相關配置);
那假設現在有144個map任務,集群資源為:3子節點*8g記憶體*8核cpu,啟動hive的mr任務,同時會有多少個任務在執行呢?
要回答這個問題,就需要梳理下mapreduce執行任務時,yarn資源分配的流程;
2) 接下來怎麼判斷可以同時執行多少個map任務呢?
現在集群還剩資源= 22g記憶體+23核cpu ,如果map任務配置記憶體為4g,核心為1核那麼,能同時執行:
5 = min(22g/4g = 5 , 23/ 1 = 23 )
也就是同時執行5個map任務,如下:
3)那這時集群還剩多少資源呢?
(3*8g記憶體 + 3*8核cpu )- (1核cpu,2g記憶體) - 5 * (4g記憶體,1核cpu) = (2g記憶體,18核cpu)
驗證一下:
3. 針對mr調優,可以設定引數(針對reduce端),這個暫時沒有實驗,暫時給出乙個參考:
mapreduce.job.reduces=2(可手工設定)
hive.exec.reducers.max (hive設定的最大可用reducer)
hive.exec.reducers.bytes.per.reducer (hive預設每1g檔案分配乙個reduce)
分配演算法
num_reduce_tasks=min[maxreucers,input.size/perreducer]
分享,成長,快樂
腳踏實地,專注
hive效能調優
原文 limit 限制調整 因為使用 limit 語句時候,是先執行整個查詢語句,然後再返回部分結果的 set hive.limit.optimize.enable true set hive.limit.row.max.size 10000 set hive.limit.optimize.limi...
Hive實戰效能調優
hive是乙個資料倉儲基礎工具在hadoop中用來處理結構化資料。它架構在hadoop之上,總歸為大資料,並使得查詢和分析方便。並提供簡單的sql查詢功能,可以將sql語句轉換為mapreduce任務進行執行。hive 構建在基於靜態批處理的hadoop 之上,hadoop 通常都有較高的延遲並且在...
hive效能調優總結
1.fetch抓取 hive.fetch.task.conversion more 在某些情況下不必要使用mr計算。hive預設是minimal,該屬性修改為more以後,在全域性查詢 字段查詢 limit查詢等都不走mapreduce。2.本地模式 hive在進行集群作業時多台機器上協調執行,解決...