Spark中addJar()方法有什么用?

mkshixfv  于 2023-05-23  发布在  Apache
关注(0)|答案(1)|浏览(175)

在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。先谢谢你了。

uelo1irk

uelo1irk1#

你有没有试着把jar的路径设置为前缀“local”?来自文档:

public void addJar(String path)

为将来要在此SparkContext上执行的所有任务添加JAR依赖项。传递的路径可以是本地文件、HDFS(或其他Hadoop支持的文件系统)中的文件、HTTP、HTTPS或FTP URI,也可以是每个工作节点上文件的local:/路径。
你也可以用setJars试试:

val conf = new SparkConf()
             .setMaster('local[*]')
             .setAppName('tmp')
             .setJars(Array('/path1/one.jar', '/path2/two.jar'))
    
val sc = new SparkContext(conf)

并查看此处,请参见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

相关问题