【问题标题】:How to load RDDs from S3 files from spark-shell?如何从 spark-shell 的 S3 文件加载 RDD?
【发布时间】:2018-05-18 19:00:39
【问题描述】:

我在 S3 中有一个文本文件,我想用spark-shell 将它加载到 RDD 中。

我已经下载了Spark 2.3.0 for Hadoop。天真地,我希望我只需要设置 hadoop 设置就可以了。

val inFile = "s3a://some/path"
val accessKey = "some-access-key"
val secretKey = "some-secret-key"

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

sc.textFile(inFile).count()

println(run())

调用最后一行返回:

Failure(java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found)

这似乎是要求我提供包含 S3AFileSystem 的库。没问题 - 我下载了相应的 jar 并将这一行添加到脚本的开头。

:require C:\{path-to-jar}\hadoop-aws-3.1.0.jar

现在,在最后一行运行脚本失败,出现类似以下的各种错误:

error: error while loading Partition, class file 'C:\spark\spark-2.3.0-bin-hadoop2.7\jars\spark-core_2.11-2.3.0.jar(org/apache/spark/Partition.class)' has location not matching its contents: contains class Partition

此时我迷路了 - 显然,之前定义 run 方法没有问题。

我自己可以直接访问 Partition 类,但是上面发生了一些事情,阻止了代码访问 Partition。

scala> new org.apache.spark.Partition {def index = 3}
res6: org.apache.spark.Partition = $anon$1@3

奇怪的是,运行脚本的最后一行会在后续调用中产生不同的错误。

scala> sc.textFile(inFile).count()
java.lang.NoClassDefFoundError: org/apache/hadoop/fs/StreamCapabilities
  at java.lang.ClassLoader.defineClass1(Native Method)
  ...

documentation 声称这是我正在使用的 hadoop 3.1.0 的一部分,但在探索 hadoop-aws-3.1.0.jar 时,我看不到 StreamCapabilities 的踪迹。

我应该使用不同的罐子吗?我是否试图错误地解决这个问题?还是我掉进了 XY 问题的陷阱?

我尝试过的答案

  • The official docs 假设我在集群上运行脚本。但我在本地运行 spark-shell
  • This other StackOverflow question 是针对较老的问题。结果,我使用的是 s3a,但遇到了不同的问题。
  • 我还尝试使用 Hadoop 2.6 到 3.1 的每个 jar,但无济于事。

【问题讨论】:

    标签: scala apache-spark hadoop amazon-s3


    【解决方案1】:

    org.apache.hadoop.fs.StreamCapabilities 在 hadoop-common-3.1.jar 中 您可能正在混合 Hadoop JAR 的版本,正如 s3a troubleshooting docs 中所述,它注定要失败。

    Spark shell 可以在正确的 JAR 中正常工作。但是 ASF Spark 版本还不能在 Hadoop 3.x 上工作,因为存在一些突出的问题。坚持使用 Hadoop 2.8.x,您将获得良好的 S3 性能而没有那么痛苦。

    【讨论】:

    • 你好史蒂夫,我一直在使用 spark 2.4 和 hadoop 3 的组合,到目前为止没有问题,是否存在已知的不兼容性?
    【解决方案2】:

    我找到了解决问题的一个路径,但我不知道为什么

    1. 创建 SBT IntelliJ 项目
    2. 包括以下依赖项和覆盖
    3. sbt console 运行脚本(无require 语句)

      scalaVersion := "2.11.12"
      
      libraryDependencies += "org.apache.spark" %% "spark-core" % "2.3.0"
      libraryDependencies += "org.apache.hadoop" % "hadoop-aws" % "3.1.0"
      libraryDependencies += "org.apache.hadoop" % "hadoop-client" % "3.1.0"
      
      dependencyOverrides += "com.fasterxml.jackson.core" % "jackson-core" % "2.8.7"
      dependencyOverrides += "com.fasterxml.jackson.core" % "jackson-databind" % "2.8.7"
      dependencyOverrides += "com.fasterxml.jackson.module" % "jackson-module-scala_2.11" % "2.8.7"
      

    关键部分自然是覆盖杰克逊依赖项。

    【讨论】:

      猜你喜欢
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多