Amazon web services aws使用IAM角色从spark访问s3
我想从spark访问s3,我不想配置任何密钥和访问密钥,我想通过配置IAM角色来访问s3,因此我遵循了中给出的步骤 但它仍然无法从运行独立spark的EC2实例中运行 当我测试时,它工作Amazon web services aws使用IAM角色从spark访问s3,amazon-web-services,apache-spark,amazon-s3,amazon-iam,aws-iam,Amazon Web Services,Apache Spark,Amazon S3,Amazon Iam,Aws Iam,我想从spark访问s3,我不想配置任何密钥和访问密钥,我想通过配置IAM角色来访问s3,因此我遵循了中给出的步骤 但它仍然无法从运行独立spark的EC2实例中运行 当我测试时,它工作 [ec2-user@ip-172-31-17-146 bin]$ aws s3 ls s3://testmys3/ 2019-01-16 17:32:38 130 e.json 但当我像下面这样尝试时,它不起作用 scala> val df = spark.read.json("s3a:/
[ec2-user@ip-172-31-17-146 bin]$ aws s3 ls s3://testmys3/
2019-01-16 17:32:38 130 e.json
但当我像下面这样尝试时,它不起作用
scala> val df = spark.read.json("s3a://testmys3/*")
我得到下面的错误
19/01/16 18:23:06 WARN FileStreamSink: Error while looking for metadata directory.
com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 400, AWS Service: Amazon S3, AWS Request ID: E295957C21AFAC37, AWS Error Code: null, AWS Error Message: Bad Request
at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:798)
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:421)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:232)
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3528)
at com.amazonaws.services.s3.AmazonS3Client.headBucket(AmazonS3Client.java:1031)
at com.amazonaws.services.s3.AmazonS3Client.doesBucketExist(AmazonS3Client.java:994)
at org.apache.hadoop.fs.s3a.S3AFileSystem.initialize(S3AFileSystem.java:297)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2669)
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:94)
at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2703)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2685)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:373)
at org.apache.hadoop.fs.Path.getFileSystem(Path.java:295)
at org.apache.spark.sql.execution.datasources.DataSource$.org$apache$spark$sql$execution$datasources$DataSource$$checkAndGlobPathIfNecessary(DataSource.scala:616)
400错误的请求是相当没有帮助的,而且S3不仅没有提供太多,S3A连接器也没有太多与auth相关的日期打印。这本书有一个很大的章节 事实上,它可以发出请求,这意味着它有一些凭证,只有远端不喜欢它们 可能性 您的IAM角色没有s3:ListBucket的权限。看见 你的桶名错了 fs.s3a或AWS_uenv变量中的某些设置优先于IAM角色,但它们是错误的。 您应该自动使用IAM auth作为S3A连接器的身份验证机制;它是在config&env vars之后最后检查的一个 查看fs.s3a.aws.credentials.provider中设置的内容-它必须未设置或包含选项com.amazonaws.auth.InstanceProfileCredentialsProvider 假设命令行上也有hadoop,抓取 它应该转储有关身份验证的内容 更新
正如最初的海报所评论的,这是由于特定S3端点上需要v4身份验证。这可以在s3a客户端的2.7.x版本上启用,但只能通过Java系统属性启用。对于2.8+版本,有一些fs.s3a。您可以改为设置选项。400错误的请求是毫无帮助的,不仅S3没有提供太多,S3A连接器也没有与auth相关的日期打印。这本书有一个很大的章节 事实上,它可以发出请求,这意味着它有一些凭证,只有远端不喜欢它们 可能性 您的IAM角色没有s3:ListBucket的权限。看见 你的桶名错了 fs.s3a或AWS_uenv变量中的某些设置优先于IAM角色,但它们是错误的。 您应该自动使用IAM auth作为S3A连接器的身份验证机制;它是在config&env vars之后最后检查的一个 查看fs.s3a.aws.credentials.provider中设置的内容-它必须未设置或包含选项com.amazonaws.auth.InstanceProfileCredentialsProvider 假设命令行上也有hadoop,抓取 它应该转储有关身份验证的内容 更新 正如最初的海报所评论的,这是由于特定S3端点上需要v4身份验证。这可以在s3a客户端的2.7.x版本上启用,但只能通过Java系统属性启用。对于2.8+版本,有一些fs.s3a。选项您可以改为设置它此配置有效
./spark-shell \
--packages com.amazonaws:aws-java-sdk:1.7.4,org.apache.hadoop:hadoop-aws:2.7.3 \
--conf spark.hadoop.fs.s3a.endpoint=s3.us-east-2.amazonaws.com \
spark.hadoop.fs.s3a.aws.credentials.provider=com.amazonaws.auth.InstanceProfileCredentialsProvider \
--conf spark.executor.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true \
--conf spark.driver.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true
这个配置有效
./spark-shell \
--packages com.amazonaws:aws-java-sdk:1.7.4,org.apache.hadoop:hadoop-aws:2.7.3 \
--conf spark.hadoop.fs.s3a.endpoint=s3.us-east-2.amazonaws.com \
spark.hadoop.fs.s3a.aws.credentials.provider=com.amazonaws.auth.InstanceProfileCredentialsProvider \
--conf spark.executor.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true \
--conf spark.driver.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true
第一步。要配置spark容器框架,如warn core-site.xml,请重新启动warn
fs.s3a.aws.credentials.provider-
com.cloudera.com.amazonaws.auth.InstanceProfileCredentialsProvider
fs.s3a.endpoint-
s3-ap-northeast-2.amazonaws.com
fs.s3.impl-
org.apache.hadoop.fs.s3a.S3AFileSystem
步骤二火花壳测试如下。
val rdd=sc.textFiles3a://path/file
rdd.count
rdd.take10.foreachprintln
第一步。要配置spark容器框架,如warn core-site.xml,请重新启动warn
fs.s3a.aws.credentials.provider-
com.cloudera.com.amazonaws.auth.InstanceProfileCredentialsProvider
fs.s3a.endpoint-
s3-ap-northeast-2.amazonaws.com
fs.s3.impl-
org.apache.hadoop.fs.s3a.S3AFileSystem
步骤二火花壳测试如下。
val rdd=sc.textFiles3a://path/file
rdd.count
rdd.take10.foreachprintlnI在spark方面没有任何专业知识,但是如果您指定文件本身,如s3a://testmys3/e.json,会发生什么情况?为什么您不使用EMR进行此操作?@Thiago:也许他不使用EMR是因为他想要自己构建的spark,而不是EMR团队提供的任何封闭源代码分支,或者使用ASF或其他人提供的火花释放装置。或者他想使用S3A连接器,它现在已经超越了EMR的封闭源代码s3连接器,并提供了stackoverflow和apache JIRA支持?我对spark没有任何专业知识,但如果您指定文件本身,如S3A://testmys3/e.json,会发生什么?为什么您不使用EMR来实现这一点?@Thiago:也许他不使用EMR是因为他想要他自己构建的Spark不是EMR团队提供的任何封闭源代码分支,也不是使用ASF或其他人提供的Spark版本。或者他想使用S3A连接器,它现在已经超越了EMR的封闭源代码s3连接器,并提供stackoverflow和apache JIRA支持?谢谢,它与下面的配置$./spark shell-packages com.amazonaws:aws java sdk:1.7.4,org.apache.hadoop:hadoop aws:2.7.3-conf spark.hadoop.fs.S3A.endpoint=s3.us-east-2.amazonaws.com-conf一起工作
spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem-conf spark.hadoop.fs.s3a.aws.credentials.provider=com.amazonaws.auth.InstanceProfileCredentialsProvider-conf spark.executor.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true-conf spark.driver.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=trueI获取它。V4端点,如法兰克福、伦敦、韩国。正如您所发现的,在2.7.xHadoop版本中需要付出努力才能做到这一点。2.8+中有明确的支持,谢谢,它与下面的config$./sparkshell-packages com.amazonaws:aws java sdk:1.7.4一起工作,org.apache.hadoop:hadoop aws:2.7.3-conf spark.hadoop.fs.s3a.endpoint=s3.us-east-2.amazonaws.com-conf spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.S3AFileSystem-conf spark.hadoop.fs.s3a.aws.credentials.provider=com.amazonaws.auth.instanceprofilecredentials-provider-confspark.executor.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true-conf spark.driver.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true我明白了。V4端点,如法兰克福、伦敦、韩国。正如您所发现的,在2.7.xHadoop版本中需要付出努力才能做到这一点。在2.8+中有明确的支持谢谢,这帮助了我。小提示:通过使用Hadoop 2.9.2:AWS-java-sdk-bundle-1.11.199.jar和Hadoop-AWS-2.9.2.jar中的AWS包,我能够使用KMS加密的S3 bucket实现这一点。谢谢,这很有效。我在这里做了一些改变谢谢,这帮了我的忙。小提示:通过使用Hadoop 2.9.2:AWS-java-sdk-bundle-1.11.199.jar和Hadoop-AWS-2.9.2.jar中的AWS包,我能够使用KMS加密的S3 bucket实现这一点。谢谢,这很有效。我在这里做了一些改变