spark-shell — Не удается получить доступ к функциям Java в jars

#java #scala #apache-spark #jar #spark-shell

#java #scala #apache-spark #jar #spark-shell

Вопрос:

Я начал изучать spark 2 дня назад. Итак, я довольно новичок в этом. Мой вариант использования связан с доступом к функции java, присутствующей во внешнем jar в моем коде scala, который я пишу в spark-shell. Но я думаю, что я неправильно загружаю свой jar. Вот что я делаю

 spark-shell --master local[2] --jars pathToJarsWithComma --conf="spark.driver.extraClassPath=pathToJarsWithColon" --conf="spark.executor.extraClassPath=pathToJarsWithColon"
  

Вот как я запускаю свою spark-shell с передачей всех необходимых jars. И всякий раз, когда я пытаюсь вызвать статическую функцию Java, например :

 rdd1.collect.foreach(a=>MyClass.myfuncttion(a))
  

Я получаю сообщение об ошибке как :

 <console>:26: error: not found: value MyClass
  

Я хочу знать, правильно ли я понимаю. Можем ли мы использовать функции Java в spark, загрузив внешние jars. Если да, то что я здесь делаю не так. Пожалуйста, укажите.

Комментарии:

1. Вы импортировали это? Сначала вам нужно импортировать класс с помощью import my.package.MyClass ( my.package , конечно, example).

2. Вы уверены, что передаваемый вами jar содержит класс, на который вы ссылаетесь?

3. Да, у меня есть класс, присутствующий в jar. Я импортировал пакет следующим образом: import my.package._ надеясь, что все классы в этом пакете будут загружены. Но я получаю ту же ошибку, о которой упоминал.

Ответ №1:

Мы можем загружать функции Java в Spark, загружая внешние jars. Я не уверен, нужны ли вам конфы, которые вы добавили в конце, чтобы заставить это работать. Что касается меня, я попробовал следующее, чтобы протестировать загрузку jar в оболочку spark.

 ./bin/spark-shell --master <spark url>  --jars /home/SparkBench/Terasort/target/jars/guava-19.0-rc2.jar
  

После этого в командной строке я попытался получить доступ к полю из класса в jar.

 scala> import com.google.common.primitives.UnsignedBytes
import com.google.common.primitives.UnsignedBytes
scala> UnsignedBytes.MAX_POWER_OF_TWO
res0: Byte = -128
  

Как вы можете видеть, я смог получить доступ к полям из внешнего jar. Вы также можете проверить, можете ли вы получить доступ к классу с помощью простого поля из него.