Не удалось найти источник данных: воспламенить - PullRequest
0 голосов
/ 30 мая 2019

У меня есть три узла искрового кластера и три узла воспламеняющего кластера. Версия Spark: 2.3 Версия зажигания: 2.7

Вот как я устанавливаю classpath в spark-default.conf в Spark:

spark.driver.extraClassPath /home/user/apache-ignite-2.7.0-bin/libs/*:/home/user/apache-ignite-2.7.0-bin/libs/ignite-indexing/*:/home/user/apache-ignite-2.7.0-bin/libs/optional/ignite-spark/*:/home/user/apache-ignite-2.7.0-bin/libs/ignite-spring/*

В моем коде Spark (Java) я создаю фрейм данных и пишу в Ignite следующим образом:

df.write()
.format(IgniteDataFrameSettings.FORMAT_IGNITE())
.option(IgniteDataFrameSettings.OPTION_CONFIG_FILE(), confPath)
.option(IgniteDataFrameSettings.OPTION_TABLE(), tableName)
.mode(SaveMode.Append)
.option(IgniteDataFrameSettings.OPTION_CREATE_TABLE_PRIMARY_KEY_FIELDS(), primaryKey)
.option(IgniteDataFrameSettings.OPTION_CREATE_TABLE_PARAMETERS(), "template=partitioned")
.save();

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

java.lang.ClassNotFoundException: Failed to find data source: ignite. Please find packages at http://spark.apache.org/third-party-projects.html
at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSource(DataSource.scala:635)
at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:241)

Caused by: java.lang.ClassNotFoundException: ignite.DefaultSource
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$23$$anonfun$apply$15.apply(DataSource.scala:618)
at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$23$$anonfun$apply$15.apply(DataSource.scala:618)
at scala.util.Try$.apply(Try.scala:192)
at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$23.apply(DataSource.scala:618)
at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$23.apply(DataSource.scala:618)
at scala.util.Try.orElse(Try.scala:84)
at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSource(DataSource.scala:618)

Что еще я должен сделать, чтобы решить эту проблему? Любая помощь высоко ценится. Спасибо.

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Обновление: , как упомянуто в документах по развертыванию воспламенения, следует также указать путь к классу исполнителя вместе с путем к драйверу

spark.executor.extraClassPath / opt / ignite / libs / : / opt / ignite / libs / необязательный / ignite-spark / : / opt / ignite / libs / необязательный / ignite-log4j / : /opt / ignite / libs / необязательный / ignite-yarn / : / opt / ignite / libs / ignite-spring / *

Я думаю, что это реальная проблема.


http://apache -ignite-users.70518.x6.nabble.com / Spark-Ignite-connection-using-Config-file-td21827.html

похоже на васнеобходимо уменьшить версию воспламенения.

для воспламенения 2,6:

<dependency> 
    <groupId>org.apache.ignite</groupId> 
    <artifactId>ignite-spark</artifactId> 
    <version>2.6.0</version> 
</dependency> 

Вы можете увидеть ( источник ):

  <dependency> 
      <groupId>org.apache.spark</groupId> 
      <artifactId>spark-core_2.11</artifactId> 
      <version>2.3.0</version> 
      <scope>compile</scope> 
    </dependency> 

Также см.
1) IGNITE-8534 они исправлены в версии 2.6 Ignite
2) Обсуждение-Обновление-Ignite-Spark-Module-s-Spark-версия-to-2-3-0

вызовите нижеприведенную функцию в вашем драйвере, которая выдаст весь классВсе записи для отладки файлов в вашем classpath.В этом ignite-spark jar должен присутствовать во время выполнения

Вызывающая сторона будет ...

val  urls = urlsinclasspath(getClass.getClassLoader).foreach(println)


def urlsinclasspath(cl: ClassLoader): Array[java.net.URL] = cl match {
    case null => Array()
    case u: java.net.URLClassLoader => u.getURLs() ++ urlsinclasspath(cl.getParent)
    case _ => urlsinclasspath(cl.getParent)
  }

Если вы хотите добавить зависимости jar без использования подстановочных знаков, вы можете увидеть моиответ, который добавит все jar-файлы из папки динамически к указанному вами пути.

Spark spark-submit --jars arguments хочет получить список запятых, как объявить каталог jars?

в этой папке должна быть вышеупомянутая банка зажигания-искры./home/user/apache-ignite-2.7.0-bin/libs/optional/ignite-spark/* используйте описанный выше подход и добавьте банку по папке.

0 голосов
/ 30 мая 2019

Эта ошибка означает, что у вас нет следующих ресурсов:

META-INF.services / org.apache.spark.sql.sources.DataSourceRegister

Это должно быть частью зависимости зажигания от искры.

Итак, что вы должны проверить:

1) Этот ignite-spark-2.7.0.jar существует в пути к классам всех ваших узлов, где у вас есть узлы Spark.

2) Если вы используете spark.driver.extraClassPath, проверьте следующее:

а. Вы делаете это в режиме клиента (клиент -deploy-mode), потому что Spark запускает HTTP-сервер Netty, который при запуске распределяет файлы для каждого из рабочих узлов. В режиме кластера искра выбрала рабочий узел-лидер для выполнения процесса драйвера. Это означает, что задание не запускается непосредственно с главного узла.

б. Я не уверен, но похоже, что extraClassPath требует список файлов jar вместо / path / to / lib / *. Вы можете попробовать использовать следующее:

EXECUTOR_PATH=""
   for eachjarinlib in $JARS ; do
if [ "$eachjarinlib" != "APPLICATIONJARTOBEADDEDSEPERATELY.JAR" ]; then
       EXECUTOR_PATH=file:$eachjarinlib:$EXECUTOR_PATH
fi
done
spark-submit --deploy-mode client --master yarn --conf "spark.driver.extraClassPath=$EXECUTOR_PATH" --class $EXAMPLE_CLASS $PATH_TO_JAR

где $ JARS - это путь к вашим библиотекам.

...