Ошибка искры с библиотекой google/guava: java.lang.NoSuchMethodError: com.google.common.cache.CacheBuilder.refreshAfterWrite

avatar
WestCoastProjects
8 апреля 2018 в 01:15
2935
3
2

У меня есть простой проект spark, в котором в pom.xml зависимостями являются только основные scala, scalatest/junit и <6882176574885>:

    <dependency>
        <groupId>net.alchim31.maven</groupId>
        <artifactId>scala-maven-plugin</artifactId>
        <version>3.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-library</artifactId>
        <version>${scala.version}</version>
    </dependency>
    <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-compiler</artifactId>
        <version>${scala.version}</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.scalatest</groupId>
        <artifactId>scalatest_${scala.binary.version}</artifactId>
        <version>3.0.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_${scala.binary.version}</artifactId>
        <version>${spark.version}</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-mllib_${scala.binary.version}</artifactId>
        <version>${spark.version}</version>
        <scope>compile</scope>
    </dependency>
</dependencies>

При попытке запустить базовую spark программу инициализация SparkSession завершается ошибкой в ​​этой строке:

 SparkSession.builder.master(master).appName("sparkApp").getOrCreate

Вот вывод/ошибка:

Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
18/04/07 18:06:15 INFO SparkContext: Running Spark version 2.2.1
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.cache.CacheBuilder
.refreshAfterWrite(JLjava/util/concurrent/TimeUnit;)
Lcom/google/common/cache/CacheBuilder;
    at org.apache.hadoop.security.Groups.<init>(Groups.java:96)
    at org.apache.hadoop.security.Groups.<init>(Groups.java:73)

at org.apache.hadoop.security.Groups.getUserToGroupsMappingService(Groups.java:293)
at org.apache.hadoop.security.UserGroupInformation.initialize(UserGroupInformation.java:283)
at org.apache.hadoop.security.UserGroupInformation.ensureInitialized(UserGroupInformation.java:260)
at org.apache.hadoop.security.UserGroupInformation.loginUserFromSubject(UserGroupInformation.java:789)
at org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:774)
at org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:647)
at org.apache.spark.util.Utils$$anonfun$getCurrentUserName$1.apply(Utils.scala:2424)
at org.apache.spark.util.Utils$$anonfun$getCurrentUserName$1.apply(Utils.scala:2424)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.util.Utils$.getCurrentUserName(Utils.scala:2424)
at org.apache.spark.SparkContext.<init>(SparkContext.scala:295)
at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2516)
at org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:918)
at org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:910)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:910)

Я запускал spark локально много десятков раз в других проектах, что может быть не так с этим простым? Есть ли зависимость от переменной среды $HADOOP_HOME или аналогичной?

Обновление Понизив версию spark до 2.0.1, я смог скомпилировать. Это не не исправляет проблему (нам нужна более новая) версия. Но это помогает указать на источник проблемы

<

765748217> Другое обновление в Проект Проект Hack Downdrade до 2.0.1 Это помогает - то есть выполнение доходы Далее : Но затем при записи >parquet подобное исключение действительно происходит.

8/05/07 11:26:11 ERROR Executor: Exception in task 0.0 in stage 2741.0 (TID 2618)
java.lang.NoSuchMethodError: com.google.common.cache.CacheBuilder.build(Lcom/google/common/cache/CacheLoader;)Lcom/google/common/cache/LoadingCache;
    at org.apache.hadoop.io.compress.CodecPool.createCache(CodecPool.java:62)
    at org.apache.hadoop.io.compress.CodecPool.<clinit>(CodecPool.java:74)
    at org.apache.parquet.hadoop.CodecFactory$BytesCompressor.<init>(CodecFactory.java:92)
    at org.apache.parquet.hadoop.CodecFactory.getCompressor(CodecFactory.java:169)
    at org.apache.parquet.hadoop.ParquetOutputFormat.getRecordWriter(ParquetOutputFormat.java:303)
    at org.apache.parquet.hadoop.ParquetOutputFormat.getRecordWriter(ParquetOutputFormat.java:262)
    at org.apache.spark.sql.execution.datasources.parquet.ParquetOutputWriter.<init>(ParquetFileFormat.scala:562)
    at org.apache.spark.sql.execution.datasources.parquet.ParquetFileFormat$$anon$1.newInstance(ParquetFileFormat.scala:139)
    at org.apache.spark.sql.execution.datasources.BaseWriterContainer.newOutputWriter(WriterContainer.scala:131)
    at org.apache.spark.sql.execution.datasources.DefaultWriterContainer.writeRows(WriterContainer.scala:247)
    at org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelationCommand$$anonfun$run$1$$anonfun$apply$mcV$sp$1.apply(InsertIntoHadoopFsRelationCommand.scala:143)
    at org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelationCommand$$anonfun$run$1$$anonfun$apply$mcV$sp$1.apply(InsertIntoHadoopFsRelationCommand.scala:143)
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:70)
    at org.apache.spark.scheduler.Task.run(Task.scala:86)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:274)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

Источник

Ответы (3)

avatar
Saumya Suhagiya
15 января 2020 в 08:39
0

Добавление подключаемого модуля Shade в файл pom и перемещение пакета Google могут решить эту проблему.

Дополнительную информацию можно найти здесь и здесь

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.1</version>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
        <configuration>
            <relocations>
                <relocation>
                    <pattern>com.google.common</pattern>
                    <shadedPattern>shade.com.google.common</shadedPattern>
                </relocation>
          </relocations>
        </configuration>
      </execution>
    </executions>
  </plugin>

Если и это не поможет, то добавление библиотеки гуавы версии 15.0 работает отлично. Причина этого обхода находится в dependencyManagement. Хороший ответ SO здесь

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>15.0</version>
        </dependency>
    </dependencies>
</dependencyManagement>
avatar
alok
27 июня 2019 в 08:07
0

Я получаю эту ошибку при весенней загрузке: java.lang.TypeNotPresentException: Type com.google.common.cache.CacheBuilderSpec com.google.common.cache.CacheBuilder.build()Lcom/google/common/cache/Cache

Проблема связана с API "com.google.guava:guava". В springboot этот API относится к другому API, может быть API «spring-boot-starter-web» или «springfox-swagger2», поэтому нам нужно сначала исключить API guava из jar springfox-swagger2 и добавить обновленную версию API guava. весна-данные-mongodb

Решение: 1. добавьте зависимость guava поверх всех зависимостей, чтобы springboot мог получить последнюю версию:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>19.0</version>
</dependency>
  1. Узнайте зависимость весенней загрузки, в которую включен артефактId: "guava", затем исключите артефакт "guava" из этой зависимости, а затем добавьте зависимость guava, как указано выше.
WestCoastProjects
27 июня 2019 в 13:38
0

Я не использую spring boot: можете ли вы объяснить, почему вы добавили этот ответ?

avatar
Yayati Sule
15 мая 2018 в 06:11
1

Эта ошибка возникает из-за несоответствия версий между библиотекой Google guava и Spark. Spark затеняет гуаву, но многие библиотеки используют гуаву. Вы можете попробовать Shading the Guava зависимостей согласно этому сообщению. Apache-Spark-User-List

WestCoastProjects
15 мая 2018 в 07:47
0

Я упомянул в посте и показал в pom.xml, что никаких дополнительных зависимостей /outside-of-spark добавлено не было. Этот вопрос касается именно того, что внутри искры/искровой зависимости вызывает это.

Yayati Sule
15 мая 2018 в 08:02
0

Guava поставляется в комплекте со многими зависимостями, поэтому решение Shade it находится в вашем файле pom.xml.

WestCoastProjects
15 мая 2018 в 08:24
0

Ваш комментарий на самом деле не ответил на мой комментарий;)