Hbase高手之路 – 第七章 – HBase和Hive(类sql)的整合
在实际业务中,由于hbase不支持SQL,因此查询很不方便,效率低。由于hive支持SQL(HQL),可以将hbase和hive进行整合,通过使用hive数据仓库操作hbase中的数据。
一、 远程模式安装
1. hive的下载
2. 上传安装包
3. 解压并改名
4. 解决hadoop、hive之间guava版本差异
cd /export/servers/hive
rm -rf lib/guava-19.0.jar
cp /export/servers/hadoop-3.1.4/share/hadoop/common/lib/guava-27.0-jre.jar ./lib/
5. 添加mysql jdbc驱动到hive安装包lib/文件下
6. 修改配置文件
使环境变量起的作用
source /etc/profile
7. 修改hive环境变量文件 添加Hadoop_HOME
cd /export/servers/hive/conf/
mv hive-env.sh.template hive-env.sh
vi hive-env.sh
export HADOOP_HOME=/export/servers/hadoop-3.1.4
export HIVE_CONF_DIR=/export/servers/hive/conf
export HIVE_AUX_JARS_PATH=/export/servers/hive/lib
8. 新增hive-site.xml 配置mysql等相关信息
vi hive-site.xml
<configuration>
<!-- 存储元数据mysql相关配置 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value> jdbc:mysql://hadoop01:3306/hive?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>Root23!</value>
</property>
<!-- H2S运行绑定host -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>hadoop01</value>
</property>
<!-- 远程模式部署metastore 服务地址 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop01:9083</value>
</property>
<!-- 关闭元数据存储授权 -->
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
<!-- 关闭元数据存储版本的验证 -->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<property>
<name>hive.zookeeper.quorum</name>
<value>hadoop01,hadoop02,hadoop03</value>
</property>
<property>
<name>hive.zookeeper.client.port</name>
<value>2181</value>
</property>
</configuration>
9. 初始化metadata
cd /export/servers/hive
bin/schematool -initSchema -dbType mysql -verbos
#初始化成功会在mysql中创建74张表
10. 导入依赖
将hbase的lib目录下的相关依赖的jar包复制到hvie的lib目录下
注意 注意 注意
这一步会导致guava有两个版本,删除低版本,留下之前解决冲突的版本
11. 前台启动 关闭ctrl+c
/export/servers/hive/bin/hive --service metastore
克隆一个会话重新启动
/export/servers/hive/bin/hive
12. 后台启动 进程挂起 关闭使用jps + kill
#输入命令回车执行 再次回车 进程将挂起后台
nohup /export/servers/hive/bin/hive --service metastore &
日志输出到了如下文件中(在哪启动,日志就输出到哪)
再次启动hive
退出时记得kill掉后台进程
13. 前台启动开启debug日志
/export/servers/hive/bin/hive --service metastore --hiveconf hive.root.logger=DEBUG,console
二、 3.2 将hive安装到hadoop03
1. 将安装包上传
2. 解压改名
3. 解决hadoop、hive之间guava版本差异
cd /export/servers/hive
rm -rf lib/guava-19.0.jar
cp /export/servers/hadoop-3.1.4/share/hadoop/common/lib/guava-27.0-jre.jar ./lib/
4. 修改hive环境变量文件 添加Hadoop_HOME
cd /export/servers/hive/conf
mv hive-env.sh.template hive-env.sh
vi hive-env.sh
export HADOOP_HOME=/export/servers/hadoop-3.1.4
export HIVE_CONF_DIR=/export/servers/hive/conf
export HIVE_AUX_JARS_PATH=/export/servers/hive/lib
5. 新增hive-site.xml 配置mysql等相关信息
vi hive-site.xml
添加以下信息
<configuration>
<!-- 远程模式部署metastore 服务地址 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop01:9083</value>
</property>
</configuration>
6. 启动hive(Hadoop01的 metastore服务必须开启)
测试,发现成功同步
三、 3.3 bin/beeline客户端的使用
1. 在matestore服务的基础上启动hiveserver2
/export/servers/hive/bin/hive --service hiveserver2
注意hiveserver2启动后需要等一会儿才能使用,这一点比较难受
2. 启动beeline
/export/servers/hive/bin/beeline
无日志启动
/export/servers/hive/bin/beeline --hiveconf hive.server2.logging.operation.level=NONE
设置本地运行避免小数据通过mr处理缓慢
set hive.exec.mode.local.auto=true;
! connect jdbc:hive2://hadoop01:10000
测试,成功运行
并且发现beeline客户端还可以打印日志信息
四、 3.4 编写脚本启动hive
以上的⽅式启动、停⽌hive⽐较麻烦,下⾯编写⼀个Hive启动/停⽌脚本hive-
script.sh,⽤于⾃动启停hive。(该脚本仅限启动metastore和hiveserver2服务)
1. 创建脚本
2. 编写脚本
#!/bin/bash
HIVE_LOG_DIR=$HIVE_HOME/logs
if [ ! -d $HIVE_LOG_DIR ]
then
mkdir -p $HIVE_LOG_DIR
fi
#检查进程是否运行正常,参数 1 为进程名,参数 2 为进程端口
function check_process()
{
pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print
$2}')
ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut -d
'/' -f 1)
echo $pid
[[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1
}
function hive_start()
{
metapid=$(check_process HiveMetastore 9083)
cmd="nohup hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1
&"
[ -z "$metapid" ] && eval $cmd || echo "Metastroe 服务已启动"
server2pid=$(check_process HiveServer2 10000)
cmd="nohup hive --service hiveserver2 >$HIVE_LOG_DIR/hiveServer2.log
2>&1 &"
[ -z "$server2pid" ] && eval $cmd || echo "HiveServer2 服务已启动"
}
function hive_stop()
{
metapid=$(check_process HiveMetastore 9083)
[ "$metapid" ] && kill $metapid || echo "Metastore 服务未启动"
server2pid=$(check_process HiveServer2 10000)
[ "$server2pid" ] && kill $server2pid || echo "HiveServer2 服务未启动"
}
case $1 in
"start")
hive_start
;;
"stop")
hive_stop
;;
"restart")
hive_stop
sleep 2
hive_start
;;
"status")
check_process HiveMetastore 9083 >/dev/null && echo "Metastore 服务运行
正常" || echo "Metastore 服务运行异常"
check_process HiveServer2 10000 >/dev/null && echo "HiveServer2 服务运
行正常" || echo "HiveServer2 服务运行异常"
;;
*)
echo Invalid Args!
echo 'Usage: '$(basename $0)' start|stop|restart|status'
;;
esac
3. 为脚本添加运行权限
chmod +x hive-script.sh
4. 测试脚本
⽤脚本启动、停⽌、重启、检测运⾏状态的命令分别为:
hive-script.sh start
hive-script.sh stop
hive-script.sh restart
hive-script.sh status
注意:hive --service hiveserver2启动较慢,启动后在⽤hive-script.sh status检测服务状态时要多等⼀会⼉,否则报服务运⾏异常。
启动脚本并查看状态
启动beeline服务端
关闭服务
五、 新建Hive表跟HBase建立关联
1. 新建数据库
2. 新建表
create table book(
id int,
name string,
price double
)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties("hbase.columns.mapping"=":key,info:name,info:price")
tblproperties("hbase.table.name"="book");