R Подключиться к AWS Athena

Я пытаюсь подключиться к AWS Athena на основании прочитанного в Интернете, но у меня возникают проблемы.

Шаги по шагам

  • Обновить Java
  • замените user / pass на accesskey / secretKey
  • передать accesskey / secretKey также и user / pass

Любые идеи?

Сообщение об ошибке:

Ошибка в .jcall (drv @ jdrv, «Ljava / sql / Connection;», «connect», as.character (url) [1],: java.sql.SQLException: должен быть предоставлен AWS accessId / secretKey или поставщик учетных данных AWS

Системная информация

  sysname                           release                                       version 
  "Linux"                           "4.4.0-62-generic"      "#83-Ubuntu SMP Wed Jan 18 14:10:15 UTC 2017" 
  nodename                          machine                                        login
 "ip-***-**-**-***"                 "x86_64"                                      "unknown" 
  user                              effective_user 
 "rstudio"                          "rstudio"

Код https://www.r-bloggers.com/interacting-with-amazon-athena-from-r/

library(RJDBC)

URL <- 'https://s3.amazonaws.com/athena-downloads/drivers/AthenaJDBC41-1.0.0.jar'
fil <- basename(URL)
if (!file.exists(fil)) download.file(URL, fil)

drv <- JDBC(driverClass="com.amazonaws.athena.jdbc.AthenaDriver", fil, identifier.quote="'")

con <- jdbcConnection <- dbConnect(drv, 'jdbc:awsathena://athena.us-east-1.amazonaws.com:443/',
                                   s3_staging_dir="s3://mybucket",
                                   user=Sys.getenv("myuser"),
                                   password=Sys.getenv("mypassword"))

person user2600629    schedule 01.03.2017    source источник


Ответы (1)


Драйвер Athena JDBC ожидает, что ваш идентификатор ключа доступа AWS будет иметь значение user, а секретный ключ - значение password:

accessKeyId <- "your access key id..."
secretKey <- "your secret key..."

jdbcConnection <- dbConnect(
  drv, 
  'jdbc:awsathena://athena.us-east-1.amazonaws.com:443',
  s3_staging_dir="s3://mybucket",
  user=accessKeyId,
  password=secretKey
)

Статья R-bloggers получает их из переменных среды с помощью Sys.getenv("ATHENA_USER") и Sys.getenv("ATHENA_PASSWORD"), но это необязательно.


Обновлено: использование поставщика учетных данных с драйвером Athena от R

@Sam правильно, что поставщик учетных данных является лучшей практикой для обработки учетных данных AWS. Я рекомендую DefaultCredentialsProviderChain, он охватывает несколько вариантов загрузки учетных данных из профилей CLI, переменных среды и т. д.

  1. Загрузите AWS SDK для Java, в частности jar SDK из (lib) и каталог сторонних jar-файлов зависимостей (third-party/lib).
  2. Добавьте немного кода R, чтобы добавить все файлы jar в путь к классам rJava

    # Load JAR Files
    library("rJava")
    
    .jinit()
    
    # Load AWS SDK jar
    .jaddClassPath("/path/to/aws-java-sdk-1.11.98/lib/aws-java-sdk-1.11.98.jar")
    
    # Add Third-Party JARs
    jarFilePaths <- dir("/path/to/aws-java-sdk-1.11.98/third-party/lib/", full.names=TRUE, pattern=".jar")
    for(i in 1:length(jarFilePaths)) {
        .jaddClassPath(jarFilePaths[i])
    }
    
  3. Настройте драйвер Athena для загрузки класса поставщика учетных данных по имени

    athenaConn <- dbConnect(
      athenaDriver, 
      'jdbc:awsathena://athena.us-east-1.amazonaws.com:443',
      s3_staging_dir="s3://mybucket",
      aws_credentials_provider_class="com.amazonaws.auth.DefaultAWSCredentialsProviderChain"
      )
    

Настройка пути к классам является ключевым моментом. Когда выполняется dbConnect, драйвер Athena попытается загрузить названный класс из JAR, и это загрузит все зависимости. Если путь к классам не включает SDK JAR, вы увидите такие ошибки, как:

Ошибка в .jcall (drv @ jdrv, "Ljava / sql / Connection;", "connect", as.character (url) [1],: java.lang.NoClassDefFoundError: не удалось инициализировать класс com.amazonaws.auth.DefaultAWSCredentialsProviderChain

А без сторонних ссылок на JAR вы можете увидеть такие ошибки:

Ошибка в .jcall (drv @ jdrv, «Ljava / sql / Connection;», «connect», as.character (url) [1],: java.lang.NoClassDefFoundError: org / apache / commons / logging / LogFactory

person James    schedule 01.03.2017
comment
Спасибо, новичок в AWS, чесал в затылке. - person user2600629; 02.03.2017
comment
Лучше использовать профиль или роли экземпляра IAM вместо жесткого кодирования учетных данных AWS в коде. Раньше вы могли использовать роли, если бы вы запускали экземпляр только с ролями IAM, но теперь AWS представила функцию, позволяющую прикреплять роли даже к ЗАПУЩЕННЫМ экземплярам, ​​но сейчас вы должны делать это через AWS CLI. удачи - person Sam; 02.03.2017
comment
@Sam, я согласен с тем, что использование поставщика учетных данных является наилучшей практикой, если таковая имеется. Я обновил ответ, чтобы проиллюстрировать альтернативу. Это было не так просто сделать в R, как мне хотелось бы. - person James; 02.03.2017
comment
Я не могу заставить это работать. Где вы определяете athenaDriver? - person seapen; 04.03.2020
comment
@seapen, переменная athenaDriver совпадает с drv из последнего абзаца исходного текста в исходном вопросе. Это результат вызова JDBC(driverClass="com.amazonaws.athena.jdbc.AthenaDriver", ... - person James; 06.03.2020