【问题标题】:How to pass client_protocol to JDBC driver in R?如何将 client_protocol 传递给 R 中的 JDBC 驱动程序?
【发布时间】:2015-12-31 13:41:54
【问题描述】:

我正在尝试使用dplyr.spark.hive 包连接HiveServer2,但我发生了一个错误,我无法将用户名传递给dbConnect 函数,这可能是我收到错误的原因关于NULLclient_protocol

有谁知道如何解决这个问题或如何将user/username 传递给dbConnect 函数,其中驱动程序是JDBC

这个beeline 请求对我来说很好

beeline  -u "jdbc:hive2://host:port/dbname;auth=noSasl" -n mkosinski --outputformat=tsv --incremental=true -f sql_statement.sql > sql_output

但是这个R 等效不:

> library(dplyr.spark.hive)
Warning: changing locked binding for ‘over’ in ‘dplyr’ whilst loading ‘dplyr.spark.hive’
Warning: changing locked binding for ‘partial_eval’ in ‘dplyr’ whilst loading ‘dplyr.spark.hive’
Warning: changing locked binding for ‘default_op’ in ‘dplyr’ whilst loading ‘dplyr.spark.hive’

Attaching package: ‘dplyr.spark.hive’

The following object is masked from ‘package:SparkR’:

    cache

