Hive架构及搭建方式
[TOC]
前言
本文档基于hive 3.1.2编写
hive的基础知识
基本架构
- 整个hive由hiveserver2和hive 客户端组成
- hive客户端有三种,beeline 、使用jdbc链接hiveserver、或使用hive CLI(这个已经过时,hive官方已经不推荐,推荐beeline)
- hive server本身由hive server2和metastore组成
- metastore是hive的元数据管理组件
- hcatalog 架设在metastore上,暴露一组api,使得其它框架,比如Pig,FLink能够使用hive的元数据管理功能,从而以表视角去管理数据
- webchat 是在hcatalog基础上暴露restful接口
- hive 的实际数据存储在hadoop的hdfs中
- hue提供一个图形化的方式,方便用户做基于sql的开发,当然还有其他附加功能
metastore
hive的数据本质上存储在hdfs中的。如何以表的视角看到数据,这就是metastore的功劳,它存储了表的schema信息、序列化信息、存储位置信息等
metastore本身由两部分组成
- metastore server
- metatore db
这个经典的架构,像任何一个单体java应用一样,server是应用本身,db来存储数据。但具体metastore整体的部署模式上,有三种
内嵌服务和数据库
metastore server和metastore DB同hive server部署在一起,以内嵌的方式部署 其中metastore DB是启动了一个内嵌的Derby数据库
内嵌服务
metastore server还是跟hive一起部署。 但metastore DB使用独立的Mysql来承接
服务和数据库单独部署
除了数据库独立部署之外,metastore service本身也独立部署
hcatalog
hcatalog 架设在metastore上,暴露一组api,使得其它框架,比如Pig,FLink能够使用hive的元数据管理功能,从而以表视角去管理数据
demo
hadoop distcp file:///file.dat hdfs://data/rawevents/20100819/data
hcat "alter table rawevents add partition (ds='20100819') location 'hdfs://data/rawevents/20100819/data'"
上述命令先将文件拷贝到hdfs,然后通过hcatalog,将这份数据做为表rawevents的一个新分区
客户端
客户端的本地模式
上述介绍的metastore的嵌入或remote部署,都是以hiveserver的视角来说的。hiveserver本身是独立的部署。但在hive客户端来说,可以通过remote模式,连接到已经部署好的remote server 。 还可以启动客户端的时候,顺带起一个本地的hive server和其对应的metastore。这一点一定要搞清楚
beeline
做为hive推荐的新一代客户端。他使用Thrift 远程调用。 beeline的本地模式
$HIVE_HOME/bin/hiveserver2 #先独立部署hiveserver
$HIVE_HOME/bin/beeline -u jdbc:hive2://$HS2_HOST:$HS2_PORT # 然后以host加port的形式跟hiveserver链接
beeline的本地模式
$HIVE_HOME/bin/beeline -u jdbc:hive2:// #就是不加host和port,该操作会在同一个进程启动hiveserver 和metastore,以及beeline 。 不建议这样使用,只做单元测试
本地和远程的区别,就是是否指定远程的Host和port。没有的话,就是本地模式
beeline的自动模式
每次通过beeline连接远端的hiveserver时,需要指定很长一段的jdbc url,很麻烦,如果我们想敲击beeline命令,直接就连接远端的hiveserver2,则可以在hive的配置文件目录添加beeline-site.xml
配置文件,文件内容大致如下
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>beeline.hs2.jdbc.url.tcpUrl</name>
<value>jdbc:hive2://localhost:10000/default;user=hive;password=hive</value>
</property>
<property>
<name>beeline.hs2.jdbc.url.httpUrl</name>
<value>jdbc:hive2://localhost:10000/default;user=hive;password=hive;transportMode=http;httpPath&