Как настроить Intellij 14 Scala Worksheet для запуска Spark

Я пытаюсь создать SparkContext на рабочем листе Intellij 14 Scala.

вот мои зависимости

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)
  }
}

Может ли кто-нибудь дать какое-то руководство о том, где мне следует искать решение этого исключения?

Благодарю.

6 ответов

Поскольку все еще есть некоторые сомнения в том, что вообще возможно запустить IntelliJ IDEA Scala Worksheet с помощью Spark, и этот вопрос является наиболее прямым, я хотел бы поделиться своим снимком экрана и рецептом стиля поваренной книги, чтобы оценить код Spark на рабочем листе.

Я использую Spark 2.1.0 с рабочим листом Scala в IntelliJ IDEA (CE 2016.3.4).

Первый шаг - создать файл build.sbt при импорте зависимостей в IntelliJ. Я использовал тот же simple.sbt из Spark Quick Start:

name := "Simple Project"

version := "1.0"

scalaVersion := "2.11.7"

libraryDependencies += "org.apache.spark" %% "spark-core" % "2.1.0"

На втором этапе снимите флажок "Запустить рабочий лист в процессе компиляции" в меню "Настройки" -> "Языки и рамки" -> Scala -> "Рабочий лист". Я также протестировал другие параметры рабочего листа, и они не влияли на предупреждение о создании дублированного контекста 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 с Spark: снимок экрана работающей Scala Worksheet с Spark

ОБНОВЛЕНИЕ для IntelliJ CE 2017.1 (рабочий лист в режиме REPL)

В 2017.1 Intellij ввел режим REPL для Worksheet. Я протестировал тот же код с опцией "Использовать REPL". Для запуска этого режима необходимо оставить флажок "Запустить рабочий лист в процессе компиляции" в настройках рабочего листа, которые я описал выше, установлен (по умолчанию).

Код прекрасно работает в режиме REPL Worksheet.

Вот скриншот: Spark в режиме REPL IJ Scala Worksheet

Я использую Intellij CE 2016.3, Spark 2.0.2 и запускаю рабочую таблицу scala в модели, совместимой с eclipse, пока что большинство из них теперь в порядке, осталась лишь небольшая проблема.

откройте Настройки -> введите scala -> в разделе "Языки и рамки", выберите "Scala" -> "Выбрать рабочий лист" -> выберите только режим совместимости с затмением или ничего не выберите.

Ранее при выборе "Запустить рабочий лист в процессе компиляции" у меня возникало много проблем, не только с использованием Spark, но и Elasticsearch. Я предполагаю, что при выборе "Запустить рабочий лист в процессе компиляции" Intellij выполнит некоторую хитрую оптимизацию, добавив ленивый к переменной и т. Д., Возможно, что в некоторых ситуациях делает рабочий лист довольно проводным.

Также я нахожу, что иногда, когда класс, определенный на рабочем листе, не работает или ведет себя ненормально, помещая отдельный файл и компилируя его, а затем запускающий его на рабочем листе, решает много проблем.

Я столкнулся с той же проблемой и не смог ее решить, хотя попробовал несколько попыток. Вместо рабочего листа, сейчас я использую консоль scala, по крайней мере, лучше, чем ничего.

Согласно сайту Spark 1.4.0 вы должны использовать scala 2.10.x:

Spark работает на Java 6+, Python 2.6+ и R 3.1+. Для Scala API Spark 1.4.0 использует Scala 2.10. Вам нужно будет использовать совместимую версию Scala (2.10.x).

Редакция:

Когда вы нажимаете "создать новый проект" в intelliJ после выбора проекта sbt и нажимаете "далее", появится это меню, где вы можете выбрать версию scala:

введите описание изображения здесь

Отредактировано 2:

Вы также можете использовать этот пакет Spark Core для Scala 2.11.x:

libraryDependencies += "org.apache.spark" %% "spark-core_2.11" % "1.4.0"

Ниже моя конфигурация зависимостей maven, она всегда работает и стабильна. Я обычно пишу спарк-прагматику и отправляю ее в yarn-cluster для запуска кластера.

Ключевым файлом является $ {spark.home} /lib/spark-assembly-1.5.2 hadoop2.6.0.jar, он содержит почти все зависимости искры и включается в каждый выпуск искры. (На самом деле spark-submit распространит этот jar-файл в кластер, так что больше не беспокойтесь об ClassNotFoundException:D)

Я думаю, что вы можете изменить вашу libraryDependencies += "org.apache.spark" %% "spark-core" % "1.4.0" с вышеупомянутой подобной конфигурацией (Maven использует systemPath для указания на локальную зависимость jar, я думаю, что SBT имеют аналогичную конфигурацию)

Примечание: регистрация исключений в jar-файлах не обязательна из-за конфликтов с другими jar-файлами.

 <!--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>

Я также сталкивался с подобной проблемой с Intellij, где библиотеки не решаются SBT после добавления libraryDependencies в build.sbt. IDEA не загружает зависимости по умолчанию. Перезапустил Intellij, это решает проблему. начать загрузку зависимостей.

Так,

Убедитесь, что зависимости загружены в ваш локальный проект, если нет, перезапустите IDE или запустите IDE для загрузки необходимых зависимостей.

Убедитесь, что хранилища разрешены, если нет, укажите местоположение хранилища в resolver+=

Другие вопросы по тегам