Проблема
Я пытаюсь запустить удаленное задание 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, которую я использую?