一、Centos7下搭建hive集群
注意:hive集群的搭建与hadoop版本有密切关系 ( 本篇博客的 hadoop版本为 2.7.1,所以hive要用 hive 2.3.6 , 而 hadoop 2.5.2 配 hive1.2.2 , 其它的版本可自测)
1. 首先看一下我的环境拓扑图
2. 简单了解hive多用户模式原理
3. 开始搭建hive集群
(1) 确保 node1上的 mysql安装成功,且可以远程登录,并设置好密码
(2) 在node2中安装与配置 hive CLI 客户端
(3)下载hive的安装包,并上传hive安装包到node2中 /usr/local目录下
官网下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/hive/
hive2.3.6下载地址(提取码:sbty):https://pan.baidu.com/s/1NJAgWqEIbNY1exSH_meF9g
(4) 解压hive压缩包并重命名
解压命令:tar -xvf apache-hive-2.3.6-bin.tar.gz
重命名命令:mv apache-hive-2.3.6-bin/ hive236
(5) 配置环境变量
编辑环境变量: vi /etc/profile
export HIVE_HOME=
export PATH=$PATH:$HIVE_HOME/bin
刷新环境变量:source /etc/profile
(6) 到hive中conf目录中创建 hive-site.xml文件
进入命令: cd /usr/local/hive236/conf
编辑命令: vi hive-site.xml
注意:mysql8以上版本驱动应改为com.mysql.cj.jdbc.Driver
metadata即元数据:元数据包含用Hive创建的database、tabel等的元信息,元数据存储在关系型数据库中。如Derby、MySQL等。
Metastore服务:客户端连接metastore服务,metastore再去连接MySQL数据库来存取元数据。有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接metastore 服务即可。
修改自己的mysql的节点ip与端口,账号密码,以及metastore服务节点位置端口。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node1:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>mysql账号</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>密码</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://node3:9083</value>
</property>
</configuration>
4. 知识点补充 :Metastore有三种配置方式
(1) Embedded Metastore Database (Derby) 内嵌模式
内嵌模式使用的是内嵌的Derby数据库来存储元数据,也不需要额外起Metastore服务。这个是默认的,配置简单,但是一次只能一个客户端连接,适用于用来实验,不适用于生产环境。配置项如下:
(2) Local Metastore Server 本地元存储
本地元存储和远程元存储都采用外部数据库来存储元数据,目前支持的数据库有:MySQL、Postgres、Oracle、MS SQL Server.在这里我们使用MySQL。
本地元存储不需要单独起metastore服务,用的是跟hive在同一个进程里的metastore服务。配置项如下:
(3) Remote Metastore Server 远程元存储
远程元存储需要单独起metastore服务,然后每个客户端都在配置文件里配置连接到该metastore服务。远程元存储的metastore服务和hive运行在不同的进程里。配置项如下:
5. 将 node2 上的 hive236目录同步到 node3, node4节点上
同步命令:scp -r hive236/ root@node3:/usr/local/
同步命令:scp -r hive236/ root@node4:/usr/local/
6. 将node4与node2 都配置成hive客户端(由于node4的hive是从node2同步过来的,所以无需更改,只要配置一下环境变量即可)
(1)在node3,node4节点上配置环境变量
编辑环境变量命令:vi /etc/profile
在环境变量中加入
export HIVE_HOME=
export PATH=$PATH:$HIVE_HOME/bin
刷新环境变量命令:source /etc/profile
7. 如果要在 node3 上创建 metastore server,则按以下配置( 为了提高更多的可访问性,可以在其它节点上也配置 metastore server服务 )
记得配置node3的环境变量
到node3节点中hive的conf目录下创建 hive-site.xml文件
进入命令: cd /usr/local/hive236/conf
编辑命令: vi hive-site.xml
注意:mysql8以上版本驱动应改为com.mysql.cj.jdbc.Driver
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 在hdfs上文件的位置 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<!-- 元数据的位置 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node1:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>mysql账号</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>密码</value>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<property>
<name>datanucleus.schema.autoCreateAll</name>
<value>true</value>
</property>
</configuration>
将mysql驱动包上传到node3的hive236的lib目录下, 由metastore server访问数据库
注意mysql版本,我的是5.5.47,所以jar包也对应是5点几的版本,可到本地maven仓库中找到对应jar包
上传后,启动node3服务端,命令:hive --service metastore &
之后执行初始化库命令: schematool -dbType mysql -initSchema
8. 测试hive服务
(1) 查看mysql中数据库是否创建出来了
连接mysql命令:mysql -uroot -pa
查看database命令:show databases;
(2) 在node2或node4客户端测试,命令:
hive
如果遇到这个错误(未遇到可跳过): java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected
解决方法:将hive下的新版本jline的JAR包拷贝到hadoop下
命令:cp /usr/local/hive122/lib/jline-2.12.jar /usr/local/hadoop252/share/hadoop/yarn/lib/
再将原来 hadoop271/share/hadoop/yarn/lib/jline-0.9.94.jar 改名
命令:mv jline-0.9.94.jar jline-0.9.94.jar.bak
(3) 在node2或者node4中测试与验证 hive
在hive中使用sql进行操作
命令:create database yc74;
使用yc74这个database:use yc74;
在hdfs中创建目录:create table produce_hive( id int, name varchar(20) );
查看表格:show tables;
插入数据:insert into produce_hive values(1, 'apple');
查看数据:select * from produce_hive;
补充知识点:在进行以上操作时,请注意以下几点(补充部分,可选)
1.哪些操作生成了mapreduce操作
(1) insert操作生成了mapreduce
(2) 其它操作只对mysql操作了元数据
(3) 观察: http://node3:8088
2.观察 hdfs中的目录变化情况,并打开生成的文件的内容
3.到mysql中查看hive对应的库及表
命令:select * from DBS;
命令:select * from TBLS;
命令:select * from COLUMNS_V2;
二、将metastore server配置成自启动服务
1. 在node3的 /etc/rc.d/init.d目录下,创建一个 metastoreServer 脚本
进入目录命令:
cd /etc/rc.d/init.d
编辑脚本命令:vi metastoreServer.sh
#!/bin/sh
#chkconfig: 345 90 90
#description: hive metastore
#processname: hive_metastore_server
source /etc/profile
# 启动服务的时间
DATE_STR=`/bin/date "+%Y%m%d%H%M%S"`
# 日志文件名称(包含路径)
HIVE_METASTORE_LOG=${HIVE_HOME}/logs/hiveserver2-${DATE_STR}.log
/usr/bin/nohup ${HIVE_HOME}/bin/hive --service metastore >>${HIVE_METASTORE_LOG} 2>&1 &
2. 改变权限,加入执行权限
加入权限命令:chmod +x /etc/rc.d/init.d/metastoreServer.sh
3. 加入到chkconfig启动服务
加入命令:chkconfig --add metastoreServer.sh
查看命令:chkconfig --list
4. 启动服务,命令:service metastoreServer start