背景
Hive(蜂巢)是Hadoop的组件,官方介绍为:
Hive™: A data warehouse infrastructure that provides data summarization and ad hoc querying.
Hive有三种部署方式(本质是Hive Metastore的三种部署方式):
Embedded Metastore Database (Derby) 内嵌模式
内嵌模式使用的是内嵌的Derby数据库来存储元数据,也不需要额外起Metastore服务。这个是默认的,配置简单,但是一次只能一个客户端连接(Derby只提供单进程存储),适用于用来实验,不适用于生产环境。
Local Metastore Server 本地元存储
采用外部数据库来存储元数据 。本地元存储不需要单独起metastore服务,用的是跟hive在同一个进程里的metastore服务 。
目前支持:Derby,Mysql,微软SQLServer,Oracle和Postgres
Remote Metastore Server 远程元存储
采用外部数据库来存储元数据 。远程元存储需要单独起metastore服务,然后每个客户端都在配置文件里配置连接到该metastore服务。远程元存储的metastore服务和hive运行在不同的进程里。
远程元存储是生产环境部署方式。
本地部署过程
由于设备资源限制,没有太多机器配置类似生产环境的集群环境。所以通过docker搭建大集群环境。
搭建目标:
- 集群中hadoop集群由3台构成(1台master,2台slaves)
- Hive的元数据库使用Mysql,并且单独包裹在一个docker环境中。
环境准备
准备hadoop集群环境。启docker集群:
1 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
Hive部署
下载安装包:
1 | 进入hadoop-master主机,进入hadoop目录:/use/local/hadoop |
配置Hive环境变量:
1 | vi /etc/profile |
调整Hive的配置文件:
1 | # 进入hive 配置文件目录: |
新建HDFS分布式文件目录:
1 | hadoop已经设置好环境变量,新建下面目录 |
可以用下面命令进行检查:
1 | root@hadoop-master:/usr/local/hadoop/hive/conf# hadoop fs -ls /user/hive |
修改配置文件(hive-site.xml):
hive数据仓库数据路径:/user/hive/warehouse
需要使用hdfs新建文件目录。
1 | <property> |
配置查询日志存放目录:
1 | <property> |
数据库JDBC连接配置(172.18.0.5为mysql的ip地址,暴露3306端口):
1 | <property> |
数据库驱动:
1 | <property> |
数据库用户名:
1 | <property> |
数据库密码:
1 | <property> |
配置Hive临时目录:
1 | mkdir /usr/local/hadoop/hive/tmp |
并在 hive-site.xml
中修改:
把${system:java.io.tmpdir}
改成真实物理绝对路径 /usr/local/hadoop/hive/tmp
把 ${system:user.name}
改成 ${user.name}
可以在外面编辑好配置文件,拷贝进docke:
1
2 > docker cp hive-site.xml 439b359d230e:/usr/local/hadoop/hive/conf/hive-site.xml
>
配置hive-env.sh文件:
尾部加上下面的配置(或者修改注释部分的配置亦可):
1 | HADOOP_HOME=/usr/local/hadoop |
配置Mysql
启mysql容器,容器名:first-mysql,使用和hadoop一个桥接网络hadoop,密码为123456
1 | docker run --name first-mysql --net=hadoop -p 3306:3306 -e MYSQL\_ROOT\_PASSWORD=123456 -d mysql:5.7 |
回显:
1 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
在Hadoop-master中配置mysql客户端(用来访问mysql服务器):
1 | apt-get install mysql-client-core-5.6 |
测试远程连接:
1 | mysql -h172.18.0.5 -P3306 -uroot -p123456 |
新建数据库,数据库名为hive:
1 | mysql> CREATE DATABASE hive; |
初始化(Hive主机上):
1 | cd /usr/local/hadoop/hive/bin |
回显:
1 | root@hadoop-master:/usr/local/hadoop/hive/bin# ./schematool -initSchema -dbType mysql |
下载配置mysql驱动包,放在Hive的lib路径下面:
1 | cd /usr/local/hadoop/hive/lib |
启动Hive
做完上面准备工作后,开始启动hive:
1 | root@hadoop-master:/usr/local/hadoop/hive/bin# ./hive |
最后进入hive的命令界面。
踩坑备注
1、Hive提示SSL连接警告
1 | Tue Aug 14 10:53:12 UTC 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification. |
虽然Hive SQL执行成功,但是报上面的错误。产生的原因是使用JDBC连接MySQL服务器时为设置useSSL
参数 。
解决办法:javax.jdo.option.ConnectionURL 配置的value值进行调整,设置useSSL=false
,注意xml中的语法。
1 | <property> |
重启Hive,不再有警告。
远程部署
对于远程部署需要单独启metastore服务,具体需要调整下面的配置文件(hive-site.xml):
1 | <configuration> |
启动metastore服务:
1 | nohup hive --service metastore & |
当然这属于简单方式将Hive都扎堆部署在一个容器中。可以在集群其他几点启metastore服务,提升架构的高可用性,避免单点问题。
参考文献
1、Apache Hive-2.3.0 快速搭建与使用,https://segmentfault.com/a/1190000011303459
2、Hive提示警告SSL,https://blog.csdn.net/u012922838/article/details/73291524