首页 > 解决方案 > 从 IDE 运行 Spark SQL 应用程序的 setJars() 方法

问题描述

我正在创建一个 Spark Sql 应用程序,我想用我的 IDE 从本地机器上的远程 spark 集群上运行它。我知道我应该在创建 SparkConf 对象时设置一些选项,就像这样:

SparkConf conf = new SparkConf()
.setMaster("spark://SPARK-MASTER-ADDRESS:7077")
.set("spark.driver.host","my local IP Address")
.setJars(new String[]{"build\\libs\\spark-test-1.0-SNAPSHOT.jar"})
.setAppName("APP-NAME");

它在 IDE 中运行,一切正常

但我的问题是:

1)每次更改任何内容时,我是否需要重建我的应用程序的 jar 文件并将其路径设置为 setJars 方法?我看到在一些论坛上已经说过:每次更改任何内容时都需要构建 jar。但是每次重建应用程序的jar文件看起来有点困难。有没有更好的方法呢?

2)为什么有时不需要使用 setJars 方法,尽管我通过 IDE 运行程序?例如,当我在代码中不使用lambda 函数时,不需要 setjars 函数。假设我有一类人有两个字段:CustomerNo,AccountNo。当我像这样在我的代码中使用lamba函数时(personDS是person对象的数据集):

personDS.filter(f -> f.getCustomerNo().equals("001")).show();

出现以下错误:

java.lang.ClassCastException: cannot assign instance of scala.collection.immutable.List$SerializationProxy to field org.apache.spark.rdd.RDD.org$apache$spark$rdd$RDD$$dependencies_ of type scala.collection.Seq in instance of org.apache.spark.rdd.MapPartitionsRDD

但是当我在我的代码中不使用 Lamba 函数时:

personDS.filter(col("customerNo").equalTo(001)).show();

没有错误发生。那么,为什么会发生这种情况?为什么我在使用 lambda 函数时必须使用 setJars?我什么时候应该使用 setJars 什么时候不应该使用?

标签: javaapache-sparkapache-spark-sql

解决方案


所以,在这里我假设你没有使用spark-submit设施,而是直接从你的 IDE 运行 spark 程序。

以下是我对您第一个问题的回答:

1)每次更改任何内容时,是否都需要重建应用程序的 jar 文件?-是的,部署您每次更改代码时都需要构建 jar 的更改。我使用 maven 来做同样的事情。

第二个问题:

我认为,每当您使用引用项目的方法/类的 lambda 进行任何类型的映射操作时,您都需要将它们作为附加 jar 提供。


推荐阅读