溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Hadoop中怎么實(shí)現(xiàn)MapReduce的數(shù)據(jù)輸入

發(fā)布時(shí)間:2021-12-22 17:22:10 來(lái)源:億速云 閱讀:143 作者:iii 欄目:云計(jì)算

這篇文章主要講解了“Hadoop中怎么實(shí)現(xiàn)MapReduce的數(shù)據(jù)輸入”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Hadoop中怎么實(shí)現(xiàn)MapReduce的數(shù)據(jù)輸入”吧!

接下來(lái)我們按照MapReduce過程中數(shù)據(jù)流動(dòng)的順序,來(lái)分解org.apache.hadoop.mapreduce.lib.*的相關(guān)內(nèi)容,并介紹對(duì)應(yīng)的基類的功能。首先是input部分,它實(shí)現(xiàn)了MapReduce的數(shù)據(jù)輸入部分。類圖如下:

Hadoop中怎么實(shí)現(xiàn)MapReduce的數(shù)據(jù)輸入 

類圖的右上角是InputFormat,它描述了一個(gè)MapReduceJob的輸入,通過InputFormat,Hadoop可以:

l          檢查MapReduce輸入數(shù)據(jù)的正確性;

l          將輸入數(shù)據(jù)切分為邏輯塊InputSplit,這些塊會(huì)分配給Mapper;

l          提供一個(gè)RecordReader實(shí)現(xiàn),Mapper用該實(shí)現(xiàn)從InputSplit中讀取輸入的<K,V>對(duì)。

在org.apache.hadoop.mapreduce.lib.input中,Hadoop為所有基于文件的InputFormat提供了一個(gè)虛基類FileInputFormat。下面幾個(gè)參數(shù)可以用于配置FileInputFormat:

l          mapred.input.pathFilter.class:輸入文件過濾器,通過過濾器的文件才會(huì)加入InputFormat;

l          mapred.min.split.size:最小的劃分大小;

l           mapred.max.split.size:最大的劃分大小;

l          mapred.input.dir:輸入路徑,用逗號(hào)做分割。

類中比較重要的方法有:

  protectedList<FileStatus> listStatus(Configuration job)

遞歸獲取輸入數(shù)據(jù)目錄中的所有文件(包括文件信息),輸入的job是系統(tǒng)運(yùn)行的配置Configuration,包含了上面我們提到的參數(shù)。

  publicList<InputSplit> getSplits(JobContext context)

將輸入劃分為InputSplit,包含兩個(gè)循環(huán),第一個(gè)循環(huán)處理所有的文件,對(duì)于每一個(gè)文件,根據(jù)輸入的劃分最大/最小值,循環(huán)得到文件上的劃分。注意,劃分不會(huì)跨越文件。
FileInputFormat沒有實(shí)現(xiàn)InputFormat的createRecordReader方法。
FileInputFormat有兩個(gè)子類,SequenceFileInputFormat是Hadoop定義的一種二進(jìn)制形式存放的鍵/值文件(參考http://hadoop.apache.org/core/do ... o/SequenceFile.html),它有自己定義的文件布局。由于它有特殊的擴(kuò)展名,所以SequenceFileInputFormat重載了listStatus,同時(shí),它實(shí)現(xiàn)了createRecordReader,返回一個(gè)SequenceFileRecordReader對(duì)象。TextInputFormat處理的是文本文件,createRecordReader返回的是LineRecordReader的實(shí)例。這兩個(gè)類都沒有重載FileInputFormat的getSplits方法,那么,在他們對(duì)于的RecordReader中,必須考慮FileInputFormat對(duì)輸入的劃分方式。
FileInputFormat的getSplits,返回的是FileSplit。這是一個(gè)很簡(jiǎn)單的類,包含的屬性(文件名,起始偏移量,劃分的長(zhǎng)度和可能的目標(biāo)機(jī)器)已經(jīng)足以說明這個(gè)類的功能。
RecordReader用于在劃分中讀取<Key,Value>對(duì)。RecordReader有五個(gè)虛方法,分別是:

l          initialize:初始化,輸入?yún)?shù)包括該Reader工作的數(shù)據(jù)劃分InputSplit和Job的上下文context;

l          nextKey:得到輸入的下一個(gè)Key,如果數(shù)據(jù)劃分已經(jīng)沒有新的記錄,返回空;

l          nextValue:得到Key對(duì)應(yīng)的Value,必須在調(diào)用nextKey后調(diào)用;

l          getProgress:得到現(xiàn)在的進(jìn)度;

l          close,來(lái)自java.io的Closeable接口,用于清理RecordReader。

我們以LineRecordReader為例,來(lái)分析RecordReader的構(gòu)成。前面我們已經(jīng)分析過FileInputFormat對(duì)文件的劃分了,劃分完的Split包括了文件名,起始偏移量,劃分的長(zhǎng)度。由于文件是文本文件,LineRecordReader的初始化方法initialize會(huì)創(chuàng)建一個(gè)基于行的讀取對(duì)象LineReader(定義在org.apache.hadoop.util中,我們就不分析啦),然后跳過輸入的最開始的部分(只在Split的起始偏移量不為0的情況下進(jìn)行,這時(shí)最開始的部分可能是上一個(gè)Split的最后一行的一部分)。nextKey的處理很簡(jiǎn)單,它使用當(dāng)前的偏移量作為Key,nextValue當(dāng)然就是偏移量開始的那一行了(如果行很長(zhǎng),可能出現(xiàn)截?cái)啵_M(jìn)度getProgress和close都很簡(jiǎn)單。

感謝各位的閱讀,以上就是“Hadoop中怎么實(shí)現(xiàn)MapReduce的數(shù)據(jù)輸入”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Hadoop中怎么實(shí)現(xiàn)MapReduce的數(shù)據(jù)輸入這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI