【问题标题】:Can't create dplyr src backed by SparkSQL in dplyr.spark.hive package无法在 dplyr.spark.hive 包中创建由 SparkSQL 支持的 dplyr src
【发布时间】:2016-03-19 22:55:48
【问题描述】:

最近我发现了一个很棒的dplyr.spark.hive 包,它可以通过sparkhive 后端启用dplyr 前端操作。

在包的README 中有关于如何安装这个包的信息:

options(repos = c("http://r.piccolboni.info", unlist(options("repos"))))
install.packages("dplyr.spark.hive")

还有很多例子说明当一个已经连接到hiveServer - check this 时如何使用dplyr.spark.hive

但是我无法连接到hiveServer,所以我无法从这个包的强大功能中受益......

我试过这样的命令,但没有成功。有人对我做错了什么有任何解决方案或评论吗?

> library(dplyr.spark.hive, 
+         lib.loc = '/opt/wpusers/mkosinski/R/x86_64-redhat-linux-gnu-library/3.1')
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’
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(SPARK_HOME = "/opt/spark-1.5.0-bin-hadoop2.4")
> Sys.setenv(HIVE_SERVER2_THRIFT_BIND_HOST = 'tools-1.hadoop.srv')
> Sys.setenv(HIVE_SERVER2_THRIFT_PORT = '10000')
> 
> my_db = src_SparkSQL()
Error in .jfindClass(as.character(driverClass)[1]) : class not found
> 
> my_db = src_SparkSQL(host = 'jdbc:hive2://tools-1.hadoop.srv:10000/loghost;auth=noSasl',
+                      port = 10000)
Error in .jfindClass(as.character(driverClass)[1]) : class not found
> 
> my_db = src_SparkSQL(start.server = TRUE)
Error in start.server() : 
  Couldn't start thrift server:org.apache.spark.sql.hive.thriftserver.HiveThriftServer2 running as process 37580.  Stop it first.
In addition: Warning message:
running command 'cd /opt/tech/prj_bdc/pmozie_status/user_topics;/opt/spark-1.5.0-bin-hadoop2.4/sbin/start-thriftserver.sh ' had status 1 
> 
> my_db = src_SparkSQL(start.server = TRUE,
+                      list(spark.num.executors='5', spark.executor.cores='5', master="yarn-client"))
Error in start.server() : 
  Couldn't start thrift server:org.apache.spark.sql.hive.thriftserver.HiveThriftServer2 running as process 37580.  Stop it first.
In addition: Warning message:
running command 'cd /opt/tech/prj_bdc/pmozie_status/user_topics;/opt/spark-1.5.0-bin-hadoop2.4/sbin/start-thriftserver.sh ' had status 1 

编辑 2

我已经设置了更多这样的系统变量路径,但现在我收到一条警告,告诉我没有指定某种 Java 日志记录配置,但我认为是

> library(dplyr.spark.hive, 
+         lib.loc = '/opt/wpusers/mkosinski/R/x86_64-redhat-linux-gnu-library/3.1')
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’ 
3: package ‘SparkR’ was built under R version 3.2.1 
> 
> Sys.setenv(SPARK_HOME = "/opt/spark-1.5.0-bin-hadoop2.4")
> Sys.setenv(HIVE_SERVER2_THRIFT_BIND_HOST = 'tools-1.hadoop.srv')
> Sys.setenv(HIVE_SERVER2_THRIFT_PORT = '10000')
> Sys.setenv(HADOOP_JAR = "/opt/spark-1.5.0-bin-hadoop2.4/lib/spark-assembly-1.5.0-hadoop2.4.0.jar")
> Sys.setenv(HADOOP_HOME="/usr/share/hadoop")
> Sys.setenv(HADOOP_CONF_DIR="/etc/hadoop")
> Sys.setenv(PATH='/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/usr/share/hadoop/bin:/opt/hive/bin')
> 
> 
> my_db = src_SparkSQL()
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.

我的日志属性不为空。

-bash-4.2$ wc /etc/hadoop/log4j.properties 
 179  432 6581 /etc/hadoop/log4j.properties

编辑 3

