2016-03-22 2 views
2

Мне интересно, поддерживает ли PySpark доступ к S3 с использованием ролей IAM. В частности, у меня есть бизнес-ограничение, где я должен принять роль AWS, чтобы получить доступ к данному ведру. Это нормально при использовании boto (поскольку это часть API), но я не могу найти окончательного ответа относительно того, поддерживает ли PySpark это из коробки.PySpark с использованием ролей IAM для доступа к S3

В идеале, я хотел бы иметь возможность выполнять роль при работе в автономном режиме локально и указывать мой SparkContext на этот путь s3. Я видел, что не-IAM-вызовы обычно следуют:

spark_conf = SparkConf().setMaster('local[*]').setAppName('MyApp') 
sc = SparkContext(conf=spark_conf) 
rdd = sc.textFile('s3://<MY-ID>:<MY-KEY>@some-bucket/some-key') 

Существует ли что-то подобное для предоставления информации IAM? :

rdd = sc.textFile('s3://<MY-ID>:<MY-KEY>:<MY-SESSION>@some-bucket/some-key') 

или

rdd = sc.textFile('s3://<ROLE-ARN>:<ROLE-SESSION-NAME>@some-bucket/some-key') 

Если нет, то каковы наилучшие методы для работы с IAM кредитки? Возможно ли это?

Я использую Python 1.7 и PySpark 1.6.0

Спасибо!

ответ

0

После дополнительных исследований, я убежден, что это еще не подтверждено, как показано here.

Другие предложили использовать более ручной подход (см. this blog post), который предлагает перечислить ключи s3 с помощью boto, а затем распараллелить этот список с помощью Spark для чтения каждого объекта.

Проблема здесь (и я еще не вижу, как они сами обходят ее) заключается в том, что объекты s3, возвращаемые из списка внутри ведра, не могут быть сериализованы/разборчивы (помните: предполагается, что эти объекты чтобы работники читали независимые процессы через карту или плоскую карту). Дальнейшая проблема заключается в том, что сам клиент boto s3 не является сериализуемым (что, на мой взгляд, разумно).

Остается только один вариант воссоздания клиента предполагаемой роли s3 на файл, который не является оптимальным или выполнимым за определенный момент.

Если кто-либо видит недостатки в этом рассуждении или альтернативном решении/подходе, я бы хотел его услышать.

2

Роль IAM для доступа s3 поддерживается только s3a, так как используется AWS SDK.

Вам необходимо поставить hadoop-aws JAR и aws-java-sdk JAR (и сторонние банки в своем пакете) в ваш CLASSPATH.

hadoop-aws ссылка.

aws-java-sdk ссылка.

Затем установите это в core-site.xml:

<property> 
    <name>fs.s3.impl</name> 
    <value>org.apache.hadoop.fs.s3a.S3AFileSystem</value> 
</property> 
<property> 
    <name>fs.s3a.impl</name> 
    <value>org.apache.hadoop.fs.s3a.S3AFileSystem</value> 
</property> 
Смежные вопросы