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