【发布时间】:2016-03-23 11:36:49
【问题描述】:
我的传奇还在继续 -
简而言之,我正在尝试为 spark 创建一个测试堆栈 - 目的是从 s3 存储桶中读取一个文件,然后将其写入另一个。 Windows 环境。
我在尝试访问 S3 或 S3n 时反复遇到错误,因为抛出了 ClassNotFoundException。这些类作为 s3 和 s3n.impl 添加到 core-site.xml
我将 hadoop/share/tools/lib 添加到类路径中无济于事,然后将 aws-java-jdk 和 hadoop-aws jar 添加到 share/hadoop/common 文件夹中,现在我可以列出在命令行中使用 haddop 的存储桶。
hadoop fs -ls "s3n://bucket" 显示内容,这是个好消息 :)
在我看来,hadoop 配置应该由 spark 获取,因此解决一个应该解决另一个但是当我运行 spark-shell 并尝试将文件保存到 s3 时,我得到了通常的 ClassNotFoundException,如下所示。
我对此还是很陌生,不确定我是否遗漏了一些明显的东西,希望有人能帮我解开谜题吗?非常感谢任何帮助,谢谢。
例外:
java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3native.NativeS3FileSystem not found
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2074)
at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2578)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2591)
我的 core-site.xml(我认为现在是正确的,因为 hadoop 可以访问 s3):
<property>
<name>fs.s3.impl</name>
<value>org.apache.hadoop.fs.s3.S3FileSystem</value>
</property>
<property>
<name>fs.s3n.impl</name>
<value>org.apache.hadoop.fs.s3native.NativeS3FileSystem</value>
<description>The FileSystem for s3n: (Native S3) uris.</description>
</property>
最后是显示类路径的 hadoop-env.cmd(似乎被忽略了):
set HADOOP_CONF_DIR=C:\Spark\hadoop\etc\hadoop
@rem ##added as s3 filesystem not found.http://stackoverflow.com/questions/28029134/how-can-i-access-s3-s3n-from-a-local-hadoop-2-6-installation
set HADOOP_USER_CLASSPATH_FIRST=true
set HADOOP_CLASSPATH=%HADOOP_CLASSPATH%:%HADOOP_HOME%\share\hadoop\tools\lib\*
@rem Extra Java CLASSPATH elements. Automatically insert capacity-scheduler.
if exist %HADOOP_HOME%\contrib\capacity-scheduler (
if not defined HADOOP_CLASSPATH (
set HADOOP_CLASSPATH=%HADOOP_HOME%\contrib\capacity-scheduler\*.jar
) else (
set HADOOP_CLASSPATH=%HADOOP_CLASSPATH%;%HADOOP_HOME%\contrib\capacity-scheduler\*.jar
)
)
编辑:spark-defaults.conf
spark.driver.extraClassPath=C:\Spark\hadoop\share\hadoop\common\lib\hadoop-aws-2.7.1.jar:C:\Spark\hadoop\share\hadoop\common\lib\aws-java-sdk-1.7.4.jar
spark.executor.extraClassPath=C:\Spark\hadoop\share\hadoop\common\lib\hadoop-aws-2.7.1.jar:C:\Spark\hadoop\share\hadoop\common\lib\aws-java-sdk-1.7.4.jar
【问题讨论】:
-
您是否尝试在提交 spark 作业时将它们明确地放在类路径中?
-
@YuvalItzchakov 我真的,我的意思是真的在这里:stackoverflow.com/questions/29099115/… :D 我现在要试试
-
我使用
--jars标志传递它们,并通过spark.driver.extraClassPath=hadoop-aws-2.7.1.jar:aws-java-sdk-1.10.50.jar将它们添加到类路径中。spark.executor.extraClassPath也是如此。 -
@YuvalItzchakov 目前我并没有提交 spark 作业本身,我只是想从 shell 中保存一个文件 - 虽然 spark.driver 类路径上的信息可能非常宝贵 - 确实你也有同样的问题吗?
-
我遇到了类似的问题,和你的不一样。我正在使用 Spark-Streaming 进行有状态计算,并且正在 AWS 上检查 S3。
标签: hadoop amazon-web-services amazon-s3 apache-spark