2016-05-06 6 views
1

ファイルサイズが100 MBで、デフォルトのブロックサイズが64 MBだとします。入力分割サイズを設定しないと、デフォルトの分割サイズはブロックサイズになります。現在、分割サイズも64 MBです。入力分割とハブロックのブロック

この100 MBファイルをHDFSに読み込むと、100 MBファイルは2つのブロックに分割されます。すなわち、64MBおよび36MBである。例えば、以下は100MBの詩の歌詞です。このデータをHDFSにロードすると、ライン1からライン16の半分まで正確に64 MBが1つのスプリット/ブロック(最大まで ""となり、ラインの残りの半分はとなります)を再生)を2番目のブロック(36 MB)としてファイルの最後に挿入します。マッパの仕事は2つあります。

私の質問は、ブロックがラインの半分しか持っていないか、または2番目のマッパーがブロック2の第1ラインをどのように考慮するかという点で、第1ラインのマッパーが第16ライン(ブロック1のライン16)また、ラインの半分を持っています。

Mary had a little lamb 
Little lamb, little lamb 
Mary had a little lamb 
Its fleece was white as snow 
And everywhere that Mary went 
Mary went, Mary went 
Everywhere that Mary went 
The lamb was sure to go 

He followed her to school one day 
School one day, school one day 
He followed her to school one day 
Which was against the rule 
It made the children laugh and play 
Laugh and play, laugh and play 
It made the children laugh and play 
To see a lamb at school 

And so the teacher turned him out 
Turned him out, turned him out 
And so the teacher turned him out 
But still he lingered near 
And waited patiently 
Patiently, patiently 
And wai-aited patiently 
Til Mary did appear 

64 MBを分割するときに、1行を分割する代わりに、hadoopは16行全体を考慮しますか?

答えて

1

入力分割サイズとブロックサイズに基づいてhadoopデータが読み込まれます。

  • ファイルは、サイズに基づいて複数のFileSplitに分割されます。各入力分割は、入力のオフセットに対応する開始パラメータで初期化されます。

  • LineRecordReaderを初期化すると、LineReaderをインスタンス化して行の読み取りを開始しようとします。

  • CompressionCodecが定義されている場合、境界が処理されます。 したがって、InputSplitの開始が0でない場合、1文字をバックトラックし、最初の行をスキップします(\ nまたは\ r \ nで見つかる).Backtrackは、有効な行をスキップしないようにします。ここで

コードは次のとおりです。

if (codec != null) { 
    in = new LineReader(codec.createInputStream(fileIn), job); 
    end = Long.MAX_VALUE; 
} else { 
    if (start != 0) { 
    skipFirstLine = true; 
    --start; 
    fileIn.seek(start); 
    } 
    in = new LineReader(fileIn, job); 
} 
if (skipFirstLine) { // skip first line and re-establish "start". 
    start += in.readLine(new Text(), 0, 
        (int)Math.min((long)Integer.MAX_VALUE, end - start)); 
} 
this.pos = start; 

分割がクライアントで計算されているので、マッパーが順番に実行する必要はありません、それは最初に破棄する必要がある場合、すべてのマッパーはすでに知っていますラインかどうか。だからあなたの場合のように

、まずブロックB1は、からデータを読み込みますライン

ブロックB2を確認するには」からデータを読み込みます「それは子供たちが笑って遊ぶ作られた」に0をオフセット子羊の学校 "最後の行のオフセットに線。

あなたは参照のためにこれらを参照することができます。

https://hadoopabcd.wordpress.com/2015/03/10/hdfs-file-block-and-input-split/
How does Hadoop process records split across block boundaries?

0

第1のマッパーは、第16行全体を読み込みます(行末が見つかるまで読み込みを続けます)。

mapreduceを適用するには、入力をキーと値のペアで構成する必要があります。 HadoopでデフォルトであるTextInputFormatの場合、これらのペアは(offset_from_file_beginning、line_of_text)です。テキストは、 '\ n'文字に基づいてそれらのキーと値のペアに分割されています。したがって、テキストの行が入力分割のサイズを超えた場合、マッパーは '\ n'が見つかるまで読み込みを続けます。

関連する問題