2016-12-22 7 views
2

同じコードをSparkスタンドアロンで実行できますが、Spark on Yarnを実行するとYarnで失敗しました。例外はjava.lang.NoClassDefFoundError: Could not initialize class org.elasticsearch.common.xcontent.json.JsonXContentであり、これはExecutor(Yarn Container)に投げられました。しかし、私はMavenアセンブリを使用したときにアプリケーションアセンブリjarにelasticSearch jarを含めました。次のようにrunコマンド:してください、次のようにSpark on Yarnを実行したときにクラスが見つかりません

spark-submit --executor-memory 10g --executor-cores 2 --num-executors 2 
--queue thejob --master yarn --class com.batch.TestBat /lib/batapp-mr.jar 2016-12-20 

Mavenの依存関係:

<dependency> 
    <groupId>org.apache.spark</groupId> 
    <artifactId>spark-hive_2.10</artifactId> 
    <version>1.6.0</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>org.apache.spark</groupId> 
    <artifactId>spark-mllib_2.10</artifactId> 
    <version>1.6.0</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>org.apache.spark</groupId> 
    <artifactId>spark-core_2.10</artifactId> 
    <version>1.6.0</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>org.apache.spark</groupId> 
    <artifactId>spark-sql_2.10</artifactId> 
    <version>1.6.0</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>org.apache.spark</groupId> 
    <artifactId>spark-catalyst_2.10</artifactId> 
    <version>1.6.0</version> 
    <scope>provided</scope> 
</dependency> 

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-core</artifactId> 
    <version>2.6.3</version> 
    <!-- <scope>provided</scope> --> 
</dependency> 
<dependency> 
    <groupId>org.apache.hbase</groupId> 
    <artifactId>hbase-client</artifactId> 
    <version>1.2.0-cdh5.7.0</version> 
    <!--<scope>provided</scope> --> 
</dependency> 
<dependency> 
    <groupId>org.apache.hbase</groupId> 
    <artifactId>hbase-server</artifactId> 
    <version>1.2.0-cdh5.7.0</version> 
    <!--<scope>provided</scope> --> 
</dependency> 
<dependency> 
    <groupId>org.apache.hbase</groupId> 
    <artifactId>hbase-protocol</artifactId> 
    <version>1.2.0-cdh5.7.0</version> 
    <!--<scope>provided</scope> --> 
</dependency> 
<dependency> 
    <groupId>org.apache.hbase</groupId> 
    <artifactId>hbase-hadoop2-compat</artifactId> 
    <version>1.2.0-cdh5.7.0</version> 
    <!--<scope>provided</scope> --> 
</dependency> 
<dependency> 
    <groupId>org.apache.hbase</groupId> 
    <artifactId>hbase-common</artifactId> 
    <version>1.2.0-cdh5.7.0</version> 
    <!--<scope>provided</scope> --> 
</dependency> 
<dependency> 
    <groupId>org.apache.hbase</groupId> 
    <artifactId>hbase-hadoop-compat</artifactId> 
    <version>1.2.0-cdh5.7.0</version> 
    <!--<scope>provided</scope> --> 
</dependency> 


<dependency> 
    <groupId>com.sksamuel.elastic4s</groupId> 
    <artifactId>elastic4s-core_2.10</artifactId> 
    <version>2.3.0</version> 
    <!--<scope>provided</scope> --> 
    <exclusions> 
     <exclusion> 
      <artifactId>elasticsearch</artifactId> 
      <groupId>org.elasticsearch</groupId> 
     </exclusion> 
    </exclusions> 
</dependency> 
<dependency> 
    <groupId>org.elasticsearch</groupId> 
    <artifactId>elasticsearch</artifactId> 
    <version>2.3.2</version> 
</dependency> 
<dependency> 
    <groupId>org.elasticsearch</groupId> 
    <artifactId>elasticsearch-hadoop</artifactId> 
    <version>2.3.1</version> 
    <exclusions> 
     <exclusion> 
      <artifactId>log4j-over-slf4j</artifactId> 
      <groupId>org.slf4j</groupId> 
     </exclusion> 
    </exclusions> 
</dependency> 

奇妙なことは、エグゼキュータは、HBaseのジャーとの両方が依存関係に含まElasticSearchジャーではなくElasticSearchを見つけることができるということですいくつかのクラス、私はいくつかのクラスの競合かもしれないと思います。私はそれが "欠けているクラス"を含む組立瓶を点検した。

+1

ここに依存するリストはありますか? – mrsrinivas

+0

私はちょうど、ありがとうたくさん追加しました! – Jack

+0

私の答えが役立つことを確認してください! –

答えて

2

私は見ることができます、あなたはすでにincluded the jar dependencyを持っています。 また、依存関係providedは、それがパックされ、同じことが展開で利用可能であることを意味しています。

<dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-core</artifactId> 
      <version>2.6.3</version> 
     </dependency> 

私は疑わしい/スパークの提出は、以下のようにチェックしてください。瓶のあなたのディレクトリは、あなたのディストリビューションからlibが抽出され

--conf "spark.driver.extraLibrayPath=$HADOOP_HOME/*:$HBASE_HOME/*:$HADOOP_HOME/lib/*:$HBASE_HOME/lib/htrace-core-3.1.0-incubating.jar:$HDFS_PATH/*:$SOLR_HOME/*:$SOLR_HOME/lib/*" \ 
     --conf "spark.executor.extraLibraryPath=$HADOOP_HOME/*" \ 
--conf "spark.driver.extraClassPath=$(echo /your directory of jars/*.jar | tr ' ' ',') 
      --conf "spark.executor.extraClassPath=$(echo /your directory of jars/*.jar | tr ' ' ',') 


あなたはまた、

val cl = ClassLoader.getSystemClassLoader 
cl.asInstanceOf[java.net.URLClassLoader].getURLs.foreach(pri‌​ntln) 

はEDITお使いのプログラムから以下のようにクラスパスを印刷することができますライン上で実行した後、あなたのクラスパスに存在する古い重複したjarファイルを見つけた場合、その後、あなたの アプリや--jarsを使用して、あなたのライブラリが含ま設定を試してみてください spark.{driver,executor}.userClassPathFirsttrue

+0

それが役に立ちましたか? –

+0

こんにちはラム、私はあなたが述べたようにClassLoader.getSystemClassLoaderを印刷したときにその理由を見つけました。ファイルを使用していました:/opt/cloudera/parcels/CDH-5.7.0-1.cdh5.7.0.p0.45/ jars/jackson-core-2.2.3.jarが必要ですが、jackson-core-2.6.3が必要です。どうすればclouderaシステムのjarファイルを上書きできますか? – Jack

+0

@Jack Thats、これらの競合を解決することは、Sparkでは難しいライブラリを使用するSparkでは難解です。あなたのライブラリを アプリに含めるか、--jarsを使用してください。また、 'spark。{driver、executor} .userClassPathFirst'を' torue'に設定してみてください。 –

関連する問題