1. 程式人生 > >MR程式編寫

MR程式編寫

做了一個有關於讀取三張hbase表處理進行統一處理的專案:

(1)MR中讀取多張表:TableMapReduceUtil.initTableMapperJob()支援對多張scan組成的list,每個scan是對每張表的瀏覽,其中scan又可以對錶進行過濾類似於hbase。

<span style="font-size:14px;">List scans = new ArrayList<>();
		
Scan scan1 = new Scan();
scan1.setAttribute(Scan.SCAN_ATTRIBUTES_TABLE_NAME, "7111".getBytes());
scans.add(scan1);
		
Scan scan2 = new Scan();
scan2.setAttribute(Scan.SCAN_ATTRIBUTES_TABLE_NAME, "8111".getBytes());
scans.add(scan2);
	
Scan scan3 = new Scan();
scan3.setAttribute(Scan.SCAN_ATTRIBUTES_TABLE_NAME, "9111".getBytes());
scans.add(scan3);

TableMapReduceUtil.initTableMapperJob(scans, MyMapper.class, Text.class, Text.class, job);</span>

(2)在Hbase中不同的表有相同的行健,可以存在相同的列族與列。此時需要篩選資料得到不同的資料,這時候就需要區分度,這次是僥倖,行鍵由時間戳構成易於區分。可以在全域性configure中傳遞資料,使用context.getConfiguration.get()獲取資料,但是在每次執行map(實際上每次讀取hbase表,都是重新執行一次map階段)的時候又會重新獲取configuration,所以獲取的資料又是初始值。

(3)寫入本地檔案,在本地執行MR的時候,在靜態程式碼塊中定義好

conf.set("fs.default.name", "hdfs://localhost:9000")
如果新增這句程式碼,預設的是hdfs檔案系統機hadoop儲存系統,如果不新增的話便是儲存在本地的系統中。但是還沒有研究如果在分散式條件下是什麼情況,還有就是偽分散式條件下的叢集執行。

(4)在MR執行的過程中,map階段結束後,進入shuffle階段會進行一次排序,此時如果設定了Combine,又會進行一次設定即執行了一次Reducer程式碼階段。切記是否需要兩次同時執行。

(5)CSV檔案是逗號分隔符檔案(並不侷限於這一種符號,還可以是其他的符號,如分號、Tab鍵、引號等),這種檔案可以使用excel檔案進行開啟,在開啟時,首先新建一個excel檔案,然後資料---本地文字--選擇CSV檔案,接下來根據提示進行操作就可以了。
(6)conf在加入引數的時候一定要在job定義之前,因為job的定義是以configuration問引數的。