Это связано с той же основной причиной, описанной в Hadoop 2.9.2, Spark 2.4.0, доступ к AWS s3a bucket
В частности, в Dataproc 1.4 с использованием Spark 2.4, Hadoopтеперь зависимости связаны в /usr/lib/spark/lib
, и в целом эти версии зависимостей могут отличаться от версий классов Hadoop, найденных в /usr/lib/hadoop/lib
или /usr/lib/hadoop-mapreduce/lib
, и т. д. Проблема здесь заключается в том, что некоторые из вспомогательныхтакие зависимости, как коннекторы AWS (и, возможно, коннекторы Azure и т. д.) по умолчанию не включаются в предоставляемый Spark lib dir.
Однако ни один из ответов на этот вопрос не идеален.Загрузка собственной версии jar-файла AWS может быть хлопотной, а также могут возникнуть проблемы с несовместимостью версий.В качестве альтернативы, добавление полного hadoop classpath
к SPARK_DIST_CLASSPATH
загрязняет ваш путь к классу Spark полным дублирующим набором зависимостей Hadoop, что также может вызвать проблемы несовместимости версий (а также устраняет изменение в направлении упаковки собственной копии Spark зависимостей Hadoop).
Вместо этого вы можете использовать действие инициализации Dataproc со следующим:
#!/bin/bash
# Name this something like add-aws-classpath.sh
AWS_SDK_JAR=$(ls /usr/lib/hadoop-mapreduce/aws-java-sdk-bundle-*.jar | head -n 1)
cat << EOF >> /etc/spark/conf/spark-env.sh
SPARK_DIST_CLASSPATH="\${SPARK_DIST_CLASSPATH}:/usr/lib/hadoop-mapreduce/hadoop-aws.jar"
SPARK_DIST_CLASSPATH="\${SPARK_DIST_CLASSPATH}:${AWS_SDK_JAR}"
EOF
Затем использовать его во время создания кластера --initialization-actions=gs://mybucket/add-aws-classpath.sh
.
Затем оно должно работать снова.
Как правило, вы можете различать содержимое /usr/lib/hadoop-mapreduce/lib
от содержимого /usr/lib/spark/lib
;вы должны видеть, что такие вещи, как jar hadoop-mapreduce, присутствуют в Spark в Dataproc 1.4, но не в 1.3.Поэтому, если вы столкнетесь с другими отсутствующими банками, вы можете использовать этот же подход в дополнение к SPARK_DIST_CLASSPATH
.
. Dataproc может решить исправить это по умолчанию в будущих версиях патчей 1.4, но с использованиемДействие init, независимо от того, добавляет ли базовая система эти пути к классам, должно быть безвредным.