【问题标题】:Hadoop can list s3 contents but spark-shell throws ClassNotFoundExceptionHadoop 可以列出 s3 内容,但 spark-shell 会抛出 ClassNotFoundException
【发布时间】:2016-03-23 11:36:49
【问题描述】:

我的传奇还在继续 -

简而言之,我正在尝试为 spark 创建一个测试堆栈 - 目的是从 s3 存储桶中读取一个文件,然后将其写入另一个。 Windows 环境。

我在尝试访问 S3 或 S3n 时反复遇到错误,因为抛出了 ClassNotFoundException。这些类作为 s3 和 s3n.impl 添加到 core-site.xml

我将 hadoop/share/tools/lib 添加到类路径中无济于事,然后将 aws-java-jdkhadoop-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


【解决方案1】:

您需要将一些参数传递给您的 spark-shell。试试这个标志--packages org.apache.hadoop:hadoop-aws:2.7.2

【讨论】:

  • 嗨,软件包 des 工作,但这每次都会下载它们,而不是我使用 --jars 将其添加到类路径中。
  • 这里不会每次都下载,会缓存到本地
猜你喜欢
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-11
  • 2016-12-10
  • 1970-01-01
相关资源
最近更新 更多