Ошибка удаленного задания Spark: java .lang.IllegalAccessError: class org. apache .had oop .hdfs.web.HftpFileSystem - PullRequest
0 голосов
/ 13 июля 2020

Проблема

Я пытаюсь запустить удаленное задание Spark через IntelliJ с кластером Spark HDInsight (HDI 4.0). В моем приложении Spark я пытаюсь прочитать входной поток из папки паркетных файлов из хранилища Azure blob с помощью встроенной функции readStream структурированной потоковой передачи Spark.

Код работает должным образом, когда я его запускаю на ноутбуке Zeppelin, подключенном к кластеру HDInsight. Однако, когда я развертываю свое приложение Spark в кластере, я обнаруживаю следующую ошибку:

java.lang.IllegalAccessError: class org.apache.hadoop.hdfs.web.HftpFileSystem cannot access its superinterface org.apache.hadoop.hdfs.web.TokenAspect$TokenManagementDelegator

Впоследствии я не могу прочитать какие-либо данные из хранилища BLOB-объектов.

Небольшая информация, которую я нашел в Интернете, предполагает, что это вызвано конфликтом версий между Spark и Had oop. Приложение запускается с предварительно созданным Spark 2.4 для Had oop 2.7.

Fix

Чтобы исправить это, I s sh в каждом головном и рабочем узлах кластера и вручную понизить уровень зависимостей Had oop до 2.7.3 с 3.1.x, чтобы соответствовать версии в моей локальной папке spark/jars. После этого я могу успешно развернуть свое приложение. Понижение уровня кластера с HDI 4.0 не является вариантом, поскольку это единственный кластер, который может поддерживать Spark 2.4.

Сводка

Подводя итог, может быть проблема в том, что я использую Spark скачать готовый для Had oop 2.7? Есть ли лучший способ исправить этот конфликт вместо того, чтобы вручную понизить версию Had oop на узлах кластера или изменить версию Spark, которую я использую?

1 Ответ

0 голосов
/ 14 июля 2020

После устранения неполадок с некоторыми предыдущими методами, которые я пробовал раньше, я обнаружил следующее исправление:

В моем pom.xml я исключил зависимость hadoop-client, автоматически импортируемую spark-core jar. Эта зависимость была версией 2.6.5, которая конфликтовала с версией Had oop кластера. Вместо этого я импортирую нужную мне версию.

<dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_${scala.version.major}</artifactId>
            <version>${spark.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.hadoop</groupId>
                    <artifactId>hadoop-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
</dependency>

После внесения этого изменения я обнаружил ошибку java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0. Дальнейшие исследования показали, что это произошло из-за проблемы с конфигурацией Had oop на моем локальном компьютере. Согласно совету этой статьи, я изменил версию winutils.exe, которая была у меня под C://winutils/bin, чтобы она была нужной мне, а также добавил соответствующую hadoop.dll. После внесения этих изменений я смог успешно прочитать данные из хранилища BLOB-объектов, как и ожидалось.

TL; DR Проблема заключалась в автоматически импортированной зависимости hadoop-client, которая была исправлена ​​путем ее исключения и добавления нового winutils.exe и hadoop.dll под C://winutils/bin.

Это больше не требовало понижения версии Had oop в кластере HDInsight или изменения моей загруженной версии Spark.

...