1

ファイルを 1 行ずつではなく、1 つの単位として読み取って処理する必要がありますが、Hadoop MapReduce アプリケーションでこれを行う方法が明確ではありません。ファイルの最初の行をキーとして使用できるヘッダーとして読み取り、次の行を値として使用できる 2 次元データ配列を構築するためのデータとして読み取る必要があります。次に、データの 2 次元配列全体 (つまり、値) に対して何らかの分析を行います。

以下は、私がこの問題にどのように取り組むことを計画しているかです。これが合理的に見えない場合、またはこれを行うためのより良い方法がある場合は、コメントをいただければ幸いです (これは私の最初の本格的な MapReduce アプリケーションなので、おそらく作成中です)。新人のミス):

  1. テキスト ファイルの入力には、測点情報 (名前、緯度/経度、ID など) を含む 1 行と、年の値 (1956 年など) と 12 の月の値 (0.3 2.8 4.7 ...) を含む 1 つまたは複数の行が含まれています。スペースで。毎月の値 [number_of_years][12] の配列全体に対して処理を行う必要があるため、個々の行は単独では意味がありません。

  2. カスタム キー クラスを作成し、WritableComparable を実装します。これにより、入力テキスト ファイルの最初の行のヘッダー情報が保持されます。

  3. a) isSplitable() メソッドが false を返し、b) getRecordReader() メソッドがファイル分割を読み取り、それをカスタム キーおよび値クラスに変換する方法を知っているカスタム レコード リーダーを返す、カスタム入力形式クラスを作成します。

  4. 入力値 (月次値の 2 次元配列) を分析し、元のキー (ステーション ヘッダー情報) と出力値 (分析値の 2 次元配列) を出力するマッパー クラスを作成します。実行する実際の削減がないため、ラッパー レデューサー クラスのみがあります。

これが map reduce アプローチの適切な/正しいアプリケーションであるかどうかは明らかではありません。a) 単一のキーにマップされた単一の値 (データ配列) で分析を行っているため、および b) 単一の値しか存在しないためです。キーごとの値 (データ配列) の場合、実際の削減を実行する必要はありません。もう 1 つの問題は、処理しているファイルが比較的小さく、デフォルトの 64 MB の分割サイズよりもはるかに小さいことです。この場合、おそらく最初のタスクは、Definitive Hadoop O'Reilly book (p. 194 in the 2nd Edition) の SmallFilesToSequenceFileConverter の例に示されているように、入力ファイルをシーケンス ファイルに統合することでしょうか?

コメントや提案をお寄せいただきありがとうございます。

4

1 に答える 1

1

コーディングに関するあなたの計画は的確であるように見えます、私は同じことをします。ジョブへの入力として多数の入力ファイルが提供されている場合は、各ファイルに独自のInputSplitがあり、Hadoopでは実行されるマッパーの数が入力分割の数と同じであるため、Hadoopのメリットがあります。小さいファイルが多すぎると、HDFSNamenodeでのメモリ使用量が多すぎます。ファイルを統合するには、SequenceFilesまたはHadoopアーカイブ(tarに相当するhadoop)を使用できます。ドキュメントを参照してください。harファイル(Hadoopアーカイブ)を使用すると、各小さなファイルに独自のマッパーがあります。

于 2012-07-04T14:05:07.220 に答える