2017-03-16 16 views
1

サイズが39MBのファイルがあり、ブロックサイズを36MBに設定しました。ファイルがHDFSにアップロードされると、ファイルは2つのブロックに正常に保存されます。私は、このファイルに地図-削減の仕事(簡単な読み取りジョブ)を実行すると、ジョブカウンタが表示さ: 「INFO mapreduce.JobSubmitter:1:分割数」、それは2を検討しているされて入力分割を作成する(HADOOP)

単一の分割としてブロック、私の周りを見て、次の通りである分割サイズを計算するための公式を見つけた:

分割サイズ= MAX(MinSizeの、分(MAXSIZE、ブロックサイズ))

minsize = mapreduce.input.fileinputformat.split.minsizeおよびmaxsize = minsize = mapreduce.input.fileinputformat.split.maxsize。私は以下のプロパティを設定私のMRコードで今

Configuration conf = new Configuration() 
conf.set("mapreduce.input.fileinputformat.split.minsize","1") 
conf.set("mapreduce.input.fileinputformat.split.maxsize","134217728") 

MinSizeプロパティ= 1バイトとMAXSIZE = 128 MBですので、式に従って分割サイズが36メガバイトであり、したがって、2つの分割すべきであるべきですあるが、それでも私は同じカウンタ出力を取得しています:

INFO mapreduce.JobSubmitter:分割数:1

は、誰もが理由を説明することはできますか?

+0

どのようなファイルですか? –

+0

これは.csvファイルです@BinaryNerd – User9523

答えて

1

ファイルの最後の分割が10%オーバーフローする可能性があります。 SPLIT_SLOPといい、1.1に設定されています。このシナリオでは

39MB (Remaining Bytes)/36MB (Input Split Size) = 1.08 is less than 1.1 (SPLIT_SLOP) 

したがって、ファイル全体を1回の分割であると考えられます。

分割が分割されている方法についてのスニペット、

long bytesRemaining = FileSize; 
while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) { 
    String[][] splitHosts = getSplitHostsAndCachedHosts(blkLocations,length-bytesRemaining, splitSize, clusterMap); 
    splits.add(makeSplit(path, length-bytesRemaining, splitSize,splitHosts[0], splitHosts[1])); 
    bytesRemaining -= splitSize; 
} 

は、分割がファイルごとに分割されている方法を知ってgetSplits()方法を参照してください。

+0

これ(残りのバイト数)は合計ファイルサイズですか? – User9523

+1

この場合、ファイルのサイズが小さいため、ファイル全体が残りのバイトとして格納されているように見えます。例:ファイルサイズが「75MB」の場合、分割数は2になります。第1スプリットは「36MB」、第2スプリットは「39MB」となる。残りのバイトは、分割分割ごとに変更されます。更新された回答を参照 – franklinsijo

+0

SPLIT_SLOPの値を上書きできますか?最も重要なのは、その値を上書きすべきかどうかです。 – User9523

関連する問題