1はじめに
-
FileInputFormatは主に、MapReduceでファイルを複数のスライスInputSplitに分割し、さまざまなレコードリーダーRecordReaderに従ってスライスデータを読み取り、マップの入力として標準の<key、value>キーと値のペアに変換する役割を果たします。
-
また、FileInputFormatには多くの異なる実装サブクラスがあり、各実装クラスには異なるスライスメカニズムとレコード読み取りメカニズムがあります。
-
さまざまな実装クラスは次のとおりです
ヒント:
- データスライスは、入力を論理的にスライスするだけで、ストレージ用にディスク上でスライスしません。
2.FileInputFormatのデフォルトのスライスメカニズム
- ファイルブロックのサイズに応じてスライスします
- HDFSのデフォルトのストレージブロックサイズも128Mであるため、カットするデフォルトのブロックサイズは128Mです。このように、各MapTaskがスライスコンテンツを処理するときに、ノード間でデータをロードする必要がないため、伝送ネットワークのIOが削減されます。
- スライスする場合、データセット全体は考慮されませんが、各ファイルは1つずつ別々にスライスされます
たとえば
、MapReduce入力パスの下に2つのファイルがある場合、a.txtは320M、b.txtはサイズ
2で10Mであり、FileInputFormatによるスライス後に生成されるスライス情報は次のとおりです。
// 总产生4个切片,文件a有3个切片,文件b有1个切片
a.txt的切片1: 0~128M
a.txt的切片2: 128~256M
a.txt的切片3: 256~320M
b.txt的切片1: 0~10M
3、TextInputFormat
-
スライスメカニズムはFileInputFormatと一致しています
-
TextInput Formatは、デフォルトのFilelnputFormat実装クラスです。
-
レコードリーダーRecordReaderは各レコードを1行ずつ読み取ります。
-
読み取り後、キーKeyは、ファイル全体の行の開始バイトオフセット、Long書き込み可能タイプです。値は、この行の内容です。ただし、行末記号(newlineおよびcarriage return)、テキストタイプは除きます。。このキーと値のペアは、マッパーの入力として使用されます
ケース:
スライスに含まれるコンテンツ情報は次のとおりです
1 ---b c
2 ---e f
3 ---a b
次に、TextInputFormatによって読み取られた後の<key、value>出力は次のとおりです。
(0,"---b c")
(6,"---e f")
(12,"---a b")
4、KeyValueTextInputFormat
- スライスメカニズムはFileInputFormatと一致しています
- レコードリーダーRecordReaderは行ごとに読み取られますが、読み取った後、各行は2つの部分に分割され、最初の部分がキーとして使用され、後半が値として出力されます。
- デフォルトのカッティングセパレーターはtab(\ t)で、これは構成のsetメソッドで設定できます。たとえば、ここでは "—cutting" conf.set(KeyValueLineRecordReader.KEY_VALUE_SEPERATOR、 "—");を押すように設定されています。
ケース:
スライスに含まれるコンテンツ情報は次のとおりです
1 --- b c
2 --- e f
3 --- a b
次に、KeyValueTextInputFormatで読み取った後の<key、value>出力は次のとおりです。
(1,"b c")
(2,"e f")
(3,"a b")
5、NLineInputFormat
- スライスメカニズムはFileInputFormatとは異なります。設定された行数に応じてスライスされます
- レコードリーダーRecordReaderメカニズムはTextInputFormatと一貫性があります
ケース:
スライスに含まれるコンテンツ情報は次のとおりです
1 --- b c
2 --- e f
3 --- a b
4 --- g d
5 --- f d
切断行数が2に設定されている場合、2行ごとに1つのスライスに分割され、3つのスライスが生成されます。次に、各スライスがRecordReaderによって読み取られた後、出力<key、value>はTextInputFormat
スライス1と一致します。
(0,"---b c")
(6,"---e f")
スライス2:
(12,"---a b")
(18,"---g d")
スライス3:
(24,"---f d")
6、CombineTextInputFormat
- スライスメカニズムはFileInputFormatとは異なります
- FileInputFormatは各ファイルを個別にスライスするため、ファイルがどれほど小さくても、各ファイルは1つ以上のスライスを生成します。CombineTextInputFormatは複数の小さなファイルを1つのスライスに論理的に計画できるため、送信のみが可能です。 MapTask処理を行います。
- アプリケーション:CombineTextInputFormatは、複数の小さなファイルの処理に適しています
6.1スライスメカニズム
- 最大仮想ストレージスライスと呼ばれるパラメータセットに従ってスライスする必要があります。
- 仮想ストレージファイルは、最初に仮想ストレージ部門を通じて生成され、次に仮想ストレージファイルの結果情報に従ってスライスされます。
ケース:
最大仮想ストレージスライスが4Mに設定されている
とすると、次の5つのファイルとそのサイズがあります
。a.txt(1.7M)
b.txt(5.1M)
c.txt(3.4 M)
d.txt(6.8M)
e.txt (10M)
ステップ1:仮想ストレージのパーティショニングプロセス
-分割の原則、各ファイルを処理する際に、設定した仮想ストレージスライスの最大値(4M)と順番に比較します。設定した最大値以下の場合は、論理的にブロックを分割します。入力ファイルが設定された最大値より大きく、2倍を超える場合は、最大値で1つのブロックを切り取ります。残りのデータサイズが設定された最大値を超え、最大値の2倍以下の場合、ファイルはこの時点で2つの仮想ストレージブロックに分割されます。
仮想保存手順 | |
---|---|
a.txt(1.7M) | 1.7 <4であるため、1つのブロックに分割されます |
b.txt(5.1M) | 5.1> 4で(2 x 4M)未満であるため、2つに均等に分割されます。つまり、ブロック1 [0,2.55]とブロック2 [2.56,5.1]です。 |
c.txt(3.4 M) | 3.4 <4であるため、1つのブロックに分割されます |
d.txt(6.8M) | 6.8> 4で(2 x 4M)未満であるため、2つに均等に分割されます。ブロック1とブロック2はどちらも3.4Mです。 |
e.txt(10M) | 10>(2 x 4M)であるため、ブロック1は4Mに分割され、残りの6Mはb.txtのスライスルールを繰り返し、ブロック2とブロック3はそれぞれ3Mに分割されます。 |
上記の表によると、最終的な仮想ストレージファイルブロックは
1.7M
2.55M
2.55M
3.4M
3.4M
3.4M
4M
3M
3M
ステップ2:仮想ストレージファイルブロックの結果に従ってスライスする
- 1)仮想ストレージのファイルサイズが仮想ストレージスライスの最大値より大きいかどうかを判断し、最大値以上の場合は、スライスが個別に形成されます。
- 2)以下の場合は、次の仮想ストレージファイルとマージしてスライスを形成します
マージ後に5つのスライスが生成されます
(1.7 + 2.55)M
(2.55 + 3.4) M
(3.4 + 3.4) M
4M
(3 + 3) M
6.2レコード読み取りメカニズム
- TextInputFormatと同様に、各スライスの内容は1行ずつ読み取られます。出力キーはファイル全体の行の開始バイトオフセットであり、値は行の内容です。
7.違いと比較
実装クラス | スライスメカニズム | レコード読み取りメカニズムRecordReader | 出力結果-(KeyIn、KeyOut) |
---|---|---|---|
TextInputFormat | ブロックスライス | 行ごとの出力 | (各行の開始オフセット、各行の内容) |
KeyValueTextInputFormat | ブロックスライス | 出力の各行を区切り文字で分割します | (切断前の部分、切断後の部分) |
NLineInputFormat | 行番号Nでスライス | 行ごとの出力 | (各行の開始オフセット、各行の内容) |
CombineTextInputFormat | 仮想ストレージファイルによるスライス | 行ごとの出力 | (各行の開始オフセット、各行の内容) |