0

Я установил искру 2.0 на EC2 & Я использую SparkSQL с помощью Scala для извлечения записей из DB2 & Я хочу писать на S3, где я передаю ключи доступа к контексту искры. Следуя за мой код:Не удалось написать Spark SQL DataFrame для S3

val df = sqlContext.read.format("jdbc").options(Map("url" -> , "user" -> usernmae, "password" -> password, "dbtable" -> tablename, "driver" -> "com.ibm.db2.jcc.DB2Driver")).option("query", "SELECT * from tablename limit 10").load() 
df.write.save("s3n://data-analytics/spark-db2/data.csv") 

И бросает следующее исключение:

org.apache.hadoop.fs.s3.S3Exception: org.jets3t.service.S3ServiceException: Service Error Message. -- ResponseCode: 403, ResponseStatus: Forbidden, XML Error Message: <?xml version="1.0" encoding="UTF-8"?><Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>1E77C38FA2DB34DA</RequestId><HostId>V4O9sdlbHwfXNFtoQ+Y1XYiPvIL2nTs2PIye5JBqiskMW60yDhHhnBoCHPDxLnTPFuzyKGh1gvM=</HostId></Error> 
Caused by: org.jets3t.service.S3ServiceException: Service Error Message. 
    at org.jets3t.service.S3Service.putObject(S3Service.java:2358) 
    at org.apache.hadoop.fs.s3native.Jets3tNativeFileSystemStore.storeEmptyFile(Jets3tNativeFileSystemStore.java:162) 

Что точная проблема, возникающая здесь, как я передавая ключи доступа также Sparkcontext ?? Любой другой способ написать S3 ??

+0

Из сообщения Access Denied Это может быть пользователь не имеет достаточных привилегий http://docs.aws.amazon.com/redshift/latest /dg/s3serviceexception-error.html – giaosudau

ответ

0

Когда вы создаете экземпляр EC2 или кластер EMR в AWS, у вас есть возможность во время процесса создания привязать роль IAM к этому экземпляру или кластеру.

По умолчанию экземпляру EC2 не разрешено подключаться к S3. Вам нужно будет сыграть определенную роль и сначала приложить его к экземпляру.

Целью присоединения роли IAM является то, что роли IAM могут быть предоставлены разрешения на использование различных других служб AWS без необходимости установки физических учетных данных в этом экземпляре. Учитывая, что была ошибка с доступом, я предполагаю, что экземпляр не имеет прикрепленной к нему роли IAM с достаточными разрешениями, необходимыми для записи на S3.

Вот как создать новую IAM роль:

  • Перейдите к AWS управления идентификацией и доступом (IAM страницы).
  • нажмите «Роли», создайте новый.
  • Искать S3 в строке поиска, а затем выбрать S3FullAccess (... или что-то похожее на это, я не могу вспомнить это с моей головы)
  • Добавить любые другие услуги, которые вы хотите эту роль иметь тоже.
  • Сохраните его.

Для обычного старого одного экземпляра EC2, нажмите создать новый экземпляр:

  • и на странице шагов создания экземпляра, где вы выбираете VPC, и подсеть, есть selectbox для роли IAM, щелкните это и выберите новую созданную роль.
  • продолжайте и создайте свой экземпляр, как и раньше. Теперь этот экземпляр имеет разрешения на запись в S3. вуаля!

Для кластера ОГО:

  • создать ЭЙ кластер, а затем перейдите на страницу GUI, где вы видите детали вашего нового кластера. Найдите область справа, которая говорит Роль EMR, а затем найдите эту роль в своей области IAM и отредактируйте ее, добавив полные разрешения S3.
  • Сохраните изменения.
1

После того, как вы получите свои ключи, используя сообщение выше, вот как закодировать его в scala/spark2.

spark.sparkContext.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", "[awsAccessKey]") 
spark.sparkContext.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", "[awsSecretAccessKey]") 

df.write 
.mode("overwrite") 
.parquet("s3n://bucket/folder/parquet/myFile") 
0

Вы можете попробовать это

df.write.mode("append").format("csv").save("path/to/s3/bucket"); 
Смежные вопросы