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

What is use of method addJar() in Spark?

在 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 的 class 并将其放入一个 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() 方法不能保证 jars 包含在 spark 作业的 class 路径中。如果我想使用 jar 文件,我已将所有依赖项移动到集群每个节点中的相同路径。但是如果我可以移动并包含所有的罐子,那么方法 addJar() 有什么用呢?

我想知道是否有使用方法 addJar() 导入的 jars 的方法。提前致谢。

您是否尝试设置前缀为 "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 选项

并在 spark-submit 中设置“--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