如何让独立服务 Zeppelin 看到 Hive?

Posted

技术标签:

【中文标题】如何让独立服务 Zeppelin 看到 Hive?【英文标题】:How do I get independent service Zeppelin to see Hive? 【发布时间】:2018-03-30 08:12:25 【问题描述】:

我使用的是 HDP-2.6.0.3,但我需要 Zeppelin 0.8,所以我将它安装为独立服务。当我跑步时:

%sql 
show tables

当我运行 Spark2 SQL 命令时,我什么也没得到,而且我得到“找不到表”。表可以在作为 HDP 一部分的 0.7 Zeppelin 中看到。

谁能告诉我我错过了什么,让 Zeppelin/Spark 看到 Hive?

我创建zep0.8的步骤如下:

maven clean package -DskipTests -Pspark-2.1 -Phadoop-2.7-Dhadoop.version=2.7.3 -Pyarn -Ppyspark -Psparkr -Pr -Pscala-2.11

将 zeppelin-site.xml 和 shiro.ini 从 /usr/hdp/2.6.0.3-8/zeppelin/conf 复制到 /home/ed/zeppelin/conf。

创建了 /home/ed/zeppelin/conf/zeppeli-env.sh 我在其中放置了以下内容:

export JAVA_HOME=/usr/jdk64/jdk1.8.0_112
export HADOOP_CONF_DIR=/etc/hadoop/conf
export ZEPPELIN_JAVA_OPTS="-Dhdp.version=2.6.0.3-8"

复制 /etc/hive/conf/hive-site.xml 到 /home/ed/zeppelin/conf

编辑: 我也试过:

import org.apache.spark.sql.SparkSession
val spark = SparkSession
          .builder()
          .appName("interfacing spark sql to hive metastore without configuration file")
          .config("hive.metastore.uris", "thrift://s2.royble.co.uk:9083") // replace with your hivemetastore service's thrift url
          .config("url", "jdbc:hive2://s2.royble.co.uk:10000/default")
          .config("UID", "admin")
          .config("PWD", "admin")
          .config("driver", "org.apache.hive.jdbc.HiveDriver")
          .enableHiveSupport() // don't forget to enable hive support
          .getOrCreate()

同样的结果,并且:

import java.sql.DriverManager, Connection, Statement, ResultSet
val url = "jdbc:hive2://"
val driver = "org.apache.hive.jdbc.HiveDriver"
val user = "admin"
val password = "admin"
Class.forName(driver).newInstance
val conn: Connection = DriverManager.getConnection(url, user, password)

给出:

 java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
ERROR XSDB6: Another instance of Derby may have already booted the database /home/ed/metastore_db

修正错误:

val url = "jdbc:hive2://s2.royble.co.uk:10000"

但仍然没有表格:(

【问题讨论】:

【参考方案1】:

这行得通:

import java.sql.DriverManager, Connection, Statement, ResultSet
val url = "jdbc:hive2://s2.royble.co.uk:10000"
val driver = "org.apache.hive.jdbc.HiveDriver"
val user = "admin"
val password = "admin"
Class.forName(driver).newInstance
val conn: Connection = DriverManager.getConnection(url, user, password)
val r: ResultSet = conn.createStatement.executeQuery("SELECT * FROM tweetsorc0")

但是我很难将结果集转换为数据框。我宁愿 SparkSession 工作并且我得到一个数据框,所以我将在今天晚些时候添加一个赏金。

【讨论】:

【参考方案2】:

我在 Cloudera Hadoop 中遇到了类似的问题。就我而言,问题是 spark sql 没有看到我的配置单元元存储。因此,当我将 Spark Session 对象用于 spark SQL 时,我看不到我之前创建的表。我设法通过添加 zeppelin-env.sh 来解决它

export SPARK_HOME=/opt/cloudera/parcels/SPARK2/lib/spark2
export HADOOP_HOME=/opt/cloudera/parcels/CDH
export SPARK_CONF_DIR=/etc/spark/conf
export HADOOP_CONF_DIR=/etc/hadoop/conf

(我假设 Horton Works 的这些路径是另外一回事)。我还在解释器 UI 中将 spark.master 从 local[*] 更改为 yarn-client。最重要的是我在 /etc/spark/conf/ 中手动复制了 hive-site.xml,因为我很奇怪它不在那个目录中并且解决了我的问题。

所以我的建议是查看 Hive-site.xml 是否存在于您的 SPARK_CONF_DIR 中,如果不存在则手动添加。我还为 Horton Works 和 zeppelin 找到了 guide,以防万一这不起作用。

【讨论】:

以上是关于如何让独立服务 Zeppelin 看到 Hive?的主要内容,如果未能解决你的问题,请参考以下文章

在 Zeppelin 中如何使用 Hive

Zeppelin 的 Hive 解释器抛出空指针异常

Zeppelin(0.10.1版本)安装及创建hive解释器

Zeppelin安装配置

Zeppelin0.7.2结合hive解释器进行报表展示

在独立的 zeppelin 中启动 thrift 服务器