java.lang.NoClassDefFoundError:Spark中的com/amazonaws/services/s3/AmazonS3Client
我有一个java spark进程,我使用- spark submit——类MyClass target/MyJar.jar 这个过程的最后一部分是在本地写入它,然后将它复制到s3,因为它需要有特定的名称(也可以写入s3并在那里进行mv'ed,为了解决错误保持不变的问题) 代码编译并运行,但是当它到达下面的代码段时,我得到了以下错误- java.lang.NoClassDefFoundError:com/amazonaws/services/s3/AmazonS3位于 java.lang.Class.forName0(本机方法)位于 java.lang.Class.forName(Class.java:348)位于 org.apache.spark.util.Utils$.classForName(Utils.scala:229)位于 org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:700) 在 org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:187) 位于org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:212) 位于org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:126) 在org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)上 收件人:java.lang.ClassNotFoundException: com.amazonaws.services.s3.AmazonS3位于 java.net.URLClassLoader.findClass(URLClassLoader.java:381)位于 loadClass(ClassLoader.java:424)位于 loadClass(ClassLoader.java:357)java.lang.NoClassDefFoundError:Spark中的com/amazonaws/services/s3/AmazonS3Client,java,apache-spark,amazon-s3,aws-sdk,Java,Apache Spark,Amazon S3,Aws Sdk,我有一个java spark进程,我使用- spark submit——类MyClass target/MyJar.jar 这个过程的最后一部分是在本地写入它,然后将它复制到s3,因为它需要有特定的名称(也可以写入s3并在那里进行mv'ed,为了解决错误保持不变的问题) 代码编译并运行,但是当它到达下面的代码段时,我得到了以下错误- java.lang.NoClassDefFoundError:com/amazonaws/services/s3/AmazonS3位于 java.lang.Clas
public static void saveToS3(数据集df、字符串outputBucket、字符串outputPath)引发IOException{
字符串tmpFile=“temp”+Long.toString(System.nanoTime());
coalesce(1.write().option(“header”,true).csv(tmpFile);
文件目录=新文件(tmpFile);
AmazonS3 s3client=新的AmazonS3客户端();
对于(文件:directory.listFiles()){
if(file.getName().startsWith(“part|”)| | file.getName().endsWith(“csv”)){
putObject(新的PutObjectRequest(outputBucket,getS3path(outputPath),file));
}
delete();
}
directory.delete();
}
我使用以下可能相关的依赖项
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.7.4</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-aws</artifactId>
<version>2.7.2</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.mortbay.jetty</groupId>
<artifactId>servlet-api-2.5</artifactId>
</exclusion>
</exclusions>
</dependency>
您似乎使用的是2014年发布的
,因此它很可能不存在于您的AWS SDK中
代码编译的原因是代码本身不是问题所在,但您的一个依赖项正在尝试使用旧SDK没有的较新版本的S3客户端。换句话说,这不是代码问题,而是依赖关系管理问题。如果您根本不直接使用SDK,那么使用更合适的AWS SDK 1.11.X是安全的,如果您直接使用,那么您必须将代码引导到这一点
通常,spark core模块会指出其对aws版本的依赖性,但我假设它被明确排除在其自身版本之外,因此您可以提供自己的SDK版本供您使用,而不会产生任何冲突,但需要注意的是,如果您使用的依赖性太旧,它只是坏了。在按摩我的pom文件后,我能够用下面的pom文件和包装到达一个马厩-
mvn干净编译组件:单个代码>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.group</groupId>
<artifactId>arifact</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
<jdk.version>1.8</jdk.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-aws -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-aws</artifactId>
<version>2.8.2</version>
</dependency>
<dependency> <!-- Spark dependency -->
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>1.11.229</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.group.artifact.MainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
</project>
4.0.0
com.group
假象
罐子
1.0-快照
1.8
1.8
1.8
1.8
org.apache.hadoop
hadoop aws
2.8.2
org.apache.spark
spark-core_2.11
2.1.1
org.apache.spark
spark-sql_2.11
2.1.1
亚马逊网站
aws-java-sdk-s3
1.11.229
org.apache.maven.plugins
maven编译器插件
2.3.2
${jdk.version}
${jdk.version}
maven汇编插件
com.group.artifact.MainClass
带有依赖项的jar
运行mvn dependency:tree并发布,看起来您缺少某种依赖项。@Compass补充道,谢谢。如果缺少依赖项,我希望它不会编译。请您提供详细答案。我将依赖项更新为1.11.229,但仍然收到相同的错误。我还从spark中排除了AWS依赖项(尽管它不是spark的一部分),并且没有任何更改。我要指出的是,当我在intellij中运行这段代码时,或者作为独立代码运行,即使使用旧的依赖项,它也能正常工作。当我使用spark submit
运行它时,它会失败。@TomRon当你使用spark submit时,你的jar是否包含aws依赖项?刚才,在对我的pom文件进行处理后,我能够使它进入可用状态。我将很快发布更新。老实说,我不确定根本原因是什么。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.group</groupId>
<artifactId>arifact</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
<jdk.version>1.8</jdk.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-aws -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-aws</artifactId>
<version>2.8.2</version>
</dependency>
<dependency> <!-- Spark dependency -->
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>1.11.229</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.group.artifact.MainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
</project>