Добро пожаловать в ад oop зависимостей!
1. Используйте пакеты вместо jars
Ваша конфигурация в основном правильная, но когда вы добавляете gcs-соединитель в качестве локального jar, вам также необходимо вручную убедиться, что все его зависимости доступны в пути к классам JVM.
Обычно проще добавить соединитель в виде пакета и позволить spark справиться с зависимостями, поэтому вместо config("spark.jars", "/usr/local/.sdkman/candidates/spark/2.4.4/jars/gcs-connector-hadoop2-2.1.1.jar")
используйте config('spark.jars.packages', 'com.google.cloud.bigdataoss:gcs-connector:hadoop2-2.1.1')
2. Управление проблемами разрешения зависимостей ivy2
Когда вы делаете, как указано выше, spark, скорее всего, будет жаловаться, что не может загрузить некоторые зависимости из-за различий в разрешении между maven (используется для публикации) и ivy2 (используется spark для разрешение зависимостей).
Обычно это можно исправить, просто попросив spark игнорировать неразрешенные зависимости, используя spark.jars.excludes
, поэтому добавьте новую строку конфигурации, например config('spark.jars.excludes','androidx.annotation:annotation,org.slf4j:slf4j-api')
3. Управление конфликтами путей к классам
Когда это будет сделано, SparkSession запустится, но файловая система все равно не будет работать, потому что стандартное распределение pyspark упаковывает старую версию библиотеки guava, которая не реализует API gcs- Разъем зависит от.
Необходимо убедиться, что gcs-connector сначала найдет ожидаемую версию, используя следующие конфигурации config('spark.driver.userClassPathFirst','true')
и config('spark.executor.userClassPathFirst','true')
4. Управление конфликтами зависимостей
Теперь вы можете думать, что все в порядке, но на самом деле нет, потому что дистрибутив pyspark по умолчанию содержит версию 2.7.3 с библиотеками oop, но версия 2.1.1 gcs-connector использует версию 2.8 + только API.
Теперь вы можете:
- использовать пользовательскую сборку spark с более новым oop (или пакет без встроенного oop библиотеки)
- использовать старую версию gcs-разъема (версия 1.9.17 работает нормально)
5. Наконец-то работающий конфиг
Предполагая, что вы хотите использовать последний дистрибутив pyspark PyPi или Anaconda, следующий конфиг должен работать как положено.
Я включил только gcs соответствующие конфиги, перенесли конфигурацию Had oop непосредственно в конфигурацию spark и предположили, что вы правильно настраиваете GOOGLE_APPLICATION_CREDENTIALS:
from pyspark.sql import SparkSession
spark = SparkSession.builder.\
master("local[*]").\
appName("TestApp").\
config('spark.jars.packages',
'com.google.cloud.bigdataoss:gcs-connector:hadoop2-1.9.17').\
config('spark.jars.excludes',
'javax.jms:jms,com.sun.jdmk:jmxtools,com.sun.jmx:jmxri').\
config('spark.driver.userClassPathFirst','true').\
config('spark.executor.userClassPathFirst','true').\
config('spark.hadoop.fs.gs.impl',
'com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem').\
config('spark.hadoop.fs.gs.auth.service.account.enable', 'false').\
getOrCreate()
Обратите внимание, что версия 1.9.17 gcs-соединителя имеет другой набор исключений, чем 2.1 .1 потому что почему бы и нет ...
PS: Вы также должны убедиться, что вы используете Java 1.8 JVM, потому что Spark 2.4 не работает на более новых JVM.