我对@9​​87654334@ 的确切呼叫是

> detach("package:SparkR", unload=TRUE)
Warning message:
package ‘SparkR’ was built under R version 3.2.1 
> detach("package:dplyr", unload=TRUE)
> library(dplyr.spark.hive, lib.loc = '/opt/wpusers/mkosinski/R/x86_64-redhat-linux-gnu-library/3.1')
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’
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')
> my_db = src_SparkSQL()
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.

然后进程不会停止(从不)。 这些设置适用于具有此类参数的直线:

beeline  -u "jdbc:hive2://tools-1.hadoop.srv:10000/loghost;auth=noSasl" -n mkosinski --outputformat=tsv --incremental=true -f sql_statement.sql > sql_output

但我无法将 user 名称和 dbname 传递给 src_SparkSQL() 所以我尝试手动使用该函数内部的代码,但我收到以下代码也没有完成的问题

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)
class = "Hive"
con.class = paste0(class, "Connection") # class = "Hive"
# dbConnect_retry =
#   function(dr, url, retry){
#     if(retry > 0)
#       tryCatch(
#         dbConnect(drv = dr, url = url),
#         error =
#           function(e) {
#             Sys.sleep(0.1)
#             dbConnect_retry(dr = dr, url = url, retry - 1)})
#     else dbConnect(drv = dr, url = url)}
#################
##con = new(con.class, dbConnect_retry(dr, url, retry = 100))
#################
con = new(con.class, dbConnect(dr, url, user = "mkosinski", dbname = "loghost"))

也许url 也应该包含/loghost - dbname

