将R和Impala连接

3
当然,我知道可重复的示例和代码片段,但对于这个问题,我必须是(我不能不)模糊的。
我正在尝试连接R和Impala。暂且抛开问题(“官方上”,我不能在这台电脑上安装软件... 但我已经使用了R和RStudio的便携式版本)。
我已经尝试过RImpala包。
rimpala.connect(IP = myip,
              port = the port where Impala sees,
              principal = maybe this is not clear)

我非常确定我的问题的原因是“principal”参数,文档对我来说不太清晰。无论如何,我已经尝试了几种组合,按照文档说应该放在那里。
无论如何,我得到了相同的错误:
“RJavaTools”中的错误。.jcall(“java / lang / Object;”,“invokeMethod”,cl,:java.lang.IllegalArgumentException:Kerberos principal should have 3 parts: 10.60.10.22:8888/impala/@tempuser 我在网上搜索了这个错误,似乎与一些Java有关,但我对这种语言一无所知。
了解我没有访问我的PC,也就是说,我不能安装任何软件或者做管理员才能做的事情。
我知道这个问题写得不好,但正如我所说,这次不可能有一个可重现的例子。
更多细节
现在我想起来了,我在连接到Hue时使用了浏览器导航栏中看到的地址来填写IP参数。我猜它是一样的,但也许我在这一点上做错了,不过正如我所说,我相当确定错误不是由此引起的。

据我所知,Hue绕过了Kerberos用户认证,也就是说,使用Hue的登录名和密码对Hue进行身份验证,然后Hue使用自己的Kerberos主体/密钥对Impala进行身份验证。因此,你不知道直接访问Impala时要使用什么连接字符串,也不知道要使用哪个登录名对Impala进行身份验证,以及要使用哪种身份验证机制(密码?Kerberos票证?)。 - Samson Scharfrichter
顺便说一下,RImpala文档非常清楚: "IP"和"port"必须指向Impala服务的某个地方。而"principal"是指Impala服务的Kerberos主体 - 如果整个Hadoop集群启用了Kerberos(那么您的PC上必须有一个Kerberos客户端,以及一个用户名/密码),否则可以忽略。 - Samson Scharfrichter
@SamsonScharfrichter谢谢你的评论。作为IP和端口,我使用了在连接到Hue时在浏览器中看到的那个,比如10.10.10.20:8888,其中第一部分是IP,8888是端口。我仍然不知道这是否正确,以及我是否需要(以及如何)填写principal参数。 - SabDeM
1
Cloudera文档中关于Hue的部分,Impala查询界面,指出... "您可以从**设置**选项卡中查看当前配置"。您应该查看一下该选项卡。 - Samson Scharfrichter
如果您的Impala是使用默认值安装的,那么Impala的端口是21050。然而,您需要找出Impala安装的IP地址。 - USchneider
5个回答

6

不使用RImpala包,可以考虑使用RJDBC进行连接。您可以从Cloudera网站下载最新的Impala JDBC驱动程序jar文件:http://www.cloudera.com/downloads/connectors/impala/jdbc/2-5-5.html

然后将这些文件导入到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)

你知道如何在打开连接后关闭它吗?谢谢。 - Henry Navarro
@HenryNavarro dbDisconnect(con)会关闭与Impala的连接。 - mockash

5
我在使用ODBC连接器和R中的odbc包时取得了成功。这种方法似乎没有任何Java依赖项,并且是implyr包的作者推荐的。根据我的有限经验,这个连接器更好地将R数据类型与Impala数据类型正确匹配,从而在R内部产生更小的对象大小。
对于Mac电脑,该过程大致如下:
  • Install the Cloudera ODBC connector
  • Install unixodbc: brew install unixodbc
  • Follow the Cloudera ODBC connector installation guide

    • echo export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/opt/cloudera/impalaodbc/lib/universal >> ~/.bash_profile
    • create a ~/.odbcinst.ini file with

      [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
      
    • optionally, create a ~/.odbc.ini file with your connection details. Here, I'm using Kerberos:

      [impala]
      Driver = Cloudera ODBC Driver for Impala
      Database = 
      Host =
      Port =
      KrbHostFQDN =
      KrbServiceName =
      KrbRealm =
      AuthMech = 1
      
    • source ~/.bash_profile to ensure that DYLD_LIBRARY_PATH is updated
  • in R, ensure you have DBI and odbc installed: install.packages(c("DBI", "odbc"))
  • Finally, to make a connection in R,

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

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

5

R软件包implyr(位于CRANGitHub)提供了一个dplyr后端,用于连接Impala数据库,可通过ODBC或JDBC驱动程序连接。请参阅README获取使用说明。


1

只是想提供另一种访问类路径的方法,而不是编写所有的jar包:

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

1

使用RODBC包。 我已经在生产中成功使用它。 在这里,我为它写了一篇教程。 从这里博客开始。

  1. 下载ClouderaImpalaODBC32.msi并安装它。
  2. 打开它,并在参数字段中输入所需的信息,这里有一些屏幕截图可以帮助您更快地完成。
  3. 在R环境中,安装并加载RODBC包。
  4. 键入以下内容:
library(RODBC)
impala <- odbcConnect("Impala")
sqlQuery(impala,"select * from xxx")

顺便提一下,如果你的环境是Win 10,在odbcConnect函数中,你需要提供用户名和密码(根据我的同事报告)。
我希望你能成功地使用R连接Impala。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接