MapReduce之InputFormat、OutputFormat(三)
文章目錄
- 1. 祝大家中秋節快樂
- 2. MapReduce進階
- 2.1 MapReduce類型
- 2.2 MapReduce輸入格式
- 2.2.1 InputFormat接口
- 2.2.2 InputFormat接口的實現類
- 2.3 MapReduce輸出格式
- 2.3.1 OutputFormat接口
- 2.3.2 OutputFormat接口的實現類
- 3. 小結
1. 祝大家中秋節快樂
身在長安,心在泰安,又是一年中秋佳節,相思之情,溢于言表。現留杜甫一詩與大家共勉。
今夜鄜州月,閨中只獨看。
遙憐小兒女,未解憶長安。
香霧云鬟濕,清輝玉臂寒。
何時倚虛幌,雙照淚痕干。
2. MapReduce進階
2.1 MapReduce類型
2.2 MapReduce輸入格式
2.2.1 InputFormat接口
InputFormat類定義了如何分割和讀取輸入文件,它提供了以下功能:
InputFormat接口包含了以下兩種方法:
方法說明:
getSplits(JobContext context)方法負責將一個大數據邏輯分成許多片,比如數據庫表有100條數據,按照主鍵ID升序存儲,假設每20條分成一片,這個List的大小就是5,然后每個InputSplit記錄兩個參數,第一個為這個分片的起始ID,第二個為這個分片數據的大小,這里是20。很明顯InputSplit并沒有真正存儲數據,只是提供了一個如何將數據分片的方法。
createRecordReader方法,根據定義,返回一個能夠讀取分片記錄的RecordReader。getSplit用來獲取由輸入文件計算出來的InputSplit,后面計算InputSplit時,會考慮輸入文件是否可分割、文件存儲時分塊的大小和文件大小等因素;而createRecordReader()方法提供了RecordReader的實現,將key-value對從InputSplit中正確讀出來,比如LineRecordReader,它是以偏移值為Key,每行的數據為Value,這使所有createRecordReader()返回LineRecordReader的InputFormat都是以偏移值為Key、每行數據為Value的形式讀取輸入分片的。
2.2.2 InputFormat接口的實現類
InputFormat接口實現類有很多,其層次結構如下所示:
常用的實現類介紹:
FileInputFormat是所有使用文件作為其數據源的InputFormat實現的基類,它的主要作用是指出作業的輸入文件位置。因為作業的輸入被設定為一組路徑,這對指定作業輸入提供了很強的靈活性。FileInputFormat提供了四種靜態方法來設定作業的輸入路徑:
每一行均為一條記錄,被分隔符(缺省是tab)分割為key(Text),value(Text),當然分隔符可以自己設定。
默認的輸入格式是TextInputFormat,它把輸入文件每一行作為單獨的一個記錄,但不做解析處理,這對那些沒有被格式化的數據或是基于行的記錄來說是很有用的,比如日志文件。
2.3 MapReduce輸出格式
2.3.1 OutputFormat接口
OutputFormat接口主要用于描述輸出數據的格式,它能夠將用戶提供的key/value對寫入特定格式的文件中。其功能與前面描述的InputFormat相似,Hadoop提供的OutputFormat實例會把文件寫在本地磁盤或HDFS上。每一個reducer會把結果輸出寫在公共文件夾中一個單獨的文件內。這些文件一般命名為:part-xxxxx,而xxxxx是關聯到某個reduce任務的partition的id。
2.3.2 OutputFormat接口的實現類
下圖為OutputFormat接口的實現類層次圖:
常用的OutputFormat實現類的介紹:
默認的輸出格式是TextOutputFormat,它把每條記錄寫為文本行。它的鍵和值可以實現Writable的任意類型,因為TextOutputFormat調用toString()方法把他們轉換為字符串。每一個key/value鍵值對都以制表符為分隔符,當然也可以自行設定(mapreduce.output.textoutputfomat.separator),與FileOutputFormat對應的輸入格式是KeyValueTextInputFormat,它可以通過配置分隔符將key/value進行文本分割。
同時,可以使用NullWritable來省略輸出的key或value,或者兩個都省略,相當于NullOutputFormat的輸出格式,這也會導致無分隔符的輸出,以使輸出適合用TextInputFormat讀取。
SequenceFileOutputFormat將它的輸出寫為一個順序文件。如果輸出需要作為后續的MapReduce任務的輸入,這便是一種合適的輸出格式,可以通過快速的序列化任意的數據類型到文件中,而對應SequenceFileInputFormat則會把文件反序列化為相同類型并提交到下一個Mapper的輸入數據。
3. 小結
下期預告以及下下期預告:
總結
以上是生活随笔為你收集整理的MapReduce之InputFormat、OutputFormat(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java--快速输出sql语句
- 下一篇: 从财报看爱奇艺增长想象 长视频巨头要说“