Исключение в потоке “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.