Чтение данных S3 из датапрока Google

Я запускаю приложение pyspark через dataproc Google в созданном мной кластере. На одном этапе приложению требуется доступ к каталогу в каталоге Amazon S3. На этом этапе я получаю ошибку:

Идентификатор ключа доступа AWS и секретный ключ доступа необходимо указать в качестве имени пользователя или пароля (соответственно) URL-адреса s3 или путем установки свойств fs.s3.awsAccessKeyId или fs.s3.awsSecretAccessKey (соответственно).

Я вошел в головной узел кластера и установил /etc/boto.cfg с моей информацией AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY, но это не решило проблему доступа.

(1) Есть ли другие предложения о том, как получить доступ к AWS S3 из кластера dataproc?

(2) Кроме того, какое имя пользователя использует dataproc для доступа к кластеру? Если бы я знал это, я мог бы установить для этого пользователя каталог ~ / .aws в кластере.

Спасибо.


person Eka    schedule 07.09.2016    source источник
comment
Вы отказываетесь от работы, чтобы использовать что-то вроде awscli, или вы получаете доступ к S3 через обычные интерфейсы Spark / Hadoop FileSystem?   -  person Dennis Huo    schedule 07.09.2016
comment
доступ к s3 через обычные искровые интерфейсы. Я в основном хочу установить AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY, а затем сделать sc.textFile (s3_path) и получить счет   -  person Eka    schedule 08.09.2016


Ответы (2)


Поскольку вы используете интерфейсы Hadoop / Spark (например, sc.textFile), все должно действительно выполняться с помощью клавиш fs.s3.*, fs.s3n.* или fs.s3a.*, а не пытаться подключиться через какие-либо параметры ~/.aws или /etc/boto.cfg. Есть несколько способов передать эти настройки в кластер Dataproc:

Во время создания кластера:

gcloud dataproc clusters create --properties \
    core:fs.s3.awsAccessKeyId=<s3AccessKey>,core:fs.s3.awsSecretAccessKey=<s3SecretKey> \
    --num-workers ...

Префикс core здесь означает, что вы хотите, чтобы настройки были помещены в файл core-site.xml, как описано в Документация по свойствам кластера.

В качестве альтернативы, во время отправки задания, если вы используете API-интерфейсы Dataproc:

gcloud dataproc jobs submit pyspark --cluster <your-cluster> \
    --properties spark.hadoop.fs.s3.awsAccessKeyId=<s3AccessKey>,spark.hadoop.fs.s3.awsSecretAccessKey=<s3SecretKey> \
    ...

В этом случае мы передаем свойства как свойства Spark, а Spark предоставляет удобный механизм для определения свойств conf "hadoop" как подмножества Spark conf, просто используя префикс spark.hadoop.*. Если вы отправляете в командной строке через SSH, это эквивалентно:

spark-submit --conf spark.hadoop.fs.s3.awsAccessKeyId=<s3AccessKey> \
    --conf spark.hadoop.fs.s3.awsSecretAccessKey=<s3SecretKey>

Наконец, если вы хотите настроить его во время создания кластера, но предпочитаете не указывать ключи доступа явно в метаданных Dataproc, вы можете использовать действие инициализации. В пути должен присутствовать удобный инструмент под названием bdconfig, с помощью которого вы можете легко изменить настройки XML:

#!/bin/bash
# Create this shell script, name it something like init-aws.sh
bdconfig set_property \
    --configuration_file /etc/hadoop/conf/core-site.xml \
    --name 'fs.s3.awsAccessKeyId' \
    --value '<s3AccessKey>' \
    --clobber
bdconfig set_property \
    --configuration_file /etc/hadoop/conf/core-site.xml \
    --name 'fs.s3.awsSecretAccessKey' \
    --value '<s3SecretKey>' \
    --clobber

Загрузите это куда-нибудь в корзину GCS и используйте во время создания кластера:

gsutil cp init-aws.sh gs://<your-bucket>/init-aws.sh
gcloud dataproc clustres create --initialization-actions \
    gs://<your-bucket>/init-aws.sh

Хотя метаданные Dataproc действительно зашифрованы в состоянии покоя и надежно защищены, как и любые другие пользовательские данные, использование действия init вместо этого помогает предотвратить непреднамеренное отображение вашего ключа / секрета доступа, например, для кого-то, кто стоит за вашим экраном при просмотре свойств вашего кластера Dataproc.

person Dennis Huo    schedule 07.09.2016

Вы можете попробовать установить конфигурацию AWS при инициализации sparkContext.

conf = < your SparkConf()>
sc = SparkContext(conf=conf)
sc.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", <s3AccessKey>)
sc.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", <s3SecretKey>)
person Abhi    schedule 07.09.2016
comment
Я получаю сообщение об ошибке: AttributeError: объект SparkContext не имеет атрибута hadoopConfiguration. Это искровая работа без хадупов. Есть ли способ установить эту конфигурацию без хадупа? - person Eka; 08.09.2016