对于Spark非常陌生,并且在使用Spark结构化流(v2.4.3)时,我试图将流数据帧写入自定义S3。我确保可以登录,并使用UI手动将数据上传到s3存储桶,并且还为此设置了ACCESS_KEY
和SECRET_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。
答案 0 :(得分:0)
这些东西可能更容易在spark-defaults.conf中设置
答案 1 :(得分:0)
我通过在build.sbt中将hadoop-aws jar版本设置为2.8.0
来解决了这个问题。似乎在Hadoop 2.8.0中引入了单独的标记fs.s3a.path.style.access
,因为我发现了此问题的JIRA票据HADOOP-12963。而且有效。