【发布时间】: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