Я создаю Spark Sql Application и хочу запустить его на удаленном спарк-кластере с моей локальной машины с помощью моей IDE. Я знаю, что я должен установить какую-то опцию при создании объекта 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-файл приложения. Есть ли лучший способ для этого?
2) Почему иногда нет необходимости использовать метод setJars, хотя я запускаю программу через IDE? Например, когда я не использую лямбда-функцию в моем коде, нет необходимости устанавливать функцию 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();
Ошибка отсутствует. Итак, почему это случилось? Почему я должен использовать setJars, когда я использую лямбда-функцию? Когда я должен использовать setJars, а когда нет?