我有一个三节点火花簇和三节点点火簇。 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)
我还应该怎么做才能解决此问题?非常感谢您的帮助。 谢谢。
答案 0 :(得分:1)
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 / *
我认为这是真正的问题。
似乎您必须降低ignite的版本。
<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的路径。