Spark中方法addJar()的用法是什么?

时间:2017-03-22 16:36:39

标签: apache-spark jar classpath

在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。提前谢谢。

1 个答案:

答案 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