ArrayListのシリアル化された結果であるファイルを読み取る必要があるアプリケーションがあります。(ArrayList<String>
、このリストの50000レコード、サイズ:20MB)データをhadoopプラットフォームに読み込む方法が正確にわかりません。InputFormatとOutpurFormatをオーバーライドする必要があるという感覚しかありません。私はHadoopプラットフォームの初心者です。アドバイスをいただけますか?
ありがとう、
鄭。
まず、FileInputFormatを拡張する必要があります。特に、抽象FileInputFormat.createRecordReaderメソッドを実装する必要があります。
LineRecordReader(TextInputFormatがテキストファイルを処理するために使用するもの)のようなもののソースを調べることができます。
そこから、ほとんど自分で作業できます(つまり、ArrayListがどのようにシリアル化されているかによって異なります)。LineRecordReaderのソースを調べて、それをArrayListのシリアル化方法に関連付けてみてください。
その他の注意点として、ファイル形式は分割可能ですか?つまり、ファイル内のオフセットを探して、そこからストリームを回復できます(テキストファイルは、現在の行の終わりまでスキャンして、そこから開始することができます)。ファイル形式で圧縮を使用している場合は、これも考慮する必要があります(たとえば、gzipファイル内の位置をランダムに探すことはできません)。デフォルトでは、FileInputFormat.isSplittableはtrueを返しますが、最初にオーバーライドしてfalseにすることができます。'unsplittable'に固執する場合は、ファイルが単一のマッパーによって処理されることに注意してください(サイズに関係なく)。
Hadoopでデータを処理する前に、他の何かによってここにアップロードされなかった場合は、HDFSまたはサポートされている別の原因のファイルシステムにデータをアップロードする必要があります。アップロードプロセスを制御している場合は、アップロードステージのデータを次のように簡単に処理できるものに変換できます。
これは、Hadoopの内部に干渉する必要がないため、最も簡単なソリューションです。