Warning messages:
1: replacing previous import by ‘purrr::%>%’ when loading ‘dplyr.spark.hive’ 
2: replacing previous import by ‘purrr::order_by’ when loading ‘dplyr.spark.hive’ 
> Sys.setenv(HADOOP_JAR = "/opt/spark-1.5.0-bin-hadoop2.4/lib/spark-assembly-1.5.0-hadoop2.4.0.jar")
> Sys.setenv(HIVE_SERVER2_THRIFT_BIND_HOST = 'tools-1.hadoop.srv')
> Sys.setenv(HIVE_SERVER2_THRIFT_PORT = '10000')
> host = 'tools-1.hadoop.srv'
> port = 10000
> driverclass = "org.apache.hive.jdbc.HiveDriver"
> Sys.setenv(HADOOP_JAR = "/opt/spark-1.5.0-bin-hadoop2.4/lib/spark-assembly-1.5.0-hadoop2.4.0.jar")
> library(RJDBC)
> dr = JDBC(driverclass, Sys.getenv("HADOOP_JAR"))
> #url = paste0("jdbc:hive2://", host, ":", port)
> url = paste0("jdbc:hive2://", host, ":", port,"/loghost;auth=noSasl")
> class = "Hive"
> con.class = paste0(class, "Connection") # class = "Hive"
> con = new(con.class, dbConnect(dr, url, username = "mkosinski", database = "loghost"))
log4j:WARN No appenders could be found for logger (org.apache.hive.jdbc.Utils).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Error in .jcall(drv@jdrv, "Ljava/sql/Connection;", "connect", as.character(url)[1],  : 
  java.sql.SQLException: Could not establish connection to jdbc:hive2://tools-1.hadoop.srv:10000/loghost;auth=noSasl: Required field 'client_protocol' is unset! Struct:TOpenSessionReq(client_protocol:null, configuration:{use:database=loghost})
> con = new(con.class, dbConnect(dr, url, username = "mkosinski"))
Error in .jcall(drv@jdrv, "Ljava/sql/Connection;", "connect", as.character(url)[1],  : 
  java.sql.SQLException: Could not establish connection to jdbc:hive2://tools-1.hadoop.srv:10000/loghost;auth=noSasl: Required field 'client_protocol' is unset! Struct:TOpenSessionReq(client_protocol:null, configuration:{use:database=loghost})

编辑 1

我尝试使用不同的.jar 进行连接(如 cmets 中所建议的那样),看起来之前的问题已解决(我可能使用了错误的.jar)但现在我收到一个错误,告诉我连接不知何故未配置:

> Sys.setenv(HADOOP_HOME="/usr/share/hadoop/share/hadoop/common/")
> Sys.setenv(HIVE_HOME = '/opt/hive/lib/')
> host = 'tools-1.hadoop.srv'
> port = 10000
> driverclass = "org.apache.hive.jdbc.HiveDriver"
> library(RJDBC)
Loading required package: DBI
Loading required package: rJava
> dr = JDBC(driverclass,classPath = c("/opt/hive/lib/hive-jdbc-1.0.0-standalone.jar"))
> dr2 = JDBC(driverclass,classPath = c("/opt/hive/lib/hive-jdbc-1.0.0-standalone.jar",
+                                      "/opt/hive/lib/commons-configuration-1.6.jar"))
> url = paste0("jdbc:hive2://", host, ":", port)
> dbConnect(dr, url, username = "mkosinski", database = "loghost") -> cont
log4j:WARN No appenders could be found for logger (org.apache.hive.jdbc.Utils).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Error in .jcall(drv@jdrv, "Ljava/sql/Connection;", "connect", as.character(url)[1],  : 
  java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration
> dbConnect(dr2, url, username = "mkosinski", database = "loghost") -> cont
Error in .jcall(drv@jdrv, "Ljava/sql/Connection;", "connect", as.character(url)[1],  : 
  java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration
> sessionInfo()
R version 3.1.3 (2015-03-09)
Platform: x86_64-redhat-linux-gnu (64-bit)
Running under: CentOS Linux 7 (Core)

locale:
 [1] LC_CTYPE=en_US.UTF-8          LC_NUMERIC=C                  LC_TIME=en_US.UTF-8           LC_COLLATE=en_US.UTF-8       
 [5] LC_MONETARY=en_US.UTF-8       LC_MESSAGES=en_US.UTF-8       LC_PAPER=en_US.UTF-8          LC_NAME=en_US.UTF-8          
 [9] LC_ADDRESS=en_US.UTF-8        LC_TELEPHONE=en_US.UTF-8      LC_MEASUREMENT=en_US.UTF-8    LC_IDENTIFICATION=en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] RJDBC_0.2-5 rJava_0.9-7 DBI_0.3.1  

loaded via a namespace (and not attached):
[1] tools_3.1.3

【问题讨论】:

  • 我的 2 美分:该错误消息闻起来像 Hadoop / Hive JAR 的客户端配置问题,比其他任何事情都重要(例如,参见 stackoverflow.com/questions/30931599/…)。您连接到哪个版本的 HiveServer2?哪个版本的 JDBC 驱动程序实际上是从 R 作业的 CLASSPATH 中挑选出来的?
  • @SamsonScharfrichter 感谢您让我大开眼界。我会检查所有版本是否兼容 hive-client、hive-jdbc 和 hiveserver2
  • @SamsonScharfrichter 我检查了我的 hive 版本是 1.0.0 并且我的 hive-jdbc.jar 也是版本 1.0.0 - 我不知道如何检查 HiveServer2 的版本。此外,我不知道 R 作业的 CLASSPATH 是什么
  • 好的,我知道classpath 是一个指向 jar 的路径向量,当使用 JDBC 时需要连接到 hiveserver2。也许我应该添加这里列出的 morde 罐子streever.atlassian.net/wiki/pages/…
  • 对于 Hive 1.0,它应该归结为 hive-jdbc-standalone(大的一个 ~ 18 MB)加上,仅对于 Kerberos 集群,hadoop-common / hadoop-auth / commons-configuration 加上可选的,只是为了关闭警告,slf4j-log4j12.jar / log4j.jar

标签: java r jdbc hive r-dbi


【解决方案1】:

问题是错误的.jar 规范(JDBC 中的classPath arg)和错误的hiveServer2 url

解释在这里https://stackoverflow.com/a/34792408/3857701

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 2013-03-28
    • 2012-12-02
    • 1970-01-01
    • 2021-11-17
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多