Hadoopの入力および出力形式として機能し、C ++、Java、およびPythonで直接Hadoopとは別に読み取りおよび書き込みが可能な、移植可能なKey-Valueデータファイル形式を探しています。1つの落とし穴...Java以外のマッパーとレデューサー(特にHadoopパイプを介したc ++)での処理をサポートする必要があります。
何か案は?HadoopおよびHadoopパイプと相互運用する独自のポータブルKey-Valueファイル形式を作成する必要がありますか?そのような新しいフォーマットはコミュニティに役立つでしょうか?
長いバージョン: Hadoopシーケンスファイル(およびそれらのいとこであるMap、Set、Array、BloomMap)は、Hadoopを使用する場合の効率的なバイナリキー値データストレージの標準のようです。シーケンスファイルの欠点の1つは、Javaでのみ読み取りと書き込みができることです(シリアル化されたJavaオブジェクトで指定されます)。さまざまなステージへの入力と出力がC++、java、およびpythonから読み取りおよび書き込み可能でなければならない、複雑なマルチステージMapReduceパイプラインを構築したいと思います。さらに、マッピング段階で大規模で高度に最適化されたc ++ライブラリを使用するには、Java以外の言語(つまりc ++)でマッパーとリデューサーを記述できる必要があります。
さまざまな回避策を検討しましたが、どれも魅力的ではないようです。
- 変換:各MapReduceステージの前後に変換ステージを追加して、シーケンスファイルと他の言語と互換性のあるポータブル形式の間でステージの入力と出力を変換します。
- 問題:ステージ間で消費および生成されるデータは非常に大きい(TB)...異なるプログラミング言語で読み取り/書き込みアクセスを取得するためだけに、各ステージでデータを複数回複製するのはコストがかかります。10のステージがありますが、これは私が支払うにはオーバーヘッドが大きすぎます($$$)。
- Avroファイル:Avroのポータブルデータファイル形式を使用します。
- 問題:ポータブルAvroデータファイルをMapReduceの入力または出力形式として機能させるコードはあるようですが、Javaで記述されたマッパーとレデューサーでのみ機能します。avro / mapred / tetherパッケージを介して他の言語でマッパーのサポートを作成することについていくつかの議論を見てきましたが、現在サポートされているのはJavaのみです。ドキュメントから:「現在、テスト目的で実装されているのはJavaフレームワークのみであるため、この機能はまだ有用ではありません。」 http://avro.apache.org/docs/1.5.4/api/java/org/apache/avro/mapred/tether/package-summary.html
- Avro File + SWIG:分散キャッシュからアクセスされるカスタムSWIGラップされたc++ライブラリを呼び出すJavaマッパーでAvroデータ形式を使用して実際の処理を実行します。
- Java文字列の不変性により、コピーが必要なため、SWIGラッパーの作成が面倒で非効率になります。また、この多くのラッピングのレイヤーは、メンテナンス、デバッグ、および構成の悪夢になり始めています。
HadoopおよびHadoopパイプと相互運用するHファイル形式に基づいた独自の言語のポータブルKey-Valueファイル形式を作成することを検討しています...既製のより良い代替手段はありますか?そのようなポータブルフォーマットはコミュニティに役立つでしょうか?