1. 程式人生 > >hadoop學習;自定義Input/OutputFormat;類引用mapreduce.mapper;三種模式

hadoop學習;自定義Input/OutputFormat;類引用mapreduce.mapper;三種模式

hadoop分割與讀取輸入檔案的方式被定義在InputFormat介面的一個實現中,TextInputFormat是預設的實現,當你想要一次獲取一行內容作為輸入資料時又沒有確定的鍵,從TextInputFormat返回的鍵為每行的位元組偏移量,但目前沒看到用過

以前在mapper中曾使用LongWritable(鍵)和Text(值),在TextInputFormat中,因為鍵是位元組偏移量,可以是LongWritable型別,而當使用KeyValueTextInputFormat時,第一個分隔符前後都是Text型別,所以你必須修改mapper的實現以及map()方法來適應這個新鍵型別

一個MapReduce的輸入不一定是外部資料,常常是一些其他MapReduce的輸出資料,還可以自定義輸出格式,預設的輸出格式與KeyValueTextInputFormat能夠讀取的的資料格式保持一致(記錄中的每行均為一個由製表符分隔的鍵和值),不過Hadoop提供了更加有效的二進位制壓縮檔案格式,稱為序列檔案,這個序列檔案為hadoop處理做了優化,當連線多個MapReduce作業時,它是首選,讀取序列檔案的類為SequenceFileInputFormat,序列檔案的鍵和值物件可以由使用者自定義,輸出和輸入型別必須匹配

自定義InputFormat,實現兩個方法:

getSplit()確定所有用於輸入資料的檔案,並將輸入資料分割為輸入分片,每個map任務處理一個分片

getRecordReader()迴圈提取給定分片中的記錄,並解析每個記錄為預定義型別的鍵和值

在實際情況中一個分片總是以資料塊為大小,在HDFS中預設一個塊為64MB

FileInputFormat中isSplitable()方法,檢查你是否可以將給定檔案分片,預設返回為true,有時你可能想要一個檔案為其自身的分塊,這時可以設定返回為false

LineRecordReader實現RecordReader,基於實現的封裝,大多數操作存放在next中

我們通過擴充套件FileInputFormat生成我們的InputFormat類,並實現一個factory方法來返回recordreader

除了類的構建之外,TimeUrlRecordReader會在RecordReader實現6種方法,它主要在KeyValueInputFormat之外的一個封裝,但吧記錄的Text型別轉換為URLWritable

輸出資料到檔案時,使用的是OutputFormat,因為每個reducer僅需將它的輸出寫入自己的檔案中,輸出不需要分片。

輸出檔案放在一個公用目錄中,通常命名為part-nnnnn,這裡的nnnnn是reducer的分割槽ID,RecordWriter對輸出結果進行格式化,而RecordReader對輸入格式進行解析

NullOutPutFormat簡單的實現了OutputFormat,無輸出,並不需要繼承FileOutputFormat。更主要的是OutputFormat(InputFormat)處理的是資料庫,並非檔案

個性化輸出可以在繼承了FileOutputFormat的類中的封裝的繼承RecordReader類中的write()方法,如果不只想輸出到檔案中

jar -xvf  ../example.jar  解壓jar包

向hdfs遷移本地檔案可以,程式中地址別寫錯了,別寫成其他不關聯的機子上的

在eclipse中寫完程式,打成jar包,放到hadoop資料夾下,執行hadoop指令可以檢視結果

若運用第三方外掛fatjar,將mapreduce的jar包和jedis的jar包整合到一起放入hadoop,這樣不需要修改manifest配置資訊

搭建三種模式,一般預設單機模式:不使用HDFS,也不載入任何守護程序,主要用於開發除錯

偽分佈模式在“單節點叢集”上執行hadoop,其中所有守護程序都在一臺機子上,增加了程式碼除錯功能,允許檢查記憶體使用情況,HDFS輸入輸出,以及其他的守護程序互動

全分佈模式,真實情況用這種模式,強調分散式儲存和分散式計算,明確聲明瞭NameNode和JobTracker守護程序所在的主機名。增大了HDFS備份引數發揮分散式儲存優勢