在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 + "||") }
}
}
错误" java.lang.NoClassDefFoundError:utils / addNumber"通过命令"spark-submit"
提交作业后提出。
我知道方法addJar()
不保证jar包含在spark作业的类路径中。如果我想使用jar文件,我将所有依赖项移动到集群的每个节点中的相同路径。但是,如果我可以移动并包含所有的jar,方法addJar()
的用途是什么?
我想知道是否有办法使用方法addJar()
导入的jar。提前谢谢。
答案 0 :(得分:0)
您是否尝试使用前缀" local"?设置jar的路径?来自文档:
public void addJar(String path)
为要对此执行的所有任务添加JAR依赖项 将来SparkContext。传递的路径可以是本地路径 文件,HDFS(或其他Hadoop支持的文件系统)中的文件,HTTP, 每个工作节点上的文件的HTTPS或FTP URI或本地:/路径。
您也可以尝试这种方式:
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"火花提交中的参数:
--jars /path/1.jar,/path/2.jar
或编辑conf / spark-defaults.conf:
spark.driver.extraClassPath /path/1.jar:/fullpath/2.jar
spark.executor.extraClassPath /path/1.jar:/fullpath/2.jar