连接 R 和 Impala

Posted

技术标签:

【中文标题】连接 R 和 Impala【英文标题】:Connect R and Impala 【发布时间】:2015-11-05 17:56:21 【问题描述】:

我当然知道可重现的示例和一段代码,但对于这个问题,我必须(否则我不能)晦涩难懂。

我正在尝试。抛开这些问题不谈(“官方”,我无法在这台 PC 上安装软件……但我使用了便携式版本的 R 和 RStudio)

我已经尝试过RImpala 包。

rimpala.connect(IP = myip,
              port = the port where Impala sees,
              principal = maybe this is not clear)

我很确定我的问题的原因是 principal 参数,我不清楚文档。无论如何,我已经尝试了几种文档中所说的应该放置在那里的组合。

无论如何我都会遇到同样的错误:

.jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl, 中的错误: java.lang.IllegalArgumentException:Kerberos 主体应该有 3 个部分:10.60.10.22:8888/impala/@tempuser

我在网上搜索过这个错误,它似乎与一些java的东西有关,但我对该语言的了解为零。

知道我无法访问我的 PC 会很有用,例如,我无法安装任何软件或做只有管理员才能做的事情。

我知道这个问题写得不好,但正如我这次所说的那样,不可能有一个可重复的例子。

更多详情

现在我正在考虑它,我用我在浏览器导航栏中看到的地址填充了IP 参数以连接到 Hue。我猜它是一样的,但也许我在这一点上也做错了,因为我已经说过我很确定错误不是由于那个。

【问题讨论】:

AFAIK Hue 绕过 Kerberos 用户身份验证 -- 即 you 使用 Hue 登录名/密码对 Hue 进行身份验证,然后 Hue 使用自己的 Impala 进行身份验证Kerberos 主体/密钥表。所以你不知道使用什么连接字符串来直接访问 Impala,你不知道对 Impala 使用哪个登录,你不知道使用哪种身份验证机制(密码?Kerberos 票证?) 顺便说一下,R​​Impala 文档非常清楚:“IP”和“端口”必须指向 Impala 服务,在某个地方。而“principal”指的是 Impala 服务的 Kerberos 主体——如果整个 Hadoop 集群是 kerberized(那么你的 PC 上必须有一个 Kerberos 客户端,加上一个用户/密码),则需要它,忽略否则 @SamsonScharfrichter 感谢您的评论。作为 IP 和端口,我使用了连接到 Hue 时在浏览器中看到的那个,比如 10.10.10.20:8888,其中第一部分是 IP,8888 是端口。我仍然不知道这是否正确以及我是否有(以及如何)填写principal 参数。 Hue 的 Cloudera 文档,Impala 查询 UI 部分指出...“您可以从 Settings 查看当前配置 选项卡”。你应该看看那个标签。 如果您的 Impala 安装时使用默认值,则 Impala 的端口为 21050。但是,您需要确定安装 Impala 的 IP。 【参考方案1】:

不使用 RImpala 包,使用 RJDBC 连接怎么样。 您可以从 cloudera 网站下载最新的 impala JDBC 驱动 jar 文件: http://www.cloudera.com/downloads/connectors/impala/jdbc/2-5-5.html

然后将jar中的这些文件导入R并使用它们进行连接。

install.packages("rJava")

install.packages("DBI")

install.packages("RJDBC")

library(DBI)

library(rJava)

library(RJDBC)

cp <- c(        
           "C:/Users/Cloudera_ImpalaJDBC4_2.5.31/commons-codec-1.3.jar",
           "C:/Users/Cloudera_ImpalaJDBC4_2.5.31/commons-logging-1.1.1.jar",
           "C:/Users/Cloudera_ImpalaJDBC4_2.5.31/hive_metastore.jar",
           "C:/Users/Cloudera_ImpalaJDBC4_2.5.31/hive_service.jar",
           "C:/Users/Cloudera_ImpalaJDBC4_2.5.31/httpclient-4.1.3.jar",
           "C:/Users/Cloudera_ImpalaJDBC4_2.5.31/httpcore-4.1.3.jar",
           "C:/Users/Cloudera_ImpalaJDBC4_2.5.31/libfb303-0.9.0.jar",
           "C:/Users/Cloudera_ImpalaJDBC4_2.5.31/libthrift-0.9.0.jar",
           "C:/Users/Cloudera_ImpalaJDBC4_2.5.31/log4j-1.2.14.jar",
           "C:/Users/Cloudera_ImpalaJDBC4_2.5.31/ql.jar",
           "C:/Users/Cloudera_ImpalaJDBC4_2.5.31/slf4j-api-1.5.11.jar",
           "C:/Users/Cloudera_ImpalaJDBC4_2.5.31/slf4j-log4j12-1.5.11.jar",
           "C:/Users/Cloudera_ImpalaJDBC4_2.5.31/TCLIServiceClient.jar",
           "C:/Users/Cloudera_ImpalaJDBC4_2.5.31/zookeeper-3.4.6.jar"
)

