在Spark作业中,我不知道如何导入和使用方法SparkContext.addJar()
共享的jar。看起来这个方法能够将jar移动到集群中其他节点可以访问的地方,但是我不知道如何导入它们。
这是一个例子:
package utils;
public class addNumber {
public int addOne(int i) {
return i + 1;
}
public int addTwo(int i) {
return i + 2;
}
}
我创建了一个名为addNumber
的类,并将其放入jar文件utils.jar
中。
然后我用下面的代码创建一个Spark作业:
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 + "||") }
}
}
在通过spark-submit
提交作业后引发错误java.lang.NoClassDefFoundError: utils/addNumber
。
我知道addJar()
不保证jar包含在Spark作业的classpath中。如果我想使用jar文件,我必须将集群中每个节点的所有依赖项移动到相同的路径。但是如果我可以移动并包含所有的jar,那么addJar()
方法有什么用呢?
我想知道是否有一种方法可以使用通过方法addJar()
导入的jar。先谢谢你了。
1条答案
按热度按时间uelo1irk1#
你有没有试着把jar的路径设置为前缀“local”?来自文档:
为将来要在此SparkContext上执行的所有任务添加JAR依赖项。传递的路径可以是本地文件、HDFS(或其他Hadoop支持的文件系统)中的文件、HTTP、HTTPS或FTP URI,也可以是每个工作节点上文件的local:/路径。
你也可以用
setJars
试试:并查看此处,请参见
spark.jars
选项并在
spark-submit
中设置--jars
参数:或编辑
conf/spark-defaults.conf
: