8

aws .net sdk を使用して s3distcp ジョブを EMR に実行し、フォルダー内のすべてのファイルを --groupBy arg で連結しています。しかし、私が試した「groupBy」引数が何であれ、常に失敗するか、引数リストに --groupBy が指定されていない場合のように連結せずにファイルをコピーするだけです。

フォルダー内のファイルは、次のような名前の spark saveAsTextFiles です。

part-0000
part-0001
part-0002
...
...

step.HadoopJarStep = new HadoopJarStepConfig
            {
                Jar = "/usr/share/aws/emr/s3-dist-cp/lib/s3-dist-cp.jar",
                Args = new List<string>
                {
                    "--s3Endpoint=s3-eu-west-1.amazonaws.com",
                    "--src=s3://foo/spark/result/bar" ,
                    "--dest=s3://foo/spark/result-merged/bar",
                    "--groupBy=(part.*)",
                    "--targetSize=256"

                }
            };
4

1 に答える 1

12

この一日中苦労した後、最終的には以下の groupKey 引数で動作するようになりました:

--groupBy=.*part.*(\w+)

しかし--targetSize=1024、args s3distcp に追加しても、2.5MB ~ 3MB のファイルが生成されました。誰かそれについて何か考えがありますか?

** *更新 * **

これは、すべてのファイルを独自のフォルダー内の 1 つのファイルに連結する groupBy 句です。

.*/(\\w+)/.*

ここで最後の「/」は非常に重要です --source="s3://foo/spark/result/"

「結果」フォルダーにはいくつかのフォルダーがあります。

s3://foo/spark/result/foo
s3://foo/spark/result/bar
s3://foo/spark/result/lorem
s3://foo/spark/result/ipsum

上記の各フォルダーには、次のような何百ものファイルがあります。

part-0000
part-0001
part-0002

.*/(\\w+)/.*このgroup by句は、すべてのフォルダー内のすべてのファイルをグループ化するため、最終的にフォルダー名を持つフォルダーごとに1つのファイルを取得します

s3://foo/spark/result-merged/foo/foo -> File
s3://foo/spark/result-merged/bar/bar -> File
s3://foo/spark/result-merged/lorem/lorem -> File
s3://foo/spark/result-merged/ipsum/ipsum -> File

したがって、これが私にとっての最終的な作業コマンドです。

s3-dist-cp --src s3://foo/spark/result/  --dest s3://foo/spark/results-merged --groupBy '.*/(\\w+)/.*' --targetSize 1024

ありがとう。

于 2016-07-14T13:42:52.837 に答える