用mapreduce來操作hbase的兩點優化
用MR來對hbase的表資料進行分散式計算。有兩點配置可以優化操作,提升效能。它們分別是:
(1)scan.setCacheBlocks(false);
然後呼叫下面這句來初始化map任務 TableMapReduceUtil.initTableMapperJob
這個配置項是幹什麼的呢? 本次mr任務scan的所有資料不放在快取中,一方面節省了交換快取的操作消耗,可以提升本次mr任務的效率,另一方面,一般mr任務scan的資料都是一次性或者非經常用到的,因此不需要將它們替換到快取中,快取中還是放一些正常的多次訪問的資料,這樣可以提升查詢效能。
(2)conf.setBoolean("mapred.map.tasks.speculative.execution", false);
這個 "mapred.map.tasks.speculative.execution" 配置項是幹什麼用的呢?
是否開啟mr的map備用任務機制,如果設為true,則如果一個map任務佔用時間較其他的明顯長很多(策略由內部設定),在其他TT節點上新建一個map任務,兩個一起做,誰先做完,便結束。
優化項是將其設為false,為何呢,跟hbase儲存機制有關,hbase本地儲存機制,即hbase會盡量把hdfs上的資料檔案和rs上對應region存在一臺機器上,即當前的map的資料肯定在當前的機器上有本地資料,不需要網路傳輸。如果啟用備用任務機制,則新建立備用任務時,很有可能新建備用任務的機器上沒有所需要的資料的備份,如此便需要網路傳輸資料,增加了網路的開銷,其效率會大大的降低,還不如不開啟備用任務,就讓原來的map任務正常做呢。當然,即便關閉了此機制,如果建立map失敗(比如由於oom異常)仍然會在其他節點上重新建立此map任務。