【问题标题】:configuration for `spark.hadoop.fs.s3` gets applied to `fs.s3a` not `fs.s3``spark.hadoop.fs.s3` 的配置应用于`fs.s3a` 而不是`fs.s3`
【发布时间】:2017-06-01 16:46:32
【问题描述】:

我已阅读how to configure s3 access keys for dataproc 上发布的答案,但我觉得它不满意。

原因是当我按照步骤为spark.hadoop.fs.s3 设置hadoop conf 时,s3://... 路径仍然存在访问问题,而s3a://... 路径有效。测试 spark-shell 运行如下所示。

s3 vs s3n vs s3a 是它自己的话题,虽然我想我们不必担心 s3n。但我觉得奇怪的是 s3 的配置应用程序是 s3a 的清单。

这是我的问题:

  1. 这是 dataproc 还是 spark?我假设 spark 考虑到 spark-shell 有这个问题。

  2. 有没有办法在不更改代码的情况下从 spark-submit conf 标志配置 s3

  3. 这是一个错误还是我们现在更喜欢s3a 而不是`s3?

谢谢,

***@!!!:~$ spark-shell --conf spark.hadoop.fs.s3.awsAccessKeyId=CORRECT_ACCESS_KEY \
>     --conf spark.hadoop.fs.s3.awsSecretAccessKey=SECRETE_KEY

// Try to read existing path, which breaks...
scala> spark.read.parquet("s3://bucket/path/to/folder")
17/06/01 16:19:58 WARN org.apache.spark.sql.execution.datasources.DataSource: Error while looking for metadata directory.
java.io.IOException: /path/to/folder doesn't exist
  at org.apache.hadoop.fs.s3.Jets3tFileSystemStore.get(Jets3tFileSystemStore.java:170)
  ...

// notice `s3` not `s3a`
scala> spark.conf.getAll("spark.hadoop.fs.s3.awsAccessKeyId")
res3: String = CORRECT_ACCESS_KEY

scala> spark.conf.getAll("fs.s3.awsAccessKeyId")
java.util.NoSuchElementException: key not found: fs.s3.awsAccessKeyId
  at scala.collection.MapLike$class.default(MapLike.scala:228)
  at scala.collection.AbstractMap.default(Map.scala:59)
  at scala.collection.MapLike$class.apply(MapLike.scala:141)
  at scala.collection.AbstractMap.apply(Map.scala:59)
  ... 48 elided

scala> sc
res5: org.apache.spark.SparkContext = org.apache.spark.SparkContext@426bf2f2

scala> sc.hadoopConfiguration
res6: org.apache.hadoop.conf.Configuration = Configuration: core-default.xml, core-site.xml, mapred-default.xml, mapred-site.xml, yarn-default.xml, yarn-site.xml, hdfs-default.xml, hdfs-site.xml, file:/etc/hive/conf.dist/hive-site.xml

scala> sc.hadoopConfiguration.get("fs.s3.access.key")
res7: String = null   <--- ugh... wtf?

scala> sc.hadoopConfiguration.get("fs.s3n.access.key")
res10: String = null  <--- I understand this...

scala> sc.hadoopConfiguration.get("fs.s3a.access.key")
res8: String = CORRECT_ACCESS_KEY  <--- But what is this???

// Successfull file read
scala> spark.read.parquet("s3a://bucket/path/to/folder")
ivysettings.xml file not found in HIVE_HOME or HIVE_CONF_DIR,/etc/hive/conf.dist/ivysettings.xml will be used
res9: org.apache.spark.sql.DataFrame = [whatev... ... 22 more fields]

【问题讨论】:

    标签: apache-spark amazon-s3 google-cloud-dataproc


    【解决方案1】:

    spark-submit 有一些魔力,它可以获取您的 AWS_ 环境变量并将它们设置为 {s3, s3n, s3a} 文件系统;这可能就是幕后发生的事情。

    在 Hadoop JAR 或其他任何地方,没有将 s3a 设置从 s3a 选项复制到 s3n 选项,因此可能是一些 -site.xml 文件正在定义它。

    如果您的 CP 上有 Hadoop 2.7.x JAR,请务必使用 s3a://:更好的性能。 V4 API 身份验证(某些地区强制),持续维护。

    【讨论】:

    • 迁移到 s3a:// 对我们来说完全没问题,我们可以做出改变,只是配置应用程序有点出乎意料。另一个复杂情况是,在 EMR 中,s3s3a 更受欢迎,因为“为了完成”,无论 f 是什么意思……aws.amazon.com/premiumsupport/knowledge-center/…
    • Amazon EMR 的 s3: != ASF s3:// 客户端;它更像是 s3n 的分叉/重写,有很多我们不知道的变化。 s3a 是 ASF 一种优化的 GET-by-GET 方法,可在针对 ORC 和 Parquet 数据的 Hive/Spark/MapReduce 查询中获得最大性能。 FWIW,S3 SDK 团队与我们交谈...
    • 是的,我们已经收到警告,并就 AWS 的偏差进行了内部讨论。我猜您的意思是 s3 SDK 团队正在与你们交谈,但如果您需要有人作证,请告诉我... :D
    猜你喜欢
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多