Как настроить Intellij 14 Scala Рабочий лист для запуска Spark
Я пытаюсь создать SparkContext в Intellij 14 Scala Worksheet.
вот мои зависимости
name := "LearnSpark"
version := "1.0"
scalaVersion := "2.11.7"
// for working with Spark API
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.4.0"
Вот код, который я запускаю на листе
import org.apache.spark.{SparkContext, SparkConf}
val conf = new SparkConf().setMaster("local").setAppName("spark-play")
val sc = new SparkContext(conf)
Ошибка
15/08/24 14:01:59 ERROR SparkContext: Error initializing SparkContext.
java.lang.ClassNotFoundException: rg.apache.spark.rpc.akka.AkkaRpcEnvFactory
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
Когда я запускаю Spark как автономное приложение, он отлично работает. Например
import org.apache.spark.{SparkContext, SparkConf}
// stops verbose logs
import org.apache.log4j.{Level, Logger}
object TestMain {
Logger.getLogger("org").setLevel(Level.OFF)
def main(args: Array[String]): Unit = {
//Create SparkContext
val conf = new SparkConf()
.setMaster("local[2]")
.setAppName("mySparkApp")
.set("spark.executor.memory", "1g")
.set("spark.rdd.compress", "true")
.set("spark.storage.memoryFraction", "1")
val sc = new SparkContext(conf)
val data = sc.parallelize(1 to 10000000).collect().filter(_ < 1000)
data.foreach(println)
}
}
Может кто-нибудь дать некоторые рекомендации о том, где я должен искать решение этого исключения?
Спасибо.
Ответы
Ответ 1
Так как все еще есть некоторые сомнения, если вообще возможно запустить IntelliJ IDEA Scala Рабочий лист с Spark, и этот вопрос является самым прямым, я хотел бы поделиться своим скриншотом и рецептом стиля поваренной книги, чтобы получить код Spark оценивается на листе.
Я использую Spark 2.1.0 с Scala Рабочий лист в IntelliJ IDEA (CE 2016.3.4).
Первым шагом является создание файла build.sbt при импорте зависимостей в IntelliJ. Я использовал тот же simple.sbt из Быстрый запуск Spark:
name := "Simple Project"
version := "1.0"
scalaVersion := "2.11.7"
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.1.0"
Второй шаг - снять флажок "Запустить рабочий лист в процессе компиляции" в "Настройки → Языки и рамки" → Scala → Рабочий лист. Я также проверил другие настройки Worksheet, и они не повлияли на предупреждение о создании дублирующего контекста Spark.
Вот версия кода из примера SimpleApp.scala в том же руководстве, измененном для работы на Рабочем листе. Параметры master
и appName
должны быть установлены в том же рабочем листе:
import org.apache.spark.{SparkConf, SparkContext}
val conf = new SparkConf()
conf.setMaster("local[*]")
conf.setAppName("Simple Application")
val sc = new SparkContext(conf)
val logFile = "/opt/spark-latest/README.md"
val logData = sc.textFile(logFile).cache()
val numAs = logData.filter(line => line.contains("a")).count()
val numBs = logData.filter(line => line.contains("b")).count()
println(s"Lines with a: $numAs, Lines with b: $numBs")
Вот скриншот работы Scala Worksheet with Spark:
![скриншот работы Scala Рабочий лист с искровым]()
UPDATE для IntelliJ CE 2017.1 (рабочий лист в режиме REPL)
В 2017 году Intellij представил режим REPL для рабочего листа. Я проверил один и тот же код с опцией "Использовать REPL". Для запуска этого режима вам необходимо оставить флажок "Запустить рабочий лист в процессе компилятора" в "Параметры рабочего листа", который был описан выше (по умолчанию).
Код работает нормально в режиме REPL рабочего листа.
Вот скриншот:
![Искра в IJ Scala Рабочий лист REPL mode]()
Ответ 2
Я использую Intellij CE 2016.3, Spark 2.0.2 и запускаю рабочий лист scala в модели, совместимой с eclipse, до сих пор большинство из них в порядке, осталось только небольшая проблема.
откройте Preferences- > type scala → в языках и Framework, выберите scala → Choose Worksheet → выберите только режим совместимости затмения или ничего не выберите.
Раньше при выборе "Запустить лист в процессе компиляции" у меня возникло много проблем, а не только Spark, также Elasticsearch. Думаю, при выборе "Запустить рабочий лист в процессе компилятора" Intellij сделает какую-то сложную оптимизацию, добавив ленивую переменную и т.д., Возможно, что в какой-то ситуации делает рабочий лист довольно проводным.
Также я нахожу, что иногда, когда класс, определенный в листе, не работает или ведет себя ненормально, добавляет отдельный файл и компилирует его, а затем запускает его на листе, будет решать множество проблем.
Ответ 3
Согласно Spark 1.4.0 сайт, вы должны использовать scala 2.10.x:
Spark работает на Java 6+, Python 2.6+ и R 3.1+. Для API scala Spark 1.4.0 использует scala 2.10. Вам понадобится использовать совместимую версию scala (2.10.x).
Редакция:
Когда вы нажимаете "Создать новый проект" в intelliJ после выбора проекта sbt и нажмите "Далее", это меню появится там, где вы можете выбрать версию scala:
![введите описание изображения здесь]()
EDITED 2:
Вы также можете использовать этот пакет искрового сердечника для scala 2.11.x:
libraryDependencies += "org.apache.spark" %% "spark-core_2.11" % "1.4.0"
Ответ 4
Я столкнулся с одной и той же проблемой и не смог ее решить, хотя пытался несколько попыток. Вместо рабочего листа, прямо сейчас я использую scala console, по крайней мере лучше, чем ничего не использовать.
Ответ 5
Я тоже сталкиваюсь с аналогичной проблемой с Intellij, где библиотеки не разрешаются SBT после добавления libraryDependencies в build.sbt. IDEA не загружает зависимости по умолчанию. Перезагрузите Intellij, он решает проблему. начните загрузку зависимостей.
Итак,
Убедитесь, что зависимости загружены в локальном проекте, если нет, перезапустите среду IDE или вызовите среду IDE для загрузки необходимых зависимостей.
Убедитесь, что репозитории разрешены, в случае отсутствия, укажите местоположение репозитория в resolver + =
Ответ 6
Ниже моя конфигурация зависимостей maven, она всегда работает и стабильна. Я обычно пишу искровую праграмму и отправляю ее в кластер пряжи для запуска кластера.
Ключевая банка ${spark.home}/lib/spark-assembly-1.5.2 hasoop2.6.0.jar, она содержит почти все искровые зависимости и включена в каждую искровую разрядку. (На самом деле spark-submit будет распространять эту банку на кластер, поэтому больше не перепутайте ClassNotFoundException: D)
Я думаю, вы можете изменить libraryDependencies + = "org.apache.spark" %% "искровое ядро" % "1.4.0" с аналогичной конфигурацией (Maven use systemPath, чтобы указать на local jar dependency, я думаю, что SBT имеет схожую конфигурацию)
Примечание: исключение протоколирования баннеров не является обязательным, из-за его конфликтов с другими банками.
<!--Apache Spark -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-assembly</artifactId>
<version>1.5.2</version>
<scope>system</scope>
<systemPath>${spark.home}/lib/spark-assembly-1.5.2-hadoop2.6.0.jar</systemPath>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.10.2</version>
</dependency>