AmazonWeb服务—hadoop可以列出s3内容,但SparkShell抛出classnotfoundexception

svmlkihl  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(313)

我的传奇还在继续-
简而言之,我正在尝试为spark-aim创建一个测试堆栈,即从s3存储桶中读取一个文件,然后将其写入另一个存储桶。windows环境。
我在尝试访问s3或s3n时多次遇到错误,因为抛出了classnotfoundexception。这些类作为s3和s3n.impl添加到core-site.xml中
我将hadoop/share/tools/lib添加到类路径中,但没有效果,然后添加了 aws-java-jdk 以及 hadoop-aws jars到share/hadoop/common文件夹,现在我可以在命令行上使用haddop列出bucket的内容。 hadoop fs -ls "s3n://bucket" 给我看内容,这是个好消息:)
在我看来,hadoop配置应该由spark来选择,所以解决一个应该解决另一个,但是当我运行sparkshell并尝试将一个文件保存到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)

我的核心站点.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
uemypmqf

uemypmqf1#

你需要传递一些参数给你的Spark壳。试试这个旗子 --packages org.apache.hadoop:hadoop-aws:2.7.2 .

相关问题