找不到数据源:点燃

时间:2019-05-30 05:14:54

标签: scala apache-spark integration ignite

我有一个三节点火花簇和三节点点火簇。 Spark版本:2.3 点燃版本:2.7

这是我在Spark的spark-default.conf中设置类路径的方式:

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 个答案:

答案 0 :(得分:1)

更新: as mentioned in the ignite deployment docs you should also mention executor classpath along with driver classpath

  

spark.executor.extraClassPath   / opt / ignite / libs / :/ opt / ignite / libs / optional / ignite-spark / :/ opt / ignite / libs / optional / ignite-log4j / :/ opt / ignite / libs / optional / ignite-yarn / :/ opt / ignite / libs / ignite-spring / *

我认为这是真正的问题。


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

似乎您必须降低ignite的版本。

For ignite 2.6:

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

您可以看到(source):

  <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)Discussion-Upgrade-Ignite-Spark-Module-s-Spark-version-to-2-3-0

在驱动程序中调用以下函数,它将提供所有类路径条目以调试类路径中的jar。在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 wants comma list, how to declare a directory of jars?

  

您应该在此文件夹中包含上述的ignite-spark jar。   /home/user/apache-ignite-2.7.0-bin/libs/optional/ignite-spark/*   使用上述方法并按文件夹添加jar。

答案 1 :(得分:0)

此错误表示您没有下一个资源:

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

那应该是ignite-spark依赖的一部分。

所以您应该检查什么:

1)该ignite-spark-2.7.0.jar存在于您拥有Spark节点的所有节点的类路径中。

2)如果您使用spark.driver.extraClassPath,请检查以下内容:

a。您将其设置为客户端模式(--deploy-mode客户端),因为Spark会启动Netty HTTP服务器,该服务器在启动时会为每个工作节点分配文件。在集群模式下,spark选择了一个领导者Worker节点来执行Driver进程。这意味着作业不是直接从“主”节点运行。

b。我不确定,但好像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是通往libs的路径。