@Frankie хорошо, теперь все понятно, как это работает, отлично :)
rk Job я не знаю, как импортировать и использовать банки, которые разделяются методомSparkContext.addJar()
, Кажется, что этот метод может перемещать банки в какое-то место, доступное для других узлов в кластере, но я не знаю, как их импортировать.
Это пример:
package utils;
public class addNumber {
public int addOne(int i){
return i + 1;
}
public int addTwo(int i){
return i + 2;
}
}
Я создаю класс с именем addNumber и превращаю его в файл JARutils.jar
.
Затем я создаю искровую работу, и коды показаны ниже:
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()
?
Мне интересно, если есть способ, используя банки, импортированные методомaddJar()
, Заранее спасибо.