java - 从 IDE 运行 Spark SQL 应用程序的 setJars() 方法

标签 java apache-spark apache-spark-sql

我正在创建一个 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) 虽然我通过IDE运行程序,但为什么有时不需要使用setJars方法?例如,当我在代码中不使用 lambda 函数 时,无需 setjars 函数。假设我有一类人有两个字段:CustomerNo、AccountNo。当我在代码中使用lambda函数时,如下所示(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

但是当我在代码中不使用lambda函数时,如下所示:

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

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

最佳答案

所以,在这里我假设您没有使用 spark-submit 工具,并且直接从 IDE 运行 Spark 程序。

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

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

第二个问题:

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

关于java - 从 IDE 运行 Spark SQL 应用程序的 setJars() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52164103/

相关文章:

java - 应用从单体服务升级到微服务

java - Android Q 上的 BitmapFactory : Unable to decode stream: java. io.FileNotFoundException:打开失败:EACCES(权限被拒绝)

python - 按日期分组 Spark 数据框

scala - 从 Spark 中的稀疏向量创建 LabeledPoint

java - Apache Spark 中的持久化选项

java - String[][] 名称与 String name[][] 之间的区别

java - 不带消息头的 MQMessage

apache-spark - 使用控制台输出格式显示 Spark 流批处理的完整结果

python - 从rest api到pyspark数据帧的嵌套json

java - Spark 在 UDF Java 中获取 WrappedArray<WrappedArray<Double>> 的值