Не удается создать dplyr src, поддерживаемый SparkSQL, в пакете dplyr.spark.hive

Недавно я узнал о великих dplyr.spark.hive пакет, который позволяет dplyr интерфейсные операции с spark или же hive бэкэнд

В README есть информация о том, как установить этот пакет:

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

и есть также много примеров того, как работать с dplyr.spark.hive когда один уже подключен к hiveServer - проверь это.

Но я не могу подключиться к 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

Мой точный звонок в scr_SparkSQL() является

> 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?

2 ответа

Решение

Возникла проблема, что я не указал правильную classPath что было нужно внутри JDBC функция, которая создала драйвер. Параметры к classPath в dplyr.spark.hive посылка передается через HADOOP_JAR глобальная переменная.

Использовать JDBC как водитель для hiveServer2 (сквозь Thrift протокол) нужно добавить хотя бы те 3 .jars с Java классы для создания правильного драйвера

  • улья-JDBC 1.0.0-standalone.jar
  • Hadoop / общее / Библиотека / Обще-конфигурация-1.6.jar
  • Hadoop / общий / Hadoop-синфазный 2.4.1.jar

версии являются произвольными и должны быть совместимы с установленной локальной версией hive, hadoop а также hiveServer2,

Они должны быть установлены с .Platform$path.sep (как описано здесь)

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")

и, наконец, правильная связь с hiveServer2 с помощью RJDBC пакет

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

Теперь я вижу, что вы пробовали несколько вещей с несколькими ошибками. Позвольте мне прокомментировать ошибку по ошибке.

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', + port = 10000) Ошибка в.jfindClass(as.character(driverClass)[1]): класс не найден

Та же проблема. Обратите внимание, что аргумент порта хоста не принимает синтаксис URL, только хост и порт. URL формируется внутри.

my_db = src_SparkSQL (start.server = TRUE) Ошибка в start.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

Сначала остановите thrift-сервер или подключитесь к существующему, но вам все равно придется исправить проблему с классом not found.

my_db = src_SparkSQL (start.server = TRUE, + список (spark.num.executors='5', spark.executor.cores='5', master="yarn-client")) Ошибка в start.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. Найти хост и порт работающего сервера, если не по умолчанию. Попробуйте src_SparkSQL с start.server = FALSE. Если вы счастливы бросить, остальное перейдите к шагу 2
  • Остановите существующий благотворительный сервер. Попробуйте еще раз src_SparkSQL с start.server = TRUE

Дайте мне знать, как идут дела.

Другие вопросы по тегам