Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services aws使用IAM角色从spark访问s3_Amazon Web Services_Apache Spark_Amazon S3_Amazon Iam_Aws Iam - Fatal编程技术网

Amazon web services aws使用IAM角色从spark访问s3

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:/

我想从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://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实现这一点。谢谢,这很有效。我在这里做了一些改变