EMR LinkageError 上的 Spark + Cassandra

Posted

技术标签:

【中文标题】EMR LinkageError 上的 Spark + Cassandra【英文标题】:Spark + Cassandra on EMR LinkageError 【发布时间】:2016-07-16 08:40:27 【问题描述】:

我在 EMR 4.4.0 上部署了 Spark 1.6 我正在连接到部署在 EC2 上的 datastax cassandra 2.2.5。

连接可以使用 spark-connector 1.4.2_s2.10 将数据保存到 cassandra(因为它有 guava 14)但是使用 1.4.2 版本的连接器从 cassandra 读取数据失败。

正确的组合建议使用 1.5.x,因此我开始使用 1.5.0。 首先我遇到了番石榴问题,我使用 userClasspathFirst 解决方案修复了它。

spark-shell --conf spark.yarn.executor.memoryOverhead=2048 
--packages datastax:spark-cassandra-connector:1.5.0-s_2.10 
--conf spark.cassandra.connection.host=10.236.250.96 
--conf spark.executor.extraClassPath=/home/hadoop/lib/guava-16.0.1.jar:/etc/hadoop/conf:/etc/hive/conf:/usr/lib/hadoop-lzo/lib/*:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/* 
--conf spark.driver.extraClassPath=/home/hadoop/lib/guava-16.0.1.jar:/etc/hadoop/conf:/etc/hive/conf:/usr/lib/hadoop-lzo/lib/*:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/* 
--conf spark.driver.userClassPathFirst=true 
--conf spark.executor.userClassPathFirst=true

现在我克服了 Guava 16 错误,但是由于我使用的是 userClassPathFirst,我面临另一个冲突,我没有任何方法可以解决它。

Lost task 2.1 in stage 2.0 (TID 6, ip-10-187-78-197.ec2.internal): java.lang.LinkageError: 
loader constraint violation: loader (instance of org/apache/spark/util/ChildFirstURLClassLoader) previously initiated loading for a different type with name "org/slf4j/Logger"

当我使用 Java 代码而不是 spark-shell 重复这些步骤时,我遇到了同样的问题。 有什么解决办法,或者其他更干净的方法?

谢谢!

【问题讨论】:

我实际上遇到了完全相同的问题。 我们找到了根本原因,这是一些冲突的依赖关系。当我从包中删除所有依赖项并只拥有绝对必要的依赖项时,问题就消失了。我无法确定导致依赖冲突的确切包,但可以肯定它的根本原因。我们重新构建了代码,将其拆分为两个包,一个包含所有业务逻辑,另一个非常精简,仅用于 Spark 工作。 好吧,除了 Spark,我唯一的依赖是 Cassandra 连接器,但我仍然遇到错误。对我来说,它看起来像这里描述的问题:techblog.applift.com/upgrading-spark 所以基本上两个类加载器由于某种原因发生了冲突。 原来我确实遇到了这个问题:issues.apache.org/jira/browse/SPARK-10910 嗨@lazywiz - 你能描述一下你是如何在与titan/cassandra合作的emr上获得火花的吗?我完全被困在这里,甚至不知道如何开始 - 大多数文档似乎暗示 cassandra 和 spark 必须存在于同一个集群上。如果您有任何可以共享的配置文件/脚本 - 那将是非常棒的。谢谢! 【参考方案1】:

我在使用 'userClassPathFirst' 标志时遇到了同样的错误。

从配置中删除这 2 个标志,只使用“extraClassPath”参数。

这里有详细的答案: https://***.com/a/40235289/3487888

【讨论】:

以上是关于EMR LinkageError 上的 Spark + Cassandra的主要内容,如果未能解决你的问题,请参考以下文章

AWS EMR 上的 Spark:使用更多执行器

EMR 上的 spark-redshift 连接超时异常

markdown Amazon EMR上的Apache Spark

具有非默认 spark.executor.memory 设置的 EMR 上的 pyspark 代码未生效?

aws emr 上的 spark 集群找不到 spark-env.sh

为啥 AWS EMR 上的 Spark 不从应用程序 fat jar 加载类?