如何使用新的 Hadoop parquet magic commiter 通过 Spark 自定义 S3 服务器

Kiw*_*iwy 6 hadoop amazon-s3 apache-spark

我有 spark 2.4.0 和 Hadoop 3.1.1。根据Hadoop 文档,要使用允许将镶木地板文件一致写入 S3 的新 Magic 提交器,我已在以下位置设置了这些值conf/spark-default.conf

spark.sql.sources.commitProtocolClass       com.hortonworks.spark.cloud.commit.PathOutputCommitProtocol
spark.sql.parquet.output.committer.class    org.apache.hadoop.mapreduce.lib.output.BindingPathOutputCommitter
spark.hadoop.mapreduce.outputcommitter.factory.scheme.s3a    org.apache.hadoop.fs.s3a.commit.S3ACommitterFactory
spark.hadoop.fs.s3a.committer.name          magic
spark.hadoop.fs.s3a.committer.magic.enabled true
Run Code Online (Sandbox Code Playgroud)

使用此配置时,我最终遇到了异常:

java.lang.ClassNotFoundException: com.hortonworks.spark.cloud.commit.PathOutputCommitProtocol
Run Code Online (Sandbox Code Playgroud)

我的问题是双重的,首先我是否正确理解 Hadoop 3.1.1 允许一致地将镶木地板文件写入 S3?
其次,如果我理解得很好,如何从 Spark 正确使用新的提交者?

Kiw*_*iwy 3

编辑:
好的,我有两个服务器实例,其中一个现在有点旧了,我尝试使用带有这些参数的最新版本的 minio:

sc.hadoopConfiguration.set("hadoop.fs.s3a.path.style.access","true")
sc.hadoopConfiguration.set("hadoop.fs.s3a.fast.upload","true")
sc.hadoopConfiguration.set("hadoop.fs.s3a.fast.upload.buffer","bytebuffer")
sc.hadoopConfiguration.set("fs.s3a.path.style.access","true")
sc.hadoopConfiguration.set("fs.s3a.multipart.size","128M")
sc.hadoopConfiguration.set("fs.s3a.fast.upload.active.blocks","4")
sc.hadoopConfiguration.set("fs.s3a.committer.name","partitioned")
Run Code Online (Sandbox Code Playgroud)

到目前为止我可以毫无困难地写作。
然而,我的 swift 服务器的配置有点旧:

sc.hadoopConfiguration.set("fs.s3a.signing-algorithm","S3SignerType")
Run Code Online (Sandbox Code Playgroud)

似乎没有适当支持合作伙伴。

关于“Hadoop S3guard”:
目前不可能,保存S3文件元数据的Hadoop S3guard必须在Hadoop中启用。不过,S3guard 依赖于 DynamoDB(一项亚马逊专有服务)。
现在没有像 sqlite 文件或其他数据库系统这样的替代方案来存储元数据。因此,如果您将 S3与任何其他 S3 实现一起
使用,则您将缺少 DynamoDB。 这篇文章很好地解释了S3guard 的工作原理minio