「ビッグ データ」ラムダ アーキテクチャ ブックに従って、型指定された Thift Data オブジェクトでいっぱいの着信ディレクトリを取得しました。DataPailStructure で定義された pail.meta ファイルがあります。
このデータのスナップショットを作成します。
Pail snapshotPail = newDataPail.snapshot(PailFactory.snapshot);
着信ファイルとメタ データ ファイルが複製され、pail.meta ファイルにも
structure: DataPailStructure
次に、このデータを細かく分割して、垂直方向のパーティションに分割します。この本にあるように、2 つの PailTap オブジェクトを作成します。1 つはスナップショット用、もう 1 つは SplitDataStructure 用、もう 1 つは新しいShreddedフォルダー用です。
PailTap source = dataTap(PailFactory.snapshot);
PailTap sink = splitDataTap(PailFactory.shredded);
/Shreddedフォルダーには、pail.meta ファイルがあります。structure: SplitDataPailStructure
指示に従って、JCascalog クエリを実行してレデューサーを強制します。
Api.execute(sink, new Subquery(data).predicate(reduced, empty, data));
これで、ローカル モードでは問題なく動作します。/Shredded の下に作成された「一時的な」サブフォルダーがあり、これは予想される「1/1」構造で垂直方向に分割されます。ローカル モードでは、これは /Shredded フォルダーに移動され、問題なくマスターに統合およびマージできます。
しかし、Hadoop 内で実行すると、この時点でエラーが発生して失敗します。
cascading.tuple.TupleException: unable to sink into output identifier: /tmp/swa/shredded
...
Caused by: java.lang.IllegalArgumentException: 1/1/part-000000 is not valid with the pail structure {structure=com.hibu.pail.SplitDataPailStructure, args={}, format=SequenceFile} --> [1, _temporary, attempt_1393854491571_12900_r_000000_1, 1, 1] at com.backtype.hadoop.pail.Pail.checkValidStructure(Pail.java:563)
言うまでもなく、Shredded Sink 構造タイプを DataPailStructure に変更すると、正常に動作しますが、すべてが Incoming フォルダーにあったため、かなり無意味な操作です。1 つのデータ型しか扱っていないので、今のところは問題ありませんが、これはすぐに変更され、そのパーティションが必要になります。
何か案は?最初はすべてのソース コードをここに投稿するつもりはありませんでしたが、何かが欠けていることはほぼ間違いありません。