【问题标题】:Spark streaming connection to S3 gives Forbidden errorSpark 与 S3 的流式连接给出了 Forbidden 错误
【发布时间】:2018-08-21 02:42:30
【问题描述】:

我正在本地运行 Spark 流应用程序以从 S3 存储桶读取数据。

我正在使用 Hadoop-AWS jar 设置 S3 身份验证参数 - https://hadoop.apache.org/docs/r3.0.0/hadoop-aws/tools/hadoop-aws/index.html#Authenticating_with_S3

这是错误消息“禁止”:

org.apache.hadoop.fs.s3a.S3AFileSystem printAmazonServiceException - Caught an AmazonServiceException, which means your request made it to Amazon S3, but was rejected with an error response for some reason.
org.apache.hadoop.fs.s3a.S3AFileSystem printAmazonServiceException - Error Message: Status Code: 403, AWS Service: Amazon S3, AWS Request ID: #####, AWS Error Code: null, AWS Error Message: Forbidden
org.apache.hadoop.fs.s3a.S3AFileSystem printAmazonServiceException - HTTP Status Code: 403
org.apache.hadoop.fs.s3a.S3AFileSystem printAmazonServiceException - AWS Error Code: null
org.apache.hadoop.fs.s3a.S3AFileSystem printAmazonServiceException - Error Type: Client
org.apache.hadoop.fs.s3a.S3AFileSystem printAmazonServiceException - Request ID: #####
org.apache.hadoop.fs.s3a.S3AFileSystem printAmazonServiceException - Class Name: com.amazonaws.services.s3.model.AmazonS3Exception

从存储桶中读取的代码:

val sc: SparkContext = createSparkContext(scName)
val hadoopConf=sc.hadoopConfiguration
hadoopConf.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
val ssc = new StreamingContext(sc, Seconds(time))
val lines = ssc.textFileStream("s3a://foldername/subfolder/")
lines.print()

我已经在我的终端上设置了AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, and AWS_SESSION_TOKEN 变量,但它仍然给我“禁止”。

我可以从终端访问 S3(使用 AWS 配置文件),所以我不确定为什么当我通过 Spark 时它不起作用。任何想法表示赞赏。

【问题讨论】:

  • 您需要将这些变量导出到所有执行器,而不仅仅是您的本地机器
  • 您是否位于任何禁运国家?
  • @cricket_007 我该怎么做?如果我在 hadoopConf 中设置这些变量还不够吗?
  • @MobinRanjbar 不,我不是
  • "fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem" 只设置文件系统。您还需要设置密钥。请参阅此处的代码。 stackoverflow.com/q/49230086/2308683 另见cloudera.com/documentation/enterprise/latest/topics/… 搜索“在运行时指定凭据”

标签: scala hadoop apache-spark amazon-s3 spark-streaming


【解决方案1】:

为了使密钥远离纯文本代码。

您可以使用键将core-site.xml 文件添加到类路径

<property>
    <name>fs.s3a.access.key</name>
    <value>...</value>
</property>
<property>
    <name>fs.s3a.secret.key</name>
    <value>...</value>
</property>

或者,如果您不关心将密钥直接放在代码中,

sc.hadoopConfiguration.set("fs.s3a.access.key", "...")
sc.hadoopConfiguration.set("fs.s3a.secret.key", "...")

推荐的方式是use a Java jceks credential file

【讨论】:

  • 我尝试将密钥直接放入代码中,但出现相同的 Forbidden 错误。
  • 这可能是一个问题,Spark 没有发布适当的版本,说现在支持 Hadoop 3。或者,如果您不使用它...这是我所知道的设置密钥的唯一方法。所以还有其他一些错误,因为 AWS Error Code: null 不应该发生
  • 那里没有与 hadoop 3 相关的内容。这更像是配置之一,由于没人敢打印有用的诊断信息这一事实而受到阻碍
  • @Steve 问题中的链接指向 Hadoop 3 文档(尽管我知道该页面没有太大变化)
猜你喜欢
  • 2014-02-17
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 2016-04-05
  • 2016-04-08
  • 2014-03-05
  • 2018-08-18
  • 1970-01-01
相关资源
最近更新 更多