如何正确使用 EMR S3DistCp groupBy?
How to EMR S3DistCp groupBy properly?
我正在使用 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"
}
};
经过一整天的努力,最终我使用下面的 groupKey arg 实现了它:
--groupBy=.*part.*(\w+)
但即使我将 --targetSize=1024
添加到 args s3distcp 也会生成 2,5MB - 3MB 的文件。
有人知道吗?
** *更新 * **
这是将所有文件连接成一个文件的 groupBy 子句,在它们自己的文件夹中:
.*/(\w+)/.*
最后一个“/”在这里很重要
--source="s3://foo/spark/result/"
"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+)/.*
这个分组依据子句将每个文件夹中的每个文件分组,所以最后每个文件夹都有一个文件夹名称为
的文件
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
谢谢。
我正在使用 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"
}
};
经过一整天的努力,最终我使用下面的 groupKey arg 实现了它:
--groupBy=.*part.*(\w+)
但即使我将 --targetSize=1024
添加到 args s3distcp 也会生成 2,5MB - 3MB 的文件。
有人知道吗?
** *更新 * **
这是将所有文件连接成一个文件的 groupBy 子句,在它们自己的文件夹中:
.*/(\w+)/.*
最后一个“/”在这里很重要 --source="s3://foo/spark/result/"
"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+)/.*
这个分组依据子句将每个文件夹中的每个文件分组,所以最后每个文件夹都有一个文件夹名称为
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
谢谢。