使用 Spark 和 Cassandra Java 驱动程序时检测到 Guava 问题 #1635

Detected Guava issue #1635 when using Spark and Cassandra Java Driver

我在我们的 spark 应用程序中使用 spring-data-cassandra 1.5.1(它使用 cassandra java driver 3.x)。当 运行 执行 spark-submit 命令时,出现以下错误。

Caused by: java.lang.IllegalStateException: Detected Guava issue #1635 which indicates that a version of Guava less than 16.01 is in use.  This introduces codec resolution issues and potentially other incompatibility issues in the driver.  Please upgrade to Guava 16.01 or later.
    at com.datastax.driver.core.SanityChecks.checkGuava(SanityChecks.java:62)
    at com.datastax.driver.core.SanityChecks.check(SanityChecks.java:36)
    at com.datastax.driver.core.Cluster.<clinit>(Cluster.java:68)
    ... 71 more

似乎 cassandra 驱动程序正在寻找版本 > 16.0.1 的 Guava,但它失败了,因为它找到了版本 < 16.0.1。我确保构建的 spark uber jar 只有 Guava version 19.0。但是当我执行 spark-submit.

时仍然出现同样的错误

经过进一步分析,我发现 spark-2.0.1-bin-hadoop2.7/jarsGava v14.0.1,这是在我执行 spark-submit 时加载的,而没有考虑 spark application jar 中的 Guava v19.0 ].

然后我在 spark-2.0.1-bin-hadoop2.7/jars 中将 v14.0.1 替换为 v19.0,现在我没有收到任何错误并且应用程序 运行 正常。但我认为这不是一个好方法并且不想在 prod.

中这样做

如果我 运行 在 eclipse 中使用相同的 spark 作业(通过在代码中设置 conf master=local 并将 运行 设置为 Java 程序)它工作正常。

我在 SO 中发现了类似的问题,但没有找到任何解决方案。如果有人遇到同样的问题并对此有解决方案,请告诉我。

使用 Datastax Enterprise Cassandra 5.x

谢谢!!!

因为spring-data-cassandra 使用了cassandra java驱动。未包含 Cassandra java 驱动程序,因为它已解释

正如@RussS 所说:

  • 仅使用阴影罐,这是 Spark Cassandra 连接器 2.0.0-M3 中的默认设置
  • 不要包含对 Cassandra Java 驱动程序的任何依赖项。这样做会重新引入 guava 版本。

看看https://github.com/datastax/spark-cassandra-connector/blob/master/doc/FAQ.md#how-do-i-fix-guava-classpath-errors

Spark 2.0.1 有 Guava 14.x jar,cassandra-java-driver 需要 Guava 版本 > 16.0.1。当我们使用 spark-submit 提交 spark 作业时,spark 中的番石榴版本会覆盖我们的 spark 应用程序 jar 中的版本,从而导致出现问题。通过使用 guava 19.0.jar

覆盖 spark guava 14.x jar 解决了这个问题
  1. 通过在 spark 提交命令中传递下面的配置来覆盖 spark guava 14.x jar --conf spark.driver.extraClassPath=/path/to/guava-19.0.jar --conf spark.executor.extraClassPath=/path/to/guava-19.0.jar

  2. 确保我们的 spark 应用程序 jar 不包含任何 guava 依赖项(也排除传递依赖项)版本 < 16.0.1 ... 或者您可以在 pom.xml 中包含最新版本,例如该版本将包含在最终 jar/war