Чтение из s3 через искру извне AWS с использованием временных учетных данных - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь прочитать файл с s3 с моего ноутбука через IntelliJ, чтобы я мог легче разработать свою искровую работу.

Код RDD textFile работает в Zeppelin в кластере EMR, но не тогда, когдаЯ стараюсь на месте.

В Zeppelin мне не нужно было настраивать контекст зажигания, предположительно потому, что он делает это для меня, поскольку экземпляр Zeppelin находится в среде AWS.

Я написал код длясоздайте временные учетные данные AWS (используя мои пользовательские ключи IAM), чтобы я мог предоставить токен сеанса для контекста spark.Ключ доступа и секретный ключ также получены из временных учетных данных.

val sqlContext = sparkSession.sqlContext

        sqlContext.sparkContext.hadoopConfiguration
          .set("fs.s3a.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem")

        sqlContext.sparkContext.hadoopConfiguration
          .set("fs.s3a.awsAccessKeyId", accessKeyId)
        sqlContext.sparkContext.hadoopConfiguration
          .set("fs.s3a.access.key", accessKeyId)
        sqlContext.sparkContext.hadoopConfiguration
          .set("fs.s3a.awsSecretAccessKey", secretAccessKey)
        sqlContext.sparkContext.hadoopConfiguration
          .set("fs.s3a.secret.key", secretAccessKey)
        sqlContext.sparkContext.hadoopConfiguration
          .set("fs.s3a.session.token", sessionToken)
        sqlContext.sparkContext.hadoopConfiguration.set("fs.s3a.credentialsType", "AssumeRole")
        sqlContext.sparkContext.hadoopConfiguration
          .set(
            "fs.s3a.stsAssumeRole.arn",
            "arn:aws:iam::1234:role/someRoleThatWasUsedInTheWorkingTempCredCode"
          )

        sqlContext.sparkContext.hadoopConfiguration.set(
          "fs.s3a.aws.credentials.provider",
          "org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider"
        )

sqlContext.sparkContext.textFile(
          "s3a://path/to/file/that/definitely/exists/3714bb50a146.gz"
        ).collect()

Я ожидал массив с данными из файла, вместо этого мне было отказано в разрешении.

org.apache.hadoop.security.AccessControlException: Permission denied: s3n://path/to/file/that/definitely/exists/3714bb50a146.gz
    at org.apache.hadoop.fs.s3native.Jets3tNativeFileSystemStore.processException(Jets3tNativeFileSystemStore.java:449)
    at org.apache.hadoop.fs.s3native.Jets3tNativeFileSystemStore.processException(Jets3tNativeFileSystemStore.java:427)

Два вопроса:

1) Возможно ли то, что я делаю (выполняя задание spark, которое читает из s3 локально)?

2) Если то, что я делаю, возможно, настроен ли мой контекст искрыкод действителен?Я чувствую, что пропустил свойство или использовал неправильный ключ свойства.

1 Ответ

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

избавиться от этой строки о fs.s3a.impl. Все, что он делает, это изменяет отображение по умолчанию «s3a» на «современный, поддерживаемый, поддерживаемый разъем S3A» на «старый, устаревший, неподдерживаемый разъем S3N»

вам не нужна эта строка. Тот факт, что люди, пишущие искровые приложения, всегда делают это - просто суеверие. Hadoop-common знает, какой класс файловой системы обрабатывает URL-адреса s3a, так же, как он знает, кто обрабатывает «file» и «hdfs»

...