最近看了很多如何讓hadoop執行時間減少的文章,一點自己的理解,記錄如下
1)壓縮map輸出和reduce輸出
壓縮輸出結果,不僅可以減少寫資料,還可以加快map到ruduce的傳輸速度,有利於加快執行時間。
2)不要重複建立物件
儘量在mapper或者reducer的類中去建立,不要重複的在map函式中建立物件。
3)scan的引數設定
在掃描資料庫表時,scan的一些屬性:hbase.scan.catching 和 hbase.scan.batch 都是可以一次性的返回
多條記錄,避免每次都要去訪問資料庫,同時要注意只設定自己需要的columnFamily就可以了,減少不必要的
資料返回,同時設定scan.setCatchingBlocks(false),這樣可以避免掃庫的時候重寫了快取,因為掃庫這種動作
不代表真實的查詢頻率,不應該覆蓋快取。
4)推測執行
mapred.map.tasks.speculative.execution,此屬性預設為true,即當程式感知到某個map的執行時間較慢,會
在另外一個機器上執行同樣的任務,成功後kill掉當前執行的任務。個人感覺這個引數在資源充足的時候,可以設定
為false,避免浪費資源。在資源不足的時候,可以開啟此引數,避免因為某些任務過慢,影響整體任務的執行時間。
5)hbase的引數設定(客戶端設定無效)
hbase.regionserver.handler.count
regionserver的工作執行緒數量,預設是10,沒有疑問,官方預設值太小,通常都調到100~200之間,提高regionserver效能。
hbase.regionserver.lease.period
regionserer租約時間,預設值是60s,也有點小,如果你的生產環境中,在執行一些任務時,如mapred時出現lease超時的報錯,那這個時候就需要去調大這個值了。
hfile.block.cache.size
regionserver cache的大小,預設是0.2,是整個堆記憶體的多少比例作為regionserver的cache,調大該值會提升查詢效能,當然也不能過大,如果你的hbase都大量的查詢,
寫入不是很多的話,調到0.5也就夠了。