hive on spark使用thriftserver代替hiveserver2实现sql引擎变更

这样配置目的

  • 实现DataGrip,DBeaver等工具连接hive,编写sql语句,同时不用hive默认的mr来执行sql,而是用spark。
  • 这种方法可以不必重新编译hive来适配spark3.x版本。

前提

  • 已配置好hive,可以启动hive --service metastore 和 hive --serivce hiveserver2。
  • 已配置好hadoop,hive和hadoop都正常运行。

配置步骤

第一步下载需要的spark版本

  1. 我选择的是spark当前最新版本spark3.5.0,带hadoop的scala2.13(scala版本应该没有关系,按之后开发使用的版本来就好)

  2. 下载spark3.5.0的tgz包:Downloads | Apache Spark

第二步上传spark包,配置环境变量

  1. 上传到Linux相关目录并解压,我这里就和hive,hadoop放一起了在/opt/目录下

2. 配置spark环境变量,SPARK_HOME,和bin,sbin目录(spark的sbin目录下文件和hadoop的sbin目录下文件有冲突,在第四步更改权限,spark只保留需要的)。

添加这些到环境变量的配置文件中

bash 复制代码
export SPARK_HOME=/opt/spark-3.5.0-bin-hadoop3-scala2.13
export PATH=$HIVE_HOME/bin:$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH

我的环境变量在这个文件中 ~/.bashrc,请根据自己集群的配置更改。

bash 复制代码
# User specific aliases and functions
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.382.b05-1.el7_9.x86_64/jre
export ZOOKEEPER_HOME=/opt/apache-zookeeper-3.8.2-bin
export HADOOP_HOME=/opt/hadoop-3.3.6
export PATH=$ZOOKEEPER_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export HIVE_HOME=/opt/apache-hive-3.1.3-bin
export SPARK_HOME=/opt/spark-3.5.0-bin-hadoop3-scala2.13
#export SPARK_HOME=/opt/spark-3.5.0-without-hadoop
export PATH=$HIVE_HOME/bin:$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH
export FLUME_HOME=/opt/apache-flume-1.11.0-bin
export PATH=$FLUME_HOME/bin:$PATH

第三步检查hive配置和spark配置(spark基本不用配置)

  1. 我的hive配置如下:
  • hive-site.xml:
    • 重点说明:
      • hive.metastore.event.db.notification.api.auth 为false
      • hive.metastore.uris 就是metastore配置给spark连接的thrift://111centos7:9083
xml 复制代码
<configuration>
<property>
    <name>hive.metastore.event.db.notification.api.auth</name>
    <value>false</value>
</property>  
<!-- 数据库相关配置 -->
<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://111centos7:3306/hive?createDatabaseIfNotExist=true&amp;characterEncoding=UTF-8</value>
</property>
<property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.cj.jdbc.Driver</value>
</property>
<property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
</property>
<property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>123456</value>
</property>
<!-- 自动创建表 -->
<property>
    <name>datanucleus.schema.autoCreateAll</name>
    <value>true</value>
</property>
<!-- 强制 MetaStore 的 schema 一致性,开启的话会校验在 MetaStore 中存储的信息的版本和 Hive 的 jar 包中的版
     本一致性,并且关闭自动 schema 迁移,用户必须手动的升级 Hive 并且迁移 schema。关闭的话只会在版本不一致时给出警
告,默认是 false 不开启 -->
<!-- 元数据校验 -->
<property>
    <name>hive.metastore.schema.verification</name>
    <!-- MySQL8 这里一定要设置为 true,不然后面 DROP TABLE 可能会出现卡住的情况 -->
    <value>true</value>
</property>
<!-- 美化打印数据 -->
<!-- 是否显示表名与列名,默认值为 false -->
<property>
    <name>hive.cli.print.header</name>
    <value>true</value>
</property>
<!-- 是否显示数据库名,默认值为 false -->
<property>
    <name>hive.cli.print.current.db</name>
    <value>true</value>
</property>
<property>
	<name>hive.server2.thrift.bind.host</name>
	<value>111centos7</value>
</property>
<property>
	<name>hive.server2.thrift.port</name>
	<value>10000</value>
</property>
<!-- HiveServer2 的 WEBUI -->
<property>
    <name>hive.server2.webui.host</name>
    <value>111centos7</value>
