`spark.hadoop.fs.s3` 的配置应用于 `fs.s3a` 而不是 `fs.s3`

configuration for `spark.hadoop.fs.s3` gets applied to `fs.s3a` not `fs.s3`

我已经阅读了 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]

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

没有 Hadoop JAR 或其他任何地方的 s3a 设置从 s3a 到 s3n 选项的任何魔术复制,所以它可能是一些 -site.xml 定义它的文件。

如果您有 Hadoop 2,请使用 s3a://。7.x 无论如何,您的 CP 上有 JAR:更好的性能。 V4 API auth(部分地区强制),持续维护。