PySpark использует роли IAM для доступа к S3

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

В идеале я хотел бы иметь возможность взять на себя роль при локальном запуске в автономном режиме и указать свой 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

Спасибо!

7 голосов | спросил Nick Warabak 23 MaramWed, 23 Mar 2016 00:36:15 +03002016-03-23T00:36:15+03:0012 2016, 00:36:15

5 ответов


0

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

Вам нужно поместить hadoop-aws JAR и aws-java-sdk JAR (и сторонние файлы 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>
ответил chutium 27 Maypm16 2016, 18:36:24
0

IAM Ролевый доступ к файлам в S3 поддерживается Spark, вам просто нужно быть осторожным с вашей конфигурацией. В частности, вам нужно:

  • Совместимые версии aws-java-sdk и hadoop-aws. Это довольно хрупкое , поэтому работают только определенные комбинации.
  • Вы должны использовать S3AFileSystem, а не NativeS3FileSystem

Вот что у меня сработало:

import os

import pyspark
from pyspark import SparkContext
from pyspark.sql import SparkSession

os.environ['PYSPARK_SUBMIT_ARGS'] = '--packages com.amazonaws:aws-java-sdk:1.7.4,org.apache.hadoop:hadoop-aws:2.7.1 pyspark-shell'

sc = SparkContext.getOrCreate()

hadoopConf = sc._jsc.hadoopConfiguration()
hadoopConf.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")

spark = SparkSession(sc)

df = spark.read.csv("s3a://mybucket/spark/iris/",header=True)
df.show()

Это конкретная комбинация aws-java-sdk:1.7.4 и hadoop-aws:2.7.1, который волшебным образом заставил это работать. Существует хорошее руководство по устранению неполадок с доступом к s3a здесь

Особо обратите внимание, что

  

Случайное изменение JAR-файлов hadoop и aws в надежде заставить проблему «уйти» или получить доступ к нужной функции, не приведет к желаемому результату.

     

Совет: вы можете использовать mvnrepository , чтобы определить версию зависимости требования конкретного JAR hadoop-aws, опубликованного ASF.

Вот полезный пост а> содержащий дополнительную информацию.

Вот еще несколько полезной информации о совместимости между библиотеками java

Я пытался заставить это работать в jupyter записная книжка . Обратите внимание, что версия aws-hadoop должна соответствовать установке hadoop в Dockerfile, т.е. здесь .

ответил RobinL 13 +03002018-10-13T11:57:14+03:00312018bEurope/MoscowSat, 13 Oct 2018 11:57:14 +0300 2018, 11:57:14
0

Вы можете попробовать этот подход в локальном чтении файлов S3 через Искра (или лучше: pyspark) .

Однако мне повезло с настройкой переменных среды (AWS_ACCESS_KEY_ID и т. д.) в Bash ... pyspark автоматически подберет их для вашей сессии.

ответил maxymoo 23 MaramWed, 23 Mar 2016 02:51:00 +03002016-03-23T02:51:00+03:0002 2016, 02:51:00
0

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

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

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

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

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

ответил Nick Warabak 24 MaramThu, 24 Mar 2016 00:06:37 +03002016-03-24T00:06:37+03:0012 2016, 00:06:37
0

Соединитель s3a Hadoop 2.8 + поддерживает роли IAM через нового поставщика учетных данных; Это не в выпуске Hadoop 2.7 Чтобы использовать его, вам нужно сменить провайдер учетных данных. fs.s3a.aws.credentials.provider = org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider fs.s3a.access.key = <your access key> fs.s3a.secret.key = <session secret> fs.s3a.session.token = <session token> В Hadoop 2.7 (и включено по умолчанию) есть сбор переменных среды AWS_.

Если вы установите разделы AWS env для входа в сеанс в вашей локальной системе и удаленных , тогда они должны быть подобраны.

Я знаю, это больно, но что касается команды Hadoop, Hadoop 2.7, выпущенный в середине 2016 года, и с тех пор мы многое сделали, вещи, которые мы не собираемся делать бэкпортом

ответил Steve Loughran 16 +03002018-10-16T15:24:43+03:00312018bEurope/MoscowTue, 16 Oct 2018 15:24:43 +0300 2018, 15:24:43

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132