【问题讨论】:

    标签: r hadoop apache-spark hive dplyr


    【解决方案1】:

    我现在看到您尝试了多个错误的多个操作。让我错误地评论错误。

    my_db = src_SparkSQL() .jfindClass(as.character(driverClass)[1]) 中的错误:找不到类

    无法创建 RJDBC 对象。除非我们解决了这个问题,否则不管有没有变通办法,其他方法都行不通。例如,您是否设置了 HADOOP_JAR, Sys.setenv(HADOOP_JAR = "../spark/assembly/target/scala-2.10/spark-assembly-1.5.0-hadoop2.6.0.jar")。抱歉,我似乎在说明中跳过了这一点。会修复的。

    my_db = src_SparkSQL(host = 'jdbc:hive2://tools-1.hadoop.srv:10000/loghost;auth=noSasl', + 端口 = 10000) .jfindClass(as.character(driverClass)[1]) 中的错误:找不到类

    同样的问题。请注意主机端口参数不接受 URL 语法,只接受主机和端口。 URL 是内部形成的。

    my_db = src_SparkSQL(start.server = TRUE) start.server() 中的错误: 无法启动 thrift server:org.apache.spark.sql.hive.thriftserver.HiveThriftServer2 作为进程 37580 运行。先停止它。 另外:警告信息: 运行命令 'cd /opt/tech/prj_bdc/pmozie_status/user_topics;/opt/spark-1.5.0-bin-hadoop2.4/sbin/start-thriftserver.sh '的状态为 1

    先停止 thriftserver 或连接到现有的,但您仍然需要修复 class not found 问题。

    my_db = src_SparkSQL(start.server = TRUE, + list(spark.num.executors='5', spark.executor.cores='5', master="yarn-client")) start.server() 中的错误: 无法启动 thrift server:org.apache.spark.sql.hive.thriftserver.HiveThriftServer2 作为进程 37580 运行。先停止它。 另外:警告信息: 运行命令 'cd /opt/tech/prj_bdc/pmozie_status/user_topics;/opt/spark-1.5.0-bin-hadoop2.4/sbin/start-thriftserver.sh '的状态为 1

    同上。

    计划:

    • 设置 HADOOP_JAR。查找运行 thriftserver 的主机和端口,如果不是默认值。尝试使用 start.server = FALSE 的 src_SparkSQL。如果高兴退出,则转到第 2 步
    • 停止现有的 thriftserver。使用 start.server = TRUE 重试 src_SparkSQL

    让我知道事情的进展。

    【讨论】:

    • 感谢@piccolbo 的帮助!在我指定了更多全局变量路径后,我仍然遇到问题。请您看一下我的edit2吗?
    • 请删除 EDIT 1。这是你自己的幻想。 SparkR 和 thriftserver 无关。这个包使用后者,与前者正交。启动 thirftserver 的说明位于 spark 站点(谷歌:spark thirftserver)或使用 start.server = TRUE 作为 src_SparkSQL 的参数。同一站点还解释了如何设置主机和端口。如果你使用 env var,这个包会尝试读取它们。默认值为 localhost 和 10000。log4j 警告是无害的,我自己还没有弄清楚。也许我们需要向 Spark 人员报告。
    • 好的,谢谢,看来我还有很长的路要走,但我很高兴能学到新东西。
    • 应该不难,但它是不成熟的软件,需要一些迭代。如果您安装了 spark,最简单的方法是 /sbin/start-thriftserver.sh。除非您设置了某些 var,否则它会以默认值启动(请参阅spark.apache.org/docs/latest/…)。然后在 R 中:mysrc = src_SparkSQL()。这应该是一个开始。
    • dplyr.spark.hive 的自述文件;如果 hiveserver2 已启动并正在运行,那很好,您使用直线测试主机和端口也很棒。你正在做正确的事情。这可能是一个错误。请在此处粘贴确切的 src_SparkSQL 调用。
    【解决方案2】:

    有一个问题是我没有在创建驱动程序的JDBC 函数中指定正确的classPathdplyr.spark.hive 包中classPath 的参数通过HADOOP_JAR 全局变量传递。

    要将JDBC 用作hiveServer2 的驱动程序(通过Thrift 协议),需要至少添加这3 个.jarsJava 类以创建合适的驱动程序

    • hive-jdbc-1.0.0-standalone.jar
    • hadoop/common/lib/commons-configuration-1.6.jar
    • hadoop/common/hadoop-common-2.4.1.jar

    版本随意,应与本地hivehadoophiveServer2的安装版本兼容。

    它们需要使用.Platform$path.sep 进行设置(如here 所述)

    classPath = c("system_path1_to_hive/hive/lib/hive-jdbc-1.0.0-standalone.jar",
                      "system_path1_to_hadoop/hadoop/common/lib/commons-configuration-1.6.jar",
                       "system_path1_to_hadoop/hadoop/common/hadoop-common-2.4.1.jar")
    Sys.setenv(HADOOP_JAR= paste0(classPath, collapse=.Platform$path.sep)
    

    然后当HADOOP_JAR 被设置一个必须小心hiveServer2 url。就我而言,它必须是

    host = 'tools-1.hadoop.srv'
    port = 10000
    url = paste0("jdbc:hive2://", host, ":", port, "/loghost;auth=noSasl")
    

    最后,使用RJDBC 包与hiveServer2 的正确连接是

    Sys.setenv(HADOOP_HOME="/usr/share/hadoop/share/hadoop/common/")
    Sys.setenv(HIVE_HOME = '/opt/hive/lib/')
    host = 'tools-1.hadoop.srv'
    port = 10000
    url = paste0("jdbc:hive2://", host, ":", port, "/loghost;auth=noSasl")
    driverclass = "org.apache.hive.jdbc.HiveDriver"
    library(RJDBC)
    .jinit()
    dr2 = JDBC(driverclass,
               classPath = c("/opt/hive/lib/hive-jdbc-1.0.0-standalone.jar",
                             #"/opt/hive/lib/commons-configuration-1.6.jar",
                             "/usr/share/hadoop/share/hadoop/common/lib/commons-configuration-1.6.jar",
                             "/usr/share/hadoop/share/hadoop/common/hadoop-common-2.4.1.jar"),
               identifier.quote = "`")
    
    url = paste0("jdbc:hive2://", host, ":", port, "/loghost;auth=noSasl")
    dbConnect(dr2, url, username = "mkosinski") -> cont
    

    【讨论】:

      猜你喜欢
      • 2017-06-15
      • 2016-02-29
      • 2016-09-23
      • 1970-01-01
      • 2016-09-04
      • 2016-11-17
      • 2020-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多