Java spark submit classNotFoundException:无法读取EMR中的s3

Java spark submit classNotFoundException:无法读取EMR中的s3,java,scala,apache-spark,hadoop,amazon-emr,Java,Scala,Apache Spark,Hadoop,Amazon Emr,我一直在尝试使用Spark submit命令在Spark集群上运行Scala编写的Spark应用程序。集群在EMR上。更多的是关于spark将JAR发送给驱动程序/执行器的方式,以及它如何修改类路径 我的应用程序不是一个胖的Uber JAR,相反,我将所有JAR都放在一个文件夹中,并在开始使用--jars选项时通过集群发送它们 Spark版本是2.4.4 以下是我运行应用程序的方式: JARS=$(ls -m target/pack/lib/* | tr -d ' ' | tr -d '\n')

我一直在尝试使用
Spark submit
命令在Spark集群上运行Scala编写的Spark应用程序。集群在EMR上。更多的是关于spark将JAR发送给驱动程序/执行器的方式,以及它如何修改类路径

我的应用程序不是一个胖的Uber JAR,相反,我将所有JAR都放在一个文件夹中,并在开始使用
--jars
选项时通过集群发送它们

Spark版本是2.4.4

以下是我运行应用程序的方式:

JARS=$(ls -m target/pack/lib/* | tr -d ' ' | tr -d '\n')
# Note : I tried with/without including $HADOOP_JARS
HADOOP_JARS=$(ls -md /usr/lib/hadoop/lib/*.jar | tr -d ' ' | tr -d '\n')

spark-submit --master yarn \
  --class my.main.class \
  --driver-memory 2G\
  --executor-memory 3G\
  --executor-cores 2\
  --num-executors 2 \
  --conf "spark.executor.extraJavaOptions=-Dorg.bytedeco.javacpp.maxbytes=4G"\
  --conf "spark.driver.extraJavaOptions=-Dorg.bytedeco.javacpp.maxbytes=3G"\
  --conf spark.executor.memoryOverhead=4G\
  --conf spark.driver.memoryOverhead=2048\
  --jars $JARS,$HADOOP_JARS \
  target/scala-2.11/tep_dl4j_2.11-1.0.jar arg1 arg2
然后,我尝试通过从S3读取CSV来创建一个数据帧。这就是问题开始的地方:

Exception in thread "main" java.lang.NoClassDefFoundError: org/jets3t/service/ServiceException
    at org.apache.hadoop.fs.s3native.NativeS3FileSystem.createDefaultStore(NativeS3FileSystem.java:343)
    at org.apache.hadoop.fs.s3native.NativeS3FileSystem.initialize(NativeS3FileSystem.java:333)
(我跳过所有堆栈跟踪)

此类(org.jets3t.service.ServiceException)来自启动集群时发送的
jets3t-0.9.0.jar
文件,如下所示:

INFO Client: Uploading resource file:/usr/lib/hadoop/lib/jets3t-0.9.0.jar -> hdfs://ip-172-31-10-119.ec2.internal:8020/user/hadoop/.sparkStaging/application_1582370799483_0001/jets3t-0.9.0.jar
即使当我转到Spark UI时,我也会在类路径条目中看到jar,其中提到“由用户添加”。但这仍然是一个例外

我在某处四处看了看,就这样结束了。解决此问题的唯一方法是使用--driver class path选项。此外,它还表示,
--jars
选项“不会将JAR添加到驱动程序/执行器类路径”。他显然是对的,但这不是文件所说的。事实上,根据文件:

使用spark submit时,应用程序jar以及--jars选项中包含的任何jar将自动传输到集群。在--jar之后提供的URL必须用逗号分隔。该列表包含在驱动程序和执行器类路径中。目录扩展不适用于--jar。 我是不是遗漏了什么?仅通过HDF发送JAR,而不将其包含在类路径中的目的是什么


感谢您的回答

EMR已经安装了jets3t(我刚刚检查了集群);您部署应用程序(包括hadoop JAR)的方式有问题,能否使用汇编插件(sbt)或着色(maven)谢谢您的回复。包括hadoop JAR只是在我最后一次尝试中,以确保jets3t实际上已经发货。删除$HADOOP_JARS并不能解决这个问题。另一点:当我不使用s3来保存/加载数据时,一切正常,我的应用程序从外部JAR加载类。我知道我可以用汇编插件制作一个Uber jar,但是我想理解为什么在这种情况下失败。如果使用客户端或集群模式,会有什么不同吗?我个人使用了
--jars
spark shell
,它们肯定被添加到了类路径中。你能制作
echo$jars
和echo
$HADOOP\u jars
吗?您还可以共享您的mvn/sbt依赖项吗?
INFO Client: Uploading resource file:/usr/lib/hadoop/lib/jets3t-0.9.0.jar -> hdfs://ip-172-31-10-119.ec2.internal:8020/user/hadoop/.sparkStaging/application_1582370799483_0001/jets3t-0.9.0.jar