.jinit(classpath<-cp)

drv <- JDBC("com.cloudera.impala.jdbc4.Driver", "C:/Users/Cloudera_ImpalaJDBC4_2.5.31/ImpalaJDBC4.jar")

con <- dbConnect(drv, "jdbc:impala://your_impala_host_address:21050;AuthMech= your authmech number if applicable", "username", "pwd")

data <- dbGetQuery(con, "SELECT * FROM mydb limit 25")

summary(data)

【讨论】:

你知道打开连接后如何关闭吗?谢谢 @HenryNavarro dbDisconnect(con) 将关闭与 Impala 的连接【参考方案2】:

R 包 implyr(在 CRAN 和 GitHub 上)为 Impala 提供了一个 dplyr 后端,使用 ODBC 或 JDBC 驱动程序进行连接。有关说明,请参阅README。

【讨论】:

【参考方案3】:

我已经成功使用 R 中的 ODBC 连接器和 odbc 包。这种方法似乎没有任何 Java 依赖项,并且是 implyr 包的作者推荐的。根据我有限的经验,这个连接器在将 R 数据类型正确匹配到 Impala 数据类型方面做得更好,导致 R 中的对象大小更小。

对于 Mac,该过程类似于,

安装Cloudera ODBC connector 安装unixodbc:brew install unixodbc

关注Cloudera ODBC connector installation guide

echo export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/opt/cloudera/impalaodbc/lib/universal &gt;&gt; ~/.bash_profile

创建一个~/.odbcinst.ini 文件

[ODBC Drivers] 
Cloudera ODBC Driver for Impala=Installed
[Cloudera ODBC Driver for Impala]
Driver=/opt/cloudera/impalaodbc/lib/universal/libclouderaimpalaodbc.dylib
Description=Cloudera ODBC Driver for Impala

(可选)创建一个包含您的连接详细信息的~/.odbc.ini 文件。在这里,我使用的是 Kerberos:

[impala]
Driver = Cloudera ODBC Driver for Impala
Database = 
Host =
Port =
KrbHostFQDN =
KrbServiceName =
KrbRealm =
AuthMech = 1
source ~/.bash_profile 以确保 DYLD_LIBRARY_PATH 已更新 在 R 中,确保已安装 DBIodbcinstall.packages(c("DBI", "odbc"))

最后,要在 R 中建立连接,

library(DBI)
library(odbc)
conn <- dbConnect(odbc::odbc(),
               driver = "Cloudera ODBC Driver for Impala",
               #database = "",
               host = "",
               port = ,
               KrbHostFQDN = "",
               KrbServiceName = "",
               KrbRealm = "",
               AuthMech=1)

然后,要检索一些东西,

dd <- dbGetQuery(conn, "select * from my_awesome_db.my_awesome_table limit 10;")

【讨论】:

【参考方案4】:

只是想以另一种方式访问​​类路径而不是编写所有 jar:

drv <- JDBC(driverClass = "com.cloudera.impala.jdbc3.Driver", 
        classPath = list.files("C:/Users/Impala",
                               pattern="jar$",full.names=T),
        identifier.quote="'")

【讨论】:

【参考方案5】:

使用 RODBC 包。 我成功地在生产中使用它。 在这里,我为它写了一个教程。 从这个Blog

    下载 ClouderaImpalaODBC32.msi 并安装它。 打开它并在参数字段中输入您需要的信息,这里有一些screenshots 可以帮助您更快地完成。 在 R 环境中,安装和库 RODBC 包。 类型,
library(RODBC)
impala <- odbcConnect("Impala")
sqlQuery(impala,"select * from xxx")

顺便说一句,如果你的环境是Win 10下,在odbcConnect函数中,你必须提供你的用户名和密码(来自我同事的报告)。

希望您成功使用 R. 的 impala。

【讨论】:

以上是关于连接 R 和 Impala的主要内容,如果未能解决你的问题,请参考以下文章

连接 R 和 Excel

使用 RJDBC 连接 R 和 Netezza

tableau 和 R 的连接

连接 R 和 Julia?

实战kudu集成impala

连接 R 和 Impala