【问题标题】:How to EMR S3DistCp groupBy properly?如何正确 EMR S3DistCp groupBy?
【发布时间】:2016-11-17 08:45:54
【问题描述】:

我正在使用 aws .net sdk 向 EMR 运行 s3distcp 作业,以使用 --groupBy arg 连接文件夹中的所有文件。但无论我尝试过什么“groupBy”arg,它总是失败,或者只是复制文件而不连接,就像在 arg 列表中没有指定 --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"

                }
            };

【问题讨论】:

    标签: amazon-emr distcp s3distcp


    【解决方案1】:

    经过一整天的努力,最后我得到了它与下面的 groupKey arg 的工作:

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

    但即使我将 --targetSize=1024 添加到 args s3distcp 也会产生 2,5MB - 3MB 文件。 有人知道吗?

    ** *更新 * **

    这里是 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 子句对每个文件夹中的每个文件进行分组,所以最后你会为每个文件夹获得一个文件,其文件夹名称

    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
    

    谢谢。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-10
    • 2017-01-16
    • 2011-07-23
    • 1970-01-01
    • 2016-02-27
    • 2020-01-27
    • 2019-04-28
    • 2016-02-21
    相关资源
    最近更新 更多