В образе Dataproc версии 1.4-debian9 (превью) отсутствуют баночки AWS S3 (org.apache.hadoop.fs.s3a.S3AFileSystem) - PullRequest
2 голосов
/ 03 апреля 2019

Использование версии изображения 1.3-debian9 показывает, что банки доступны (прилагается скриншот).

При использовании предварительного просмотра версии изображения (1.4-debian9) выдается следующее сообщение об ошибке (прилагается скриншот):

Py4JJavaError: An error occurred while calling o60.load.
: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found

Команда для создания кластера Dataproc:

gcloudataproc clusters create ${CLUSTER_NAME} --bucket ${BUCKET} --zone us-east1-d --master-machine-type n1-standard-4 --master-boot-disk-size 1TB --num-workers 3 --worker-machine-type n1-standard-4 --worker-boot-disk-size 1TB --image-version=preview --scopes 'https://www.googleapis.com/auth/cloud-platform' --project ${PROJECT} --initialization-actions gs://dataproc-initialization-actions/python/pip-install.sh,gs://dataproc-initialization-actions/connectors/connectors.sh --metadata 'gcs-connector-version=1.9.16' --metadata 'bigquery-connector-version=0.13.16' --optional-components=ANACONDA,JUPYTER

Снимки экрана: 1.3-debian9 1.4-debian9

1 Ответ

3 голосов
/ 04 апреля 2019

Это связано с той же основной причиной, описанной в 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, независимо от того, добавляет ли базовая система эти пути к классам, должно быть безвредным.

...