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

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

我正在尝试连接 R 和 Impala。抛开这些问题不谈(“官方”,我无法在这台 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。

标签: r impala


【解决方案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(在 CRANGitHub 上)为 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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-29
          • 1970-01-01
          • 1970-01-01
          • 2017-01-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多