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