私のプロジェクトでは、約 2 TB のProtobufオブジェクトを分析したいと考えています。「象の鳥」ライブラリを介して、豚スクリプトでこれらのオブジェクトを使用したいと考えています。ただし、ファイルを HDFS に書き込んで ProtobufPigLoader クラスで使用できるようにする方法は完全には明らかではありません。
これは私が持っているものです:
豚のスクリプト:
register ../fs-c/lib/*.jar // this includes the elephant bird library
register ../fs-c/*.jar
raw_data = load 'hdfs://XXX/fsc-data2/XXX*' using com.twitter.elephantbird.pig.load.ProtobufPigLoader('de.pc2.dedup.fschunk.pig.PigProtocol.File');
インポート ツール (その一部):
def getWriter(filenamePath: Path) : ProtobufBlockWriter[de.pc2.dedup.fschunk.pig.PigProtocol.File] = {
val conf = new Configuration()
val fs = FileSystem.get(filenamePath.toUri(), conf)
val os = fs.create(filenamePath, true)
val writer = new ProtobufBlockWriter[de.pc2.dedup.fschunk.pig.PigProtocol.File](os, classOf[de.pc2.dedup.fschunk.pig.PigProtocol.File])
return writer
}
val writer = getWriter(new Path(filename))
val builder = de.pc2.dedup.fschunk.pig.PigProtocol.File.newBuilder()
writer.write(builder.build)
writer.finish()
writer.close()
インポート ツールは問題なく動作します。Hadoop-lzo 圧縮ライブラリを使用できないため、ProtobufPigLoader にいくつかの問題がありました。修正しないと (こちらを参照)、ProtobufPigLoader が機能しません。私が問題を抱えている問題は、DUMP raw_data;
returnUnable to open iterator for alias raw_data
とILLUSTRATE raw_data;
returnNo (valid) input data found!
です。
私にとっては、ProtobufBlockWriter データを ProtobufPigLoader で読み取れないようです。しかし、代わりに何を使用しますか?ProtobufPigLoader で処理できるように、外部ツールのデータを HDFS に書き込む方法。
別の質問:代わりに何を使用しますか? かなり大きなオブジェクトを Hadoop に書き込んで、Pig で使用するにはどうすればよいですか? オブジェクトはそれほど複雑ではありませんが、リスト (Protobuf の繰り返しフィールド) にサブオブジェクトの大きなリストが含まれています。
- データに対して大きすぎるため、テキスト形式や JSON は避けたいと考えています。データが 2 倍または 3 倍に肥大化することを期待しています (Base64 としてエンコードする必要がある多数の整数、多数のバイト文字列)。
- メインオブジェクトのIDが各サブオブジェクトにアタッチされるようにデータを正規化することは避けたいです(これは現在行われていることです)。これにより、スペースの消費が増え、後の処理で結合が必要になります。
アップデート:
- protobuf ローダー クラスの生成は使用しませんでしたが、リフレクション タイプ ローダーを使用します
- protobuf クラスは、登録されている jar 内にあります。
DESCRIBE
タイプを正しく表示します。