我有spark作业,需要从其他帐户**(数据帐户)**中的s3中读取数据并处理该数据。
处理完毕后,应写回我帐户中的s3。
因此,我在Spark会话中如下配置了“数据帐户” 的访问权限和密钥
val hadoopConf=sc.hadoopConfiguration
hadoopConf.set("fs.s3a.access.key","DataAccountKey")
hadoopConf.set("fs.s3a.secret.key","DataAccountSecretKey")
hadoopConf.set("fs.s3a.endpoint", "s3.ap-northeast-2.amazonaws.com")
System.setProperty("com.amazonaws.services.s3.enableV4", "true")
val df = spark.read.json("s3a://DataAccountS/path")
/* Reading is success */
df.take(3).write.json("s3a://myaccount/test/")
此阅读很好,但是写时我遇到了错误。
com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 301, AWS Service: Amazon S3, AWS Request ID: A5E574113745D6A0, AWS Error Code: PermanentRedirect, AWS Error Message: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.
但是如果我不配置“数据帐户”的详细信息,并尝试将一些虚假数据从spark写入我的s3,则可以正常工作。
所以我应该如何配置以同时从不同的帐户s3读取和写入我的帐户s3
答案 0 :(得分:0)
如果您的spark类路径启用了hadoop-2.7 JAR,则可以使用“路径中的秘密”作为技术,因此可以使用s3a://DataAccountKey:DataAccountSecretKey/DataAccount/path
之类的URL。请注意,这会记录到处的秘密。
Hadoop 2.8+ JAR会告诉您在任何地方记录您的秘密,但会添加每个存储桶绑定
spark.hadoop.fs.s3a.bucket.DataAccount.access.key DataAccountKey
spark.hadoop.fs.s3a.bucket.DataAccount.secret.key DataAccountSecretKey
spark.hadoop.fs.s3a.bucket.DataAccount.endpoint s3.ap-northeast-2.amazonaws.com
然后,对于与该存储桶的所有互动,这些每个存储桶的选项将覆盖主要设置。
注意:如果要使用此功能,不要以为将hadoop-aws-2.8.jar放入类路径中是可行的,只会得到类路径错误。所有hadoop- * JAR都需要升级到2.8,并且aws-sdk也需要更新。