2

我在 Spark Yarn 上运行工作并尝试向 Influx DB 发送消息,但我在 okio 冲突中崩溃:

22:17:54 ERROR ApplicationMaster - User class threw exception: java.lang.NoSuchMethodError: okio.BufferedSource.readUtf8LineStrict(J)Ljava/lang/String;
java.lang.NoSuchMethodError: okio.BufferedSource.readUtf8LineStrict(J)Ljava/lang/String;
    at okhttp3.internal.http1.Http1Codec.readHeaderLine(Http1Codec.java:212)
    at okhttp3.internal.http1.Http1Codec.readResponseHeaders(Http1Codec.java:189)

这是我的依赖项:

val cdhVersion = "cdh5.12.2"
val sparkVersion = "2.2.0.cloudera2"
val parquetVersion = s"1.5.0-$cdhVersion"
val hadoopVersion = s"2.6.0-$cdhVersion"
val awsVersion = "1.11.295"
val log4jVersion = "1.2.17"
val slf4jVersion = "1.7.5" 

lazy val sparkDependencies = Seq(
  "org.apache.spark" %% "spark-core" % sparkVersion,
  "org.apache.spark" %% "spark-hive" % sparkVersion,
  "org.apache.spark" %% "spark-sql" % sparkVersion,
  "org.apache.spark" %% "spark-streaming" % sparkVersion,
  "org.apache.hadoop" % "hadoop-common" % "2.2.0"
)

lazy val otherDependencies = Seq(
  "org.apache.spark" %% "spark-streaming-kinesis-asl" % "2.2.0",
  "org.clapper" %% "grizzled-slf4j" % "1.3.1",
  "org.apache.logging.log4j" % "log4j-slf4j-impl" % "2.6.2" % "runtime",
  "org.slf4j" % "slf4j-log4j12" % slf4jVersion,
  "com.typesafe" % "config" % "1.3.1",
  "org.rogach" %% "scallop" % "3.0.3",
  "org.influxdb" % "influxdb-java" % "2.9"
)


libraryDependencies ++= sparkDependencies.map(_ % "provided" ) ++ otherDependencies

dependencyOverrides ++= Set("com.squareup.okio" % "okio" % "1.13.0")

使用同一个 jar,我可以运行成功的测试以在非火花作业中实例化 InfluxDb 实例。但是尝试从 Spark 中执行一些操作会引发上述错误。听起来 spark 必须有它自己的 OKIO 版本,当我使用 spark-submit 时,这会在运行时导致这种冲突。...但是当我转储依赖树时,它并没有显示出来。关于如何将我想要的 okio 1.13.0 版本带到 spark 集群运行路径的任何建议?

(当我打字时,我正在考虑尝试着色,我现在将这样做)谢谢

4

4 回答 4

1

在我的例子中“使用 Apache Spark 1.6.3 和 Hadoop HDP 发行版”

  1. spark-shell在 Web UI 上运行并查看使用了什么 jar
  2. 搜索okhttpjar tf /usr/hdp/current/spark-client/lib/spark-assembly-1.6.3.2.6.3.0-235-hadoop2.7.3.2.6.3.0-235.jar | grep okhttp
  3. 提取okhttp版本jar xf /usr/hdp/current/spark-client/lib/spark-assembly-1.6.3.2.6.3.0-235-hadoop2.7.3.2.6.3.0-235.jar META-INF/maven/com.squareup.okhttp/okhttp/pom.xml

=> 版本 2.4.0

不知道谁提供了这个版本。

于 2018-11-26T15:42:14.303 回答
0

我知道这是一个较老的问题,但我只处理了 2 天。我遇到了这个问题,但目前的答案对我没有帮助。我在我的项目中使用 maven,我们构建了一个 uber jar。

为了解决这个问题,我不得不在 shade-plugin 配置中添加一个“重定位”。

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
    <execution>
        <phase>package</phase>
        <goals>
            <goal>shade</goal>
        </goals>
    </execution>
</executions>
<configuration>
    <relocations>
        <relocation>
            <pattern>okio</pattern>
            <shadedPattern>com.shaded.okio</shadedPattern>
        </relocation>
    </relocations>
    <filters>
        <filter>
            <artifact>*:*</artifact>
            <excludes>
                <exclude>META-INF/*.SF</exclude>
                <exclude>META-INF/*.DSA</exclude>
                <exclude>META-INF/*.RSA</exclude>
            </excludes>
        </filter>
    </filters>
</configuration>

根据我的理解 com.squareup.okhttp 移至 com.squareup.okhttp3 ( https://mvnrepository.com/artifact/com.squareup.okhttp/okhttp )

但是,火花库使用旧版本 (okhttp)。这也没有出现在 Maven 依赖树脚本中。由于 spark 集群已经在集群上拥有 spark jars,因此 okio 依赖项以某种方式被旧版本替换,因此无法找到更新的函数。

参考(在此处找到解决方案):https ://community.cloudera.com/t5/Support-Questions/How-to-provide-a-different-dependency-for-RDD-in-spark/td-p/189387

于 2022-01-06T19:00:16.843 回答
0

如果您尝试使用 InfluxDBResultMapper 从 Spark 应用程序中检索 InfluxDB 中的数据,您应该尝试第一个升级版本:

        <dependency>
            <groupId>org.influxdb</groupId>
            <artifactId>influxdb-java</artifactId>
            <version>2.7</version>
        </dependency>

我解决了!

于 2020-02-04T01:38:22.310 回答
0

我在 spark 2.1.0 上遇到了同样的问题。

解决方案:我已将influxdb-java依赖项从 2.11 版本(2.12 有空子依赖项,我们在 fat jar 组装时遇到问题)降级到 2.1。

Influxdb-java 2.1 有一个不同的 API,但它适用于 spark-submit 应用程序。

于 2018-08-20T11:22:57.543 回答