</property>
<property>
    <name>hive.server2.webui.port</name>
    <value>10002</value>
</property>
<!-- 数据存储位置(HDFS 中的位置) -->
<property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/hive/warehouse</value>
</property>
<!-- 指定 hive.metastore.uris 的 port,为了启动 MetaStore 服务的时候不用指定端口 -->
<property>
    <name>hive.metastore.uris</name>
    <value>thrift://111centos7:9083</value>
</property>
</configuration>
shell 复制代码
HADOOP_HOME=/opt/hadoop-3.3.6
export HIVE_CONF_DIR=/opt/apache-hive-3.1.3-bin/conf
export HIVE_AUX_JARS_PATH=/opt/apache-hive-3.1.3-bin/lib
  1. 我的spark配置如下:
  • /opt/spark-3.5.0-bin-hadoop3-scala2.13/conf/spark-defaults.conf:
shell 复制代码
spark.debug.maxToStringFields=100
  • /opt/spark-3.5.0-bin-hadoop3-scala2.13/conf/spark-env.sh:
shell 复制代码
HADOOP_CONF_DIR=/opt/hadoop-3.3.6/etc/hadoop
YARN_CONF_DIR=/opt/hadoop-3.3.6/etc/hadoop

第四步,更改spark sbin目录下文件权限,保留需要执行的文件的执行权限。

  1. 更改权限:
bash 复制代码
cd /opt/spark-3.5.0-bin-hadoop3-scala2.13/sbin && chmod u-x *.sh 取消所有文件执行权限
##给需要的文件执行权限。
chmod u+x *thriftserver.sh
chmod u+x spark-daemon.sh

第五步 启动服务

  1. 启动hive metastore服务
bash 复制代码
hive --service metastore &
  1. 启动spark thriftserver服务
bash 复制代码
start-thriftserver.sh
  1. 测试连接
bash 复制代码
./bin/beeline
bash 复制代码
beeline> !connect jdbc:hive2://localhost:10000

第六步 在dataGrip中连接spark(这里有坑哦)

  1. 新建数据源,选择数据源是apache spark:

2. 填写基本信息:

  • 因为hive没有配置密码,用户为root。这里用户需要填root密码不填。
  1. 选择架构,发现无法显示数据库和表结构。(内省有问题),测试连接已经成功。

  2. 解决架构无法显示的问题。选择高级-专家选项-使用JDBC元数据内省 打勾。

  3. 回来查看架构,可以正常显示了。

完成。

  • 可以在dataGrip写sql了,sql会传给spark来执行。这种配置似乎没有用到yarn,待后期研究,怎么添加使用yarn。
  • 这样的设置,sql的执行是在spark所在服务器单机执行,但是还是比hive的mr快不少。

其他错误解决办法:

解析错误:Caused by: java.lang.ClassNotFoundException: org.apache.hive.hcatalog.data.JsonSerDe

  1. 拷贝 jar 包到spark jars目录。
bash 复制代码
cd /opt/apache-hive-3.1.3-bin/hcatalog/share/hcatalog
cp hive-hcatalog-core-3.1.3.jar /opt/spark-3.5.0-bin-hadoop3-scala2.13/jars/
相关推荐
zhixingheyi_tian4 小时前
Spark 之 Aggregate
大数据·分布式·spark
PersistJiao4 小时前
Spark 分布式计算中网络传输和序列化的关系(一)
大数据·网络·spark
宅小海7 小时前
scala String
大数据·开发语言·scala
小白的白是白痴的白7 小时前
11.17 Scala练习:梦想清单管理
大数据
java1234_小锋7 小时前
Elasticsearch是如何实现Master选举的?
大数据·elasticsearch·搜索引擎
Java 第一深情11 小时前
零基础入门Flink,掌握基本使用方法
大数据·flink·实时计算
MXsoft61811 小时前
华为服务器(iBMC)硬件监控指标解读
大数据·运维·数据库
PersistJiao12 小时前
Spark 分布式计算中网络传输和序列化的关系(二)
大数据·网络·spark·序列化·分布式计算
九河云12 小时前
如何对AWS进行节省
大数据·云计算·aws
FreeIPCC13 小时前
谈一下开源生态对 AI人工智能大模型的促进作用
大数据·人工智能·机器人·开源