Spark s3 写入(s3 与 s3a 连接器)

luc*_*ucy 4 amazon-s3 amazon-web-services amazon-emr apache-spark parquet

我正在从事一项在 EMR 上运行的作业,它在 s3 上保存了数千个分区。分区为年/月/日。

我有过去 50 年的数据。现在,当 Spark 写入 10000 个分区时,使用连接大约需要 1 小时s3a。它非常慢。

df.repartition($"year", $"month", $"day").write.mode("append").partitionBy("year", "month", "day").parquet("s3a://mybucket/data")
Run Code Online (Sandbox Code Playgroud)

然后我尝试仅使用 s3 前缀,只花了几分钟就将所有分区保存在 S3 上。

df.repartition($"year", $"month", $"day").write.mode("append").partitionBy("year", "month", "day").parquet("s3://mybucket/data")
Run Code Online (Sandbox Code Playgroud)

当我覆盖 1000 个分区时,s3 与s3a

 df
 .repartition($"year", $"month", $"day")
 .write
 .option("partitionOverwriteMode", "dynamic")
 .mode("overwrite").partitionBy("year", "month", "day")
 .parquet("s3://mybucket/data")
Run Code Online (Sandbox Code Playgroud)

据我了解,s3a更加成熟,目前正在使用。s3/s3n 是旧的连接器,它们已被弃用。所以我想知道该用什么?我应该使用's3`吗?用于将数据保存到 s3 的 EMR 作业的最佳 s3 连接或 s3 URI 是什么?

小智 6

正如 Stevel 指出的,Amazon EMR 中使用的 s3:// 连接器是由亚马逊构建的,用于 EMR 与 S3 交互,并且是根据Amazon EMR Work with storage and file systems推荐的方式:

\n
\n

以前,Amazon EMR 使用 s3n 和 s3a 文件系统。虽然两者仍然有效,但我们建议您使用 s3 URI 方案以获得最佳性能、安全性和可靠性。

\n
\n

一些更有趣的东西:\nApache Hadoop 社区还开发了自己的 S3 连接器,S3a:// 是积极维护的连接器。Hadoop 社区还使用了一个名为 S3:// 的连接器,这可能会增加混乱。来自hadoop 文档

\n
\n

还有其他连接到 S3 的 Hadoop 连接器。只有 S3A 是由 Hadoop 项目本身积极维护的。

\n
    \n
  1. Apache\xe2\x80\x99s Hadoop\xe2\x80\x99s 原始 s3:// 客户端。这不再包含在 Hadoop 中。
  2. \n
  3. Amazon EMR\xe2\x80\x99s s3:// 客户端。这是来自 Amazon EMR 团队,他们积极维护它。
  4. \n
  5. Apache\xe2\x80\x99s Hadoop\xe2\x80\x99s s3n:文件系统客户端。此连接器不再可用:用户必须迁移到较新的 s3a: 客户端。
  6. \n
\n
\n