Искра и Прилив: конфликт OKIO

Я выполняю работу на 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 в путь запуска спарк-кластера?

(когда я печатаю, я думаю попробовать затенение, что я буду делать сейчас) Спасибо

4 ответа

В моем случае "использование Apache Spark 1.6.3 с дистрибутивом Hadoop HDP"

  1. я бегу spark-shell и посмотрите в веб-интерфейсе, какие банки используются
  2. Поиск охттп jar 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. Извлечь охтп версию 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

Не знаю, кому предоставляется эта версия.

У меня была такая же проблема на спарке 2.1.0.

Решение: я понизил influxdb-java Зависимость от версии 2.11 (2.12 имеет пустую дочернюю зависимость, и у нас есть проблемы при сборке fat jar) до 2.1.

У Influxdb-java 2.1 другой API, но он работает на приложениях spark-submit.

Если вы попытаетесь использовать InfluxDBResultMapper для получения данных из InfluxDB из приложения Spark, вам следует попробовать первую версию обновления:

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

Я исправил!

Я знаю, что это старый вопрос, но я занимался этим всего 2 дня. Я наткнулся на этот вопрос, но текущие ответы мне не помогли. Я использую maven в своем проекте, и мы создаем банку uber.

Чтобы обойти это, мне пришлось добавить «перемещение» в конфигурацию плагина тени.

      <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)

Однако библиотеки spark используют более старую версию (okhttp). Это также не отображалось в сценарии дерева зависимостей maven. Поскольку у искрового кластера уже есть искровые банки в кластере, зависимость okio каким-то образом была заменена более старой версией, и поэтому более новую функцию найти не удалось.

Ссылка (решение найдено здесь): https://community.cloudera.com/t5/Support-Questions/How-to-provide-a- Different-dependency-for-RDD-in-spark/td-p/189387

Другие вопросы по тегам