我正在创建一个 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/