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
在 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