2017-05-24 1 views
1

私はそれについていくつかの質問があることを知っていますが、私の問題を解決するのに十分な情報がありませんでした。クライアントスレッドジョブのスカラエラー

Eclipseプロジェクトから糸クライアントモードでジョブを実行しようとしています。私は2つのノード(それらのうちの1つは現在オフになっています)を持つハープ・クラスタを持っています。私はそれをクラスタモード(spark-submit)で実行しようとしました。

 SparkConf conf = new SparkConf().setAppName("AnomalyDetection-BuildModel").setMaster("local[*]"); 

、それが作品だ:私はこのようなスパークコンテキストを作成しようとしています

:私は日食プロジェクトからローカルそれを実行しようとしました。

しかし、私は「糸クライアント」でそれを実行しよう:

SparkConf conf = new SparkConf().setAppName("AnomalyDetection-BuildModel").setMaster("yarn-client").set("driver-memory", "556m").set("executor-memory", "556m").set("executor-cores", "1").set("queue", "default"); 

私はエラーをrecived:

cannot assign instance of scala.collection.immutable.List$SerializationProxy to field org.apache.spark.rdd.RDD.org$apache$spark$rdd$RDD$$dependencies_ of type scala.collection.Seq in instance of org.apache.spark.rdd.MapPartitionsRDD 

もう一つの問題は、私は正確にどのように依存関係を知らないということですこの場合の互換性の問題とローカルの[*]でエラーが発生しない理由について説明します。

これは私のpom.xmlファイルである:私はHadoopのための設定ファイルを追加したEclipseプロジェクトで

<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>buildModelTest</groupId> 
    <artifactId>buildModelTest</artifactId> 
    <version>1</version> 
    <properties> 
     <encoding>UTF-8</encoding> 
     <scala.version>2.11.8</scala.version> 
     <spark.version>2.1.0</spark.version> 
     <hadoop.version>2.7.0</hadoop.version> 
    </properties> 
    <dependencies> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>3.8.1</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.spark</groupId> 
      <artifactId>spark-core_2.10</artifactId> 
      <version>2.1.0</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.spark</groupId> 
      <artifactId>spark-mllib_2.10</artifactId> 
      <version>2.1.0</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.scala-lang</groupId> 
      <artifactId>scala-reflect</artifactId> 
      <version>2.11.8</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.spark</groupId> 
      <artifactId>spark-yarn_2.10</artifactId> 
      <version>2.1.0</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.scalatest</groupId> 
      <artifactId>scalatest_2.11</artifactId> 
      <version>3.0.0</version> 
      <scope>provided</scope> 
     </dependency> 
    </dependencies> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-jar-plugin</artifactId> 
       <configuration> 
        <archive> 
         <manifest> 
          <mainClass>buildModelTest.Main</mainClass> 
         </manifest> 
        </archive> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.3</version> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

、およびビルド構成にSCALA_HOME、SPARK_HOME、HADOOP_CONF_DIRの環境変数。 SPARKに関しては、私はspark-2.1.0-bin-hadoop2.7とSCALA 2.11.8を持っています。私のJavaプロジェクトでは、Spark/binからすべてのjarファイルを追加しました。

なぜ、これが "client-yarn"で動作しないのか、あなたは何か考えていますか?依存関係の問題はありますか?はいの場合、依存関係の点で通常と糸クライアントの違いは何ですか?私がSpark/binから追加したいくつかのjarファイルをMavenにダウンロードするので、それらのいくつかは重複していると思います。

EDIT

sparkContextは(私は推測)が正しく初期化されます。私はた.rrd()メソッドを呼び出したときにエラーがスローされます。あなたはYARNクラスタ上のスパークアプリケーションを実行しようとしているようにあなたのコードから

 JavaRDD<Vector> parsedTrainingData = data.map(new Function<String, Vector>() { 

        private static final long serialVersionUID = 1L; 

        public Vector call(String s) { 
         String[] sarray = s.split(" "); 
         double[] values = new double[sarray.length]; 
         for (int i = 0; i < sarray.length; i++) { 
          values[i] = Double.parseDouble(sarray[i]); 
         } 
         return Vectors.dense(values); 
        } 
       }); 
       parsedTrainingData.cache(); 

       // Cluster the data into two classes using KMeans 
       KMeansModel clusters = KMeans.train(parsedTrainingData.rdd(), numClusters, numIterations); 

答えて

0

、それが見えます。

SparkConf conf = new SparkConf().setAppName("AnomalyDetection-BuildModel").setMaster("yarn-client").set("driver-memory", "556m").set("executor-memory", "556m").set("executor-cores", "1").set("queue", "default"); 

ここで、setMaster("yarn-client")は、マスタに間違ったパラメータです。

マスターをlocal[*]に設定すると、スパーク・アプリケーションはマシン内の単一のJVM内で実行されます。

実行中のYARNクラスタにスパークアプリケーションを送信するには、setMaster("yarn")を設定し、オプションでdeploy-modeプロパティをクライアントまたはクラスタに設定します。

これらのパラメータの詳細については、thisを参照してください。

また、コマンドラインからではなくコードからアプリケーションを送信する場合は、this postを参照してください。

+0

あなたが言ったようにパラメータを変更しようとしました。アプリケーションはまったく同じように動作します。だから私は.setmaster( "yarn-client")と同じであると思います。setmaster( "yarn").set( "deploy-mode"、 "client")。 さて、私はこれをコマンドラインから行うのを避けるために行いました。私の理解から、これはコードからスパークアプリケーションを提出する方法です。 –

関連する問題