Исключение в потоке “main”: java.lang.UnsatisfiedLinkError: ‘boolean org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(java.lang.String, int)’ i

Вопросы и ответы

Исключение в потоке “main” java.lang.UnsatisfiedLinkError: ‘boolean org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(java.lang.String, int) при попытке выполнить запись в формате parquet с помощью spark scala. Я установил hadoop home в переменных окружения.

<properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <scala.version>2.12.18</scala.version>
        <jackson.version>2.15.2</jackson.version>
    </properties>

    <dependencies>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.12</artifactId>
        <version>3.5.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_2.12</artifactId>
        <version>3.5.0</version>
    </dependency>

        <dependency>
            <groupId>io.delta</groupId>
            <artifactId>delta-spark_2.12</artifactId>
            <version>3.2.0</version>
        </dependency>

        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>${scala.version}</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>${jackson.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.parquet</groupId>
            <artifactId>parquet-hadoop</artifactId>
            <version>1.13.1</version>
        </dependency>

        <!-- Hadoop Client API -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client-api</artifactId>
            <version>3.3.6</version>
        </dependency>

    </dependencies>

Ответ

Ошибка java.lang.UnsatisfiedLinkError: 'boolean org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(java.lang.String, int)' указывает на то, что Java не может найти нативную библиотеку Hadoop, которая необходима для доступа к файловой системе на Windows. Эта проблема часто возникает, когда нативные библиотеки Hadoop не установлены или неправильно настроены в вашей среде. Вот несколько шагов для решения данной проблемы:

1. Убедитесь, что у вас правильно установлены нативные библиотеки Hadoop

Проверьте, что вы используете версию Hadoop, которая поддерживается вашей версией Spark и соответствует вашему окружению (в данном случае Windows). Ваша зависимость в pom.xml указывает на hadoop-client-api версии 3.3.6, убедитесь, что у вас также есть соответствующая версия нативных библиотек, которые находятся в hadoop-common для Windows.

2. Установите пути к нативным библиотекам

Необходимо указать HADOOP_HOME и добавить его в PATH. Это может быть сделано следующим образом:

  • Откройте переменные окружения (Environment Variables) на вашем компьютере.
  • Добавьте новую переменную системы:
    • Имя: HADOOP_HOME
    • Значение: путь к папке, где установлен Hadoop (например, C:\hadoop).
  • В переменной Path добавьте HADOOP_HOME\bin и HADOOP_HOME\lib/native.

3. Проверьте наличие необходимых нативных DLL

Скачайте и установите соответствующую версию Windows нативных библиотек для Hadoop. Эти библиотеки обычно поставляются в формате .zip, который нужно распаковать в каталог C:\hadoop.

После этого убедитесь, что в каталоге C:\hadoop\bin присутствуют следующие файлы:

  • hadoop.dll
  • winutils.exe
  • Другие необходимые .dll файлы.

4. Использование winutils.exe

Этот файл, winutils.exe, необходим для работы Hadoop в Windows. Он должен быть в том же пути, что и hadoop.dll. Иногда при написании данных в Parquet может потребоваться правильное управление правами доступа, которое реализуется через этот утилиту.

5. Перезапустите вашу IDE или терминал

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

6. Тестирование

После выполнения всех шагов попробуйте снова выполнить ваш код на Scala, который записывает данные в формате Parquet. Если проблема сохраняется, проверьте журнал ошибок на наличие новой информации.

7. Обновление зависимостей

Если после всех вышеуказанных шагов ошибка все еще возникает, попробуйте обновить зависимости в вашем pom.xml. Убедитесь, что все используемые вами библиотеки совместимы друг с другом. Например, вы могли бы использовать новые версии Spark, Scala и Hadoop, которые могут содержать исправления ошибок и улучшения.

Вот пример того, как могут выглядеть обновленные зависимости в pom.xml:

<dependencies>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.12</artifactId>
        <version>3.5.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_2.12</artifactId>
        <version>3.5.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>3.3.6</version>
    </dependency>
</dependencies>

Теперь попробуйте снова запустить вашу программу. Обычно, следуя этим шагам, вам удастся решить проблему с UnsatisfiedLinkError в среде Windows.

Оцените материал
Добавить комментарий

Капча загружается...