2017-03-22 3 views
1

スパークジョブでは、方法SparkContext.addJar()で共有されているjarをインポートして使用する方法がわかりません。この方法では、クラスタ内の他のノードからアクセスできる場所にジャーを移動することができますが、インポート方法はわかりません。私はaddNumberというクラスを作成し、jarファイルutils.jarにそれを作るSparkでメソッドaddJar()を使用するとは何ですか?

package utils; 

public class addNumber { 
    public int addOne(int i){ 
     return i + 1; 
    } 
    public int addTwo(int i){ 
     return i + 2; 
    } 
} 


これは一例です。

は、それから私は、スパークジョブを作成し、コードは以下の通りである:

import org.apache.spark.SparkConf 
import org.apache.spark.SparkContext 

object TestDependencies { 
    def main(args:Array[String]): Unit = { 
    val sparkConf = new SparkConf 
    val sc = new SparkContext(sparkConf) 
    sc.addJar("/path/to//utils.jar") 

    val data = 1 to 100 toList 
    val rdd = sc.makeRDD(data) 

    val rdd_1 = rdd.map (x => { 
     val handler = new utils.addNumber 
     handler.addOne(x) 
    }) 

    rdd_1.collect().foreach { x => print(x + "||") } 
    } 
} 

エラー「java.lang.NoClassDefFoundErrorが:utilsの/ addNumber」コマンド"spark-submit"てジョブの投入後に発生します。

私はその方法を知っていますaddJar()はスパークジョブのクラスパスに含まれるジャーを保証しません。 jarファイルを使用したい場合、私はすべての依存関係をクラスタの各ノードの同じパスに移動します。しかし、私が移動してすべての瓶を含めることができれば、方法addJar()の使用は何ですか?

方法でインポートされたjarを使用する方法があるかどうかは疑問です。前もって感謝します。

答えて

0

接頭辞「local」を使用してjarのパスを設定しようとしましたか?ドキュメントから:

public void addJar(String path) 

Adds a JAR dependency for all tasks to be executed on this SparkContext in the future. The path passed can be either a local file, a file in HDFS (or other Hadoop-supported filesystems), an HTTP, HTTPS or FTP URI, or local:/path for a file on every worker node.

あなたはこのようにも試すことができます。

val conf = new SparkConf() 
      .setMaster('local[*]') 
      .setAppName('tmp') 
      .setJars(Array('/path1/one.jar', '/path2/two.jar')) 

val sc = new SparkContext(conf) 

を、ルックhereを取り、spark.jarsオプション

と設定された "--jars" をチェックスパーク送信のパラメータ:

または編集confに/火花-defaults.confには:プレフィックスとして、それでも同じ問題を抱えている:

spark.driver.extraClassPath /path/1.jar:/fullpath/2.jar 
spark.executor.extraClassPath /path/1.jar:/fullpath/2.jar 
+0

ハイテクする@ mariusz051、私は地元の追加しようとしました。ログから、sparkが私のjarをコピーしてクラスローダーに追加しましたが、このクラスはexecutorにはまだ見つかりません。 – Frankie

+0

addJarはそれをマスターJVMのクラスパスに追加しません。これらのクラスは既に存在しているとみなし、JARを追加してワーカーノードに送信します。 –

+0

@NayanSharma私は自分の答えを編集しました –

関連する問題