R 连接到 AWS Athena
R Connect to 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"))
Athena JDBC 驱动程序需要您的 AWS 访问密钥 ID 作为 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")
从环境变量中获取这些信息,但这是可选的。
已更新:将凭据提供程序与来自 R
的 Athena 驱动程序一起使用
@Sam 是正确的,凭据提供程序是处理 AWS 凭据的最佳实践。我推荐 DefaultCredentialsProviderChain,它涵盖了从 CLI 配置文件、环境变量等加载凭据的几个选项
- 下载 AWS SDK for Java,特别是来自 (
lib
) 的 SDK jar 和第三方依赖 jar 目录 (third-party/lib
)。
添加一点 R 代码以将所有 jar 文件添加到 rJava 的 classpath
# 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])
}
配置 Athena 驱动程序以按名称加载凭据提供程序 class
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"
)
设置class路径是关键。当执行 dbConnect
时,Athena 驱动程序将尝试从 JAR 加载命名的 class,这将加载所有依赖项。如果 classpath 不包含 SDK JAR,您将看到如下错误:
Error in .jcall(drv@jdrv, "Ljava/sql/Connection;", "connect", as.character(url)[1], :
java.lang.NoClassDefFoundError: Could not initialize class com.amazonaws.auth.DefaultAWSCredentialsProviderChain
如果没有第三方 JAR 引用,您可能会看到如下错误:
Error in .jcall(drv@jdrv, "Ljava/sql/Connection;", "connect", as.character(url)[1], :
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
我正在尝试根据我在网上阅读的内容连接到 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"))
Athena JDBC 驱动程序需要您的 AWS 访问密钥 ID 作为 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")
从环境变量中获取这些信息,但这是可选的。
已更新:将凭据提供程序与来自 R
的 Athena 驱动程序一起使用@Sam 是正确的,凭据提供程序是处理 AWS 凭据的最佳实践。我推荐 DefaultCredentialsProviderChain,它涵盖了从 CLI 配置文件、环境变量等加载凭据的几个选项
- 下载 AWS SDK for Java,特别是来自 (
lib
) 的 SDK jar 和第三方依赖 jar 目录 (third-party/lib
)。 添加一点 R 代码以将所有 jar 文件添加到 rJava 的 classpath
# 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]) }
配置 Athena 驱动程序以按名称加载凭据提供程序 class
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" )
设置class路径是关键。当执行 dbConnect
时,Athena 驱动程序将尝试从 JAR 加载命名的 class,这将加载所有依赖项。如果 classpath 不包含 SDK JAR,您将看到如下错误:
Error in .jcall(drv@jdrv, "Ljava/sql/Connection;", "connect", as.character(url)[1], : java.lang.NoClassDefFoundError: Could not initialize class com.amazonaws.auth.DefaultAWSCredentialsProviderChain
如果没有第三方 JAR 引用,您可能会看到如下错误:
Error in .jcall(drv@jdrv, "Ljava/sql/Connection;", "connect", as.character(url)[1], : java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory