<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    so true

    心懷未來,開創未來!
    隨筆 - 160, 文章 - 0, 評論 - 40, 引用 - 0
    數據加載中……

    InputFormat學習

    InputFormat,就是為了能夠從一個jobconf中得到一個split集合(InputSplit[]),然后再為這個split集合配上一個合適的RecordReader(getRecordReader)來讀取每個split中的數據。

    InputSplit,繼承自Writable接口,因此一個InputSplit實則包含了四個接口函數,讀和寫(readFields和write),getLength能夠給出這個split中所記錄的數據大小,getLocations能夠得到這個split位于哪些主機之上(blkLocations[blkIndex].getHosts()),這里需要說明的是一個block要么對應一個split,要么對應多個split,因此每個split都可以從它所屬的block中獲取主機信息,而且我猜測block的大小應該是split的整數倍,否則有可能一個split跨越兩個block。

    對于RecordReader,其實這個接口主要就是為了維護一組<K,V>鍵值對,任何一個實現了該接口的類的構造函數都需要是“(Configuration conf, Class< ? extends InputSplit> split)”的形式,因為一個RecordReader是有針對性的,就是針對某種split來進行的,因此必須得與某種split綁定起來。這個接口中最重要的方法就是next,在利用next進行讀取K和V時,需要先通過createKey和createValue來創建K和V的對象,然后再傳給next作為參數,使得next對形參中的數據成員進行修改。

    一個file(FileStatus)分成多個block存儲(BlockLocation[]),每個block都有固定的大小(file.getBlockSize()),然后計算出每個split所需的大小(computeSplitSize(goalSize, minSize, blockSize)),然后將長度為length(file.getLen())的file分割為多個split,最后一個不足一個split大小的部分單獨為其分配一個split,最后返回這個file分割的最終結果(return splits.toArray(new FileSplit[splits.size()]))。

    一個job,會得到輸入的文件路徑(conf.get("mapred.input.dir", "")),然后據此可以得到一個Path[],對于每個Path,都可以得到一個fs(FileSystem fs = p.getFileSystem(job)),然后再得到一個FileStatus[](FileStatus[] matches = fs.globStatus(p, inputFilter)),再把里面的每個FileStatus拿出來,判斷其是否為dir,如果是的話就FileStatus stat:fs.listStatus(globStat.getPath(), inputFilter),然后再將stat加入到最終的結果集中result;如果是文件的話,那就直接加入到結果集中。說得簡潔一些,就是一個job會得到input.dir中的所有文件,每個文件都用FileStatus來記錄。

    MultiFileSplit的官方描述是“A sub-collection of input files. Unlike {@link FileSplit}, MultiFileSplit class does not represent a split of a file, but a split of input files into smaller sets. The atomic unit of split is a file.”,一個MultiFileSplit中含有多個小文件,每個文件應該只隸屬于一個block,然后getLocations就返回所有小文件對應的block的getHosts;getLength返回所有文件的大小總和。

    對于MultiFileInputFormat,它的getSplits返回的是一個MultiFileSplit的集合,也就是一個個的小文件簇,舉個簡單的例子就會很清楚了:假定這個job中有5個小文件,大小分別為2,3,5,1,4;假定我們期望split的總數目為3的話,先算出個double avgLengthPerSplit = ((double)totLength) / numSplits,結果應該為5;然后再切分,因此得到的三個文件簇為:{文件1和2}、{文件3}、{文件4和5}。如果這五個文件的大小分別為2,5,3,1,4;那么應該得到四個文件簇為:{文件1}、{文件2}、{文件3和4}、{文件5}。此外,這個類的getRecordReader依然是個abstract的方法,因此其子類必須得實現這個函數。

    posted on 2009-01-07 09:40 so true 閱讀(1648) 評論(0)  編輯  收藏 所屬分類: Hadoop


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 可以免费观看的国产视频| 黄网站色成年片大免费高清| 国产免费一区二区三区在线观看| 免费人成年激情视频在线观看| 国产精品观看在线亚洲人成网| 永久免费无码网站在线观看| 亚洲AV无码国产剧情| 四虎永久精品免费观看| 看成年女人免费午夜视频| 国产一级大片免费看| 一级毛片试看60分钟免费播放| 亚洲人成网站色在线入口| 中国好声音第二季免费播放| 亚洲av无码专区在线播放| 天天影院成人免费观看| 国产.亚洲.欧洲在线| 国产一区二区三区免费在线观看| 男人免费视频一区二区在线观看| 亚洲日韩国产成网在线观看| 成全视频在线观看免费| 久久亚洲精品国产精品| 亚洲Av永久无码精品三区在线| 四虎成人精品永久免费AV| 亚洲国产精品成人| 精品人妻系列无码人妻免费视频| 亚洲乱码日产一区三区| 131美女爱做免费毛片| 亚洲欧美精品午睡沙发| 亚洲精品视频免费观看| 日韩精品无码免费一区二区三区| 亚洲一区二区久久| 免费在线观看亚洲| 99re6在线视频精品免费下载| 亚洲已满18点击进入在线观看| 亚洲成人国产精品| 久久午夜夜伦鲁鲁片免费无码| 亚洲精品美女网站| 亚洲午夜福利在线观看| 一二三四在线观看免费高清中文在线观看 | 亚洲精品视频免费看| 亚洲自偷自拍另类12p|