Fork me on GitHub

Hive介绍及部署

背景

Hive(蜂巢)是Hadoop的组件,官方介绍为:

Hive™: A data warehouse infrastructure that provides data summarization and ad hoc querying.

Hive有三种部署方式(本质是Hive Metastore的三种部署方式):

  1. Embedded Metastore Database (Derby) 内嵌模式

    内嵌模式使用的是内嵌的Derby数据库来存储元数据,也不需要额外起Metastore服务。这个是默认的,配置简单,但是一次只能一个客户端连接(Derby只提供单进程存储),适用于用来实验,不适用于生产环境。

  2. Local Metastore Server 本地元存储

    采用外部数据库来存储元数据 。本地元存储不需要单独起metastore服务,用的是跟hive在同一个进程里的metastore服务 。

    目前支持:Derby,Mysql,微软SQLServer,Oracle和Postgres

  3. Remote Metastore Server 远程元存储

    采用外部数据库来存储元数据 。远程元存储需要单独起metastore服务,然后每个客户端都在配置文件里配置连接到该metastore服务。远程元存储的metastore服务和hive运行在不同的进程里。

    远程元存储是生产环境部署方式。

本地部署过程

由于设备资源限制,没有太多机器配置类似生产环境的集群环境。所以通过docker搭建大集群环境。

搭建目标:

  • 集群中hadoop集群由3台构成(1台master,2台slaves)
  • Hive的元数据库使用Mysql,并且单独包裹在一个docker环境中。

环境准备

准备hadoop集群环境。启docker集群:

1
2
3
4
CONTAINER ID   IMAGE    COMMAND      CREATED    STATUS   PORTS      NAMES
c27312e13270 kiwenlau/hadoop:1.0 "sh -c 'service ssh …" 2 hours ago Up 2 hours hadoop-slave2
f8b69885f3ef kiwenlau/hadoop:1.0 "sh -c 'service ssh …" 2 hours ago Up 2 hours hadoop-slave1
439b359d230e kiwenlau/hadoop:1.0 "sh -c 'service ssh …" 2 hours ago Up 2 hours 0.0.0.0:8088->8088/tcp, 0.0.0.0:50070->50070/tcp hadoop-master

Hive部署

下载安装包:
1
2
3
4
# 进入hadoop-master主机,进入hadoop目录:/use/local/hadoop
wget http://apache.claz.org/hive/hive-2.3.3/apache-hive-2.3.3-bin.tar.gz
tar -zxvf apache-hive-2.3.3-bin.tar.gz
mv apache-hive-2.3.3-bin hive
配置Hive环境变量:
1
2
3
4
5
6
vi /etc/profile
#hive
export HIVE_HOME=/usr/local/hadoop/hive
PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HIVE_HOME/bin:$PATH
# 生效环境变量
source /etc/profile
调整Hive的配置文件:
1
2
3
4
5
# 进入hive 配置文件目录:
cd conf
cp hive-default.xml.template hive-site.xml
# 修改配置文件
vim hive-site.xml
新建HDFS分布式文件目录:
1
2
3
4
5
6
7
8
# hadoop已经设置好环境变量,新建下面目录
hadoop fs -mkdir -p /user/hive/warehouse
hadoop fs -mkdir -p /user/hive/tmp
hadoop fs -mkdir -p /user/hive/log
# 设置目录权限
hadoop fs -chmod -R 777 /user/hive/warehouse
hadoop fs -chmod -R 777 /user/hive/tmp
hadoop fs -chmod -R 777 /user/hive/log

可以用下面命令进行检查:

1
2
3
4
5
root@hadoop-master:/usr/local/hadoop/hive/conf# hadoop fs -ls /user/hive
Found 3 items
drwxrwxrwx - root supergroup 0 2018-08-14 07:34 /user/hive/log
drwxrwxrwx - root supergroup 0 2018-08-14 07:34 /user/hive/tmp
drwxrwxrwx - root supergroup 0 2018-08-14 07:34 /user/hive/warehouse
修改配置文件(hive-site.xml):

hive数据仓库数据路径:/user/hive/warehouse

需要使用hdfs新建文件目录。

1
2
3
4
5
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>

配置查询日志存放目录:

1
2
3
4
5
<property>
<name>hive.querylog.location</name>
<value>/user/hive/log/hadoop</value>
<description>Location of Hive run time structured log file</description>
</property>

数据库JDBC连接配置(172.18.0.5为mysql的ip地址,暴露3306端口):

1
2
3
4
5
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://172.18.0.5:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false</value>
<description>
</property>

数据库驱动:

1
2
3
4
5
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>

数据库用户名:

1
2
3
4
5
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>Username to use against metastore database</description>
</property>

数据库密码:

1
2
3
4
5
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
<description>password to use against metastore database</description>
</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
2
3
HADOOP_HOME=/usr/local/hadoop
export HIVE_CONF_DIR=/usr/local/hadoop/hive/conf
export HIVE_AUX_JARS_PATH=/usr/local/hadoop/hive/lib

配置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
2
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                                              NAMES
84ae224cee53 mysql:5.7 "docker-entrypoint.s…" 32 minutes ago Up 32 minutes 0.0.0.0:3306->3306/tcp first-mysql

在Hadoop-master中配置mysql客户端(用来访问mysql服务器):

1
apt-get install mysql-client-core-5.6

测试远程连接:

1
mysql -h172.18.0.5 -P3306 -uroot -p123456

新建数据库,数据库名为hive:

1
2
mysql> CREATE DATABASE hive;
Query OK, 1 row affected (0.00 sec)

初始化(Hive主机上):

1
2
cd /usr/local/hadoop/hive/bin
./schematool -initSchema -dbType mysql

回显:

1
2
3
4
5
root@hadoop-master:/usr/local/hadoop/hive/bin# ./schematool -initSchema -dbType mysql
SLF4J: Class path contains multiple SLF4J bindings.
。。。(略)
schemaTool completed
# 初始化成功

下载配置mysql驱动包,放在Hive的lib路径下面:

1
2
cd /usr/local/hadoop/hive/lib
wget http://central.maven.org/maven2/mysql/mysql-connector-java/5.1.38/mysql-connector-java-5.1.38.jar

启动Hive

做完上面准备工作后,开始启动hive:

1
2
3
4
5
6
7
8
9
10
root@hadoop-master:/usr/local/hadoop/hive/bin# ./hive
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hadoop/hive/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]

Logging initialized using configuration in jar:file:/usr/local/hadoop/hive/lib/hive-common-2.3.3.jar!/hive-log4j2.properties Async: true
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. tez, spark) or using Hive 1.X releases.
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
2
3
4
5
6
7
8
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://172.18.0.5:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false</value>
<description>
JDBC connect string for a JDBC metastore.
To use SSL to encrypt/authenticate the connection, provide database-specific SSL flag in the connection URL.
For example, jdbc:postgresql://myhost/db?ssl=true for postgres database.
</description>

重启Hive,不再有警告。

远程部署

对于远程部署需要单独启metastore服务,具体需要调整下面的配置文件(hive-site.xml):

1
2
3
4
5
6
<configuration>
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop-master:9083</value>
</property>
</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

本文标题:Hive介绍及部署

文章作者:rong xiang

发布时间:2018年08月14日 - 19:08

最后更新:2022年10月25日 - 23:10

原始链接:https://zjrongxiang.github.io/posts/b5f1194c/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%