數據遷移過程中hive sql調優
阿新 • • 發佈:2017-07-23
操作 reduce mapred set mon 事情 clas 過程 高效
本文記錄的是,在數據處理過程中,遇到了一個sql執行很慢,對一些大型的hive表還會出現OOM,一步一步通過參數的設置和sql優化,將其調優的過程。
先上sql
select t1.create_time from
(
select * from beatles_ods.route where year=2017 and month=07 and day=01
) t1
left outer join
(
select * from (select *,row_number() over(partition by id) num from beatles_test.route where year=2017 and month=07 and day=01) t where t.num =1
) t2
on t1.id = t2.id where t2.id = NULL;
可以看到這個sql由1個join,一個去重語句,組成,這兩種操作都是很耗費資源的。
1、對鏈接操作,小表放在鏈接左邊。
這是一個老生常談的事情了,在這裏不做細致介紹。基本來說,小表會減少mapreduce過程中的shuffle。
事實上“把小表放在前面做關聯可以提高效率”這種說法是錯誤的。正確的說法應該是“把重復關聯鍵少的表放在join前面做關聯可以提高join的效率。”
最終得出的結論是:寫在關聯左側的表每有1條重復的關聯鍵時底層就會多1次運算處理。
假設A表有一千萬個id,平均每個id有3條重復值,那麽把A表放在前面做關聯就會多做三千萬次的運算處理,這時候誰寫在前誰寫在後就看出性能的差別來了。
如果想深刻了解,請移步:
http://blog.sina.com.cn/s/blog_6ff05a2c01016j7n.html
2、調整reduce的個數,這個個數可以調整到256以內,並不是越大越好,太大會消耗集群上的資源,並增加匯總壓力。
set mapred.reduce.tasks = 30;
3、將內存調大,防止內存溢出
設置map和reduce的內存
set mapreduce.map.memory.mb=4096; set mapreduce.reduce.memory.mb=4096;
設置JVM內存
set mapreduce.map.java.opts=-Xmx2500M;
map和reduce可以視情況開大一些,我這裏設置的是4G。如果資源充裕的情況下,可以將此值設置的大一些。但是絕對不是越大越好,單純靠提升內存來優化程序是不被推薦的。
數據遷移過程中hive sql調優