2017-04-19 46 views
0

我在hadoop(CDH 5.5.1)上運行aws kinesis時出現了一個奇怪的錯誤。NoClassDefFoundError在hadoop上使用aws-kinesis的joda DateTimeFormat cloudera

我可以重現錯誤這個簡單的類:

import com.amazonaws.auth.AWSCredentials; 
import com.amazonaws.auth.BasicAWSCredentials; 
import com.amazonaws.services.kinesis.AmazonKinesisClient; 
import org.apache.hadoop.conf.Configured; 
import org.apache.hadoop.util.Tool; 
import org.apache.hadoop.util.ToolRunner; 
import org.joda.time.format.DateTimeFormat; 

public class CollectJob extends Configured implements Tool { 

    public static void main(String[] args) throws Exception { 

     int exitCode = ToolRunner.run(new CollectJob(), args); 
     System.exit(exitCode); 
    } 

    @Override 
    public int run(String[] args) throws Exception { 

     System.out.println(DateTimeFormat.class); 
     System.out.println(DateTimeFormat.class.getProtectionDomain().getCodeSource().getLocation()); 

     System.out.println(AmazonKinesisClient.class); 
     System.out.println(AmazonKinesisClient.class.getProtectionDomain().getCodeSource().getLocation()); 

     AWSCredentials credentials = new BasicAWSCredentials("toto", "tata"); 
     AmazonKinesisClient kinesisClient = new AmazonKinesisClient(credentials); 
     kinesisClient.setEndpoint("kinesis.eu-west-1.amazonaws.com"); 

     return 0; 
    } 
} 

我POM:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    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>test</groupId> 
    <artifactId>event-collector</artifactId> 
    <version>1.0-SNAPSHOT</version> 

    <repositories> 
    <repository> 
     <id>cloudera-repo-releases</id> 
     <url>https://repository.cloudera.com/artifactory/repo/</url> 
    </repository> 
    </repositories> 

    <dependencies> 
    <dependency> 
     <groupId>org.apache.hadoop</groupId> 
     <artifactId>hadoop-common</artifactId> 
     <version>2.6.0-cdh5.5.1</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.hadoop</groupId> 
     <artifactId>hadoop-core</artifactId> 
     <version>2.6.0-mr1-cdh5.5.1</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.amazonaws</groupId> 
     <artifactId>aws-java-sdk</artifactId> 
     <version>1.7.4</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>joda-time</groupId> 
     <artifactId>joda-time</artifactId> 
     <version>2.4</version> 
    </dependency> 
    </dependencies> 

    <build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <transformers> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer"/> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
           <resource>reference.conf</resource> 
          </transformer> 
         </transformers> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

然後我跑我的主:

yarn jar event-collector-1.0-SNAPSHOT.jar CollectJob 

,並得到該標準輸出:

class org.joda.time.format.DateTimeFormat 
file:/tmp/hadoop-unjar3521528256461676644/ 
class com.amazonaws.services.kinesis.AmazonKinesisClient 
file:/opt/cloudera/parcels/CDH-5.5.1-1.cdh5.5.1.p0.11/jars/aws-java-sdk-1.7.4.jar 
Exception in thread "main" java.lang.NoClassDefFoundError: org/joda/time/format/DateTimeFormat 
    at com.amazonaws.auth.AWS4Signer.<clinit>(AWS4Signer.java:44) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
    at java.lang.Class.newInstance(Class.java:374) 
    at com.amazonaws.auth.SignerFactory.createSigner(SignerFactory.java:119) 
    at com.amazonaws.auth.SignerFactory.lookupAndCreateSigner(SignerFactory.java:105) 
    at com.amazonaws.auth.SignerFactory.getSigner(SignerFactory.java:78) 
    at com.amazonaws.AmazonWebServiceClient.computeSignerByServiceRegion(AmazonWebServiceClient.java:307) 
    at com.amazonaws.AmazonWebServiceClient.computeSignerByURI(AmazonWebServiceClient.java:280) 
    at com.amazonaws.AmazonWebServiceClient.setEndpoint(AmazonWebServiceClient.java:160) 
    at com.amazonaws.services.kinesis.AmazonKinesisClient.setEndpoint(AmazonKinesisClient.java:2102) 
    at com.amazonaws.services.kinesis.AmazonKinesisClient.init(AmazonKinesisClient.java:216) 
    at com.amazonaws.services.kinesis.AmazonKinesisClient.<init>(AmazonKinesisClient.java:139) 
    at com.amazonaws.services.kinesis.AmazonKinesisClient.<init>(AmazonKinesisClient.java:116) 
    at tivan.CollectJob.run(CollectJob.java:29) 
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) 
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84) 
    at tivan.CollectJob.main(CollectJob.java:15) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.apache.hadoop.util.RunJar.run(RunJar.java:221) 
    at org.apache.hadoop.util.RunJar.main(RunJar.java:136) 
Caused by: java.lang.ClassNotFoundException: org.joda.time.format.DateTimeFormat 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    ... 26 more 

我嘗試使用YARN_USER_CLASSPATH_FIRST true或false並獲得相同的錯誤。 我不明白有什麼問題...

幫助! :)


編輯更多的細節:也失敗:

@Override 
    public int run(String[] args) throws Exception { 

     //print DateTimeFormat class infos 
     System.out.println(DateTimeFormat.class); 
     System.out.println(DateTimeFormat.class.getProtectionDomain().getCodeSource().getLocation()); 

     //print AWS4Signer class infos 
     System.out.println(AWS4Signer.class); 
     System.out.println(AWS4Signer.class.getProtectionDomain().getCodeSource().getLocation()); 

     //test joda time class (copy-paste from AWS4Signer source code) 
     DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("yyyyMMdd").withZoneUTC(); 
     System.out.println(dateFormatter); 

     //create AWS4Signer instance -> ClassNotFound on DateTimeFormat !!! 
     AWS4Signer signer = new AWS4Signer(); 
     System.out.println(signer); 

     return 0; 
    } 
+0

您是如何構建您的jar的? 它清楚地表明,喬達時間罐丟失了,但你已經包括在罐子裏的罐子,意味着你正在建設的工作時失去了一些東西。 –

+0

帶有maven-shade-plugin的「mvn install」。喬達很好地包裝在我的罐子裏,因爲我可以在我的主菜單中調用缺失的類(參見第一個System.out.println)。我用完整的pom更新了這個問題。 – cvx

回答

0

我終於找到了解決辦法,我只需輸出以下變量:

export YARN_USER_CLASSPATH=pathtomyjar 
0

你可以試試這個爲pom.xml中: -

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    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>test</groupId> 
    <artifactId>event-collector</artifactId> 
    <version>1.0-SNAPSHOT</version> 

    <repositories> 
    <repository> 
     <id>cloudera-repo-releases</id> 
     <url>https://repository.cloudera.com/artifactory/repo/</url> 
    </repository> 
    </repositories> 

    <dependencies> 
    <dependency> 
     <groupId>org.apache.hadoop</groupId> 
     <artifactId>hadoop-common</artifactId> 
     <version>2.6.0-cdh5.5.1</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.hadoop</groupId> 
     <artifactId>hadoop-core</artifactId> 
     <version>2.6.0-mr1-cdh5.5.1</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.amazonaws</groupId> 
     <artifactId>aws-java-sdk</artifactId> 
     <version>1.7.4</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>joda-time</groupId> 
     <artifactId>joda-time</artifactId> 
     <version>2.4</version> 
    </dependency> 
    </dependencies> 

    <build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 
+0

同樣錯誤java.lang.NoClassDefFoundError:org/joda/time/format/DateTimeFormat – cvx

相關問題