spark writeStream不适用于自定义S3端点

时间:2019-12-04 01:02:48

标签: apache-spark amazon-s3 apache-spark-sql spark-streaming spark-structured-streaming

对于Spark非常陌生,并且在使用Spark结构化流(v2.4.3)时,我试图将流数据帧写入自定义S3。我确保可以登录,并使用UI手动将数据上传到s3存储桶,并且还为此设置了ACCESS_KEYSECRET_KEY

val sc = spark.sparkContext
sc.hadoopConfiguration.set("fs.s3a.endpoint", "s3-region1.myObjectStore.com:443")
sc.hadoopConfiguration.set("fs.s3a.access.key", "00cce9eb2c589b1b1b5b")
sc.hadoopConfiguration.set("fs.s3a.secret.key", "flmheKX9Gb1tTlImO6xR++9kvnUByfRKZfI7LJT8")
sc.hadoopConfiguration.set("fs.s3a.path.style.access", "true") // bucket name appended as url/bucket and not bucket.url
val writeToS3Query = stream.writeStream
      .format("csv")
      .option("sep", ",")
      .option("header", true)
      .outputMode("append")
      .trigger(Trigger.ProcessingTime("30 seconds"))
      .option("path", "s3a://bucket0/")
      .option("checkpointLocation", "/Users/home/checkpoints/s3-checkpointing")
      .start()

但是,我得到的错误是

Unable to execute HTTP request: bucket0.s3-region1.myObjectStore.com: nodename nor servname provided, or not known

我的/etc/hosts文件中具有URL和IP的映射,并且可以从其他来源访问该存储桶。还有其他方法可以成功完成此操作吗?我真的不确定为什么Spark执行存储桶名称时会在URL之前附加存储桶名称。

这可能是因为在创建会话之后我正在设置spark上下文hadoop配置,因此它们无效吗?但是,当我在path中提供s3a://bucket0的值时,如何能够引用实际的URL。

2 个答案:

答案 0 :(得分:0)

这些东西可能更容易在spark-defaults.conf中设置

  1. 尝试使用全部小写的主机名
  2. 从参考中删除:443; https是默认设置,并且有一个开关可以显式禁用它。
  3. 秘密密钥属性是“ fs.s3a.secret.key”

答案 1 :(得分:0)

我通过在build.sbt中将hadoop-aws jar版本设置为2.8.0来解决了这个问题。似乎在Hadoop 2.8.0中引入了单独的标记fs.s3a.path.style.access,因为我发现了此问题的JIRA票据HADOOP-12963。而且有效。