Hive 安装及配置参数
# 下载
从 Hive 官网提供的下载地址 (opens new window)下载相应的安装包,此文档选择版本为1.2.2
,进入hive-1.2.2
文件夹,点击apache-hive-1.2.2-bin.tar.gz
下载。
# 安装
- 将下载好的安装包上传到 Linux 服务器的
/opt/software
目录,并执行下面的命令解压到/opt/module
目录:
tar -zxvf /opt/software/apache-hive-1.2.2-bin.tar.gz -C /opt/module
- 进入到
/opt/module
目录,修改解压后的目录名为hive
,方便后续操作
cd /opt/module
mv apache-hive-1.2.2-bin/ hive
2
- 将
/opt/module/hive/conf
目录下的hive-env.sh.template
重命名为hive-env.sh
mv hive-env.sh.template hive-env.sh
- 修改
hive-env.sh
文件
# 配置 HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-2.7.2
# 配置 HIVE_CONF_DIR 路径
export HIVE_CONF_DIR=/opt/module/hive/conf
2
3
4
5
- 在 Hadoop 安装目录启动 HDFS 和 Yarn
sbin/start-dfs.sh
sbin/start-yarn.sh
2
3
至此,Hive 已经安装完成,可以在 /opt/module/hive
路径下执行bin/hive
启动并使用:
# 查看数据库
show databases;
# 查看默认库中的表
show tables;
# 退出
quit;
2
3
4
5
6
7
8
# Metastore
在 Hive 的具体使用中,首先面临的问题便是如何定义表结构信息,跟结构化的数据映射成功。所谓的映射指的是一种对应关系。在 Hive 中需要描述清楚表跟文件之间的映射关系、列和字段之间的关系等等信息。这些描述映射关系的数据的称之为 Hive 的元数据。该数据十分重要,因为只有通过查询它才可以确定用户编写 sql 和最终操作文件之间的关系。
Metadata 即元数据。元数据包含用 Hive 创建的 database、table、表的字段等元信息。元数据存储在关系型数据库中。如 Hive 内置的 Derby、第三方如 MySQL 等。
Metastore 服务即元数据服务,是 Hive 用来管理库表元数据的一个服务。有了它上层的服务不用再跟裸的文件数据打交道,而是可以基于结构化的库表信息构建计算框架。通过 metastore 服务将 Hive 的元数据暴露出去,而不是需要通过对 Hive 元数据库 MySQL 的访问才能拿到 Hive 的元数据信息,Metastore 服务实际上就是一种 Thrift 服 务,通过它用户可以获取到 Hive 元数据,并且通过 thrift 获取元数据的方式,屏蔽了数据库访问需要驱动,url,用户名,密码等细节。
Metastore 有三种配置方式,分别是内嵌模式、本地模式、远程模式。
# 内嵌模式
内嵌模式(Embedded Metastore)是 Metastore 默认部署模式。此种模式下,元数据存储在内置的 Derby 数据库,并且 Derby 数据库和 metastore 服务都嵌入在主 HiveServer 进程中,当启动 HiveServer 进程时,Derby 和 Metastore 都会启动。不需要额外起 Metastore 服务。但是一次只能支持一个活动用户,适用于测试体验,不适用于生产环境。
# 本地模式
本地模式(Local Metastore)下,Hive Metastore 服务与主 HiveServer 进程在同一进程中运行,但是存储元数据的数据库在单独的进程中运行,并且可以在单独的主机上。Metastore 服务将通过 JDBC 与 Metastore 数据库进行通信。 本地模式采用外部数据库来存储元数据,推荐使用 MySQL。Hive 根据 hive.metastore.uris 参数值来判断,如果为空,则为本地模式。缺点是每启动一次 Hive 服务,都内置启动了一个 Metastore 服务。
# 远程模式
远程模式(Remote Metastore)下,Metastore 服务在其自己的单独 JVM 上运行,而不在 HiveServer 的 JVM 中运行。如果其他进程希望与 Metastore 服务器通信,则可以使用 Thrift Network API 进行通信。在生产环境中,建议用远程模式来配置 Hive Metastore。在这种情况下,其他依赖 Hive 的软件都可以通过 Metastore 访问 Hive。由于还可以完全屏蔽数据库层,因此这也带来了更好的可管理性/安全性。远程模式下,需要配置 hive.metastore.uris 参数来指定 Metastore 服务运行的机器 ip 和端口,并且需要单独手动启动 Metastore 服务。
# 配置 MySQL 存储元数据
说明
接下来配置 MySQL 用以存储 Hive 的元数据,关于 MySQL 的安装这里不做记录。假设已经安装完成,且 host 为 bigdata01,用户名为 root,密码为 root。
- 使用 mysql 数据库
use mysql;
- 为 root 用户授权
grant all privileges on *.* to 'root'@'%' identified by 'hadoop' with grant option;
flush privieges;
2
3
- 建议将 MySQL 设置为开机启动
systemctl enable mysqld
- 将
mysql-connector-java-5.1.27.jar
拷贝到/opt/module/hive/lib
jar 包可以在 Maven 仓库 (opens new window)下载
- 在
/opt/module/hive/conf
创建hive-site.xml
文件
touch hive-site.xml
- 在
hive-site.html
文件中加入以下内容
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://bigdata01:3306/metastore?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
<description>password to use against metastore database</description>
</property>
</configuration>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
至此,配置完成,重启 Hive 之后可以通过多个客户端进行访问 Hive。可能有朋友会有疑问,为什么没有配置分布式集群呢?像 Hadoop、Spark、Kafka 等其它组件都是需要配置集群的。
提示
这里大家要明确一下,Hive 是不需要安装分布式服务的,本质上就是一个将 HQL 转化为 MapReduce 程序的工具,它的分布式特性是由 Hadoop 完成的。
# 修改常用配置
以下配置信息除了日志路径之外,其余均在hive-site.xml
中修改。
# 数据存储位置
Hive 数据默认是存储在 HDFS 的 /user/hive/warehouse
路径下的,可以通过下面的配置项修改:
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
2
3
4
5
# 在命令中显示当前库
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
<description>Whether to include the current database in the Hive prompt.</description>
</property>
2
3
4
5
# 显示表头属性
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
2
3
4
# 本地模式
当 Hive 的输入数据量非常小时,Hive 通过本地模式在单台机器上处理所有的任务。对于小数据集,执行时间会明显被缩短。当一个 job 满足如下条件才能真正使用本地模式:
- job 的输入数据量必须小于参数:hive.exec.mode.local.auto.inputbytes.max (默认 128MB)
- job 的 map 数必须小于参数:hive.exec.mode.local.auto.tasks.max (默认 4)
- job 的 reduce 数必须为 0 或者 1
<property>
<name>hive.exec.mode.local.auto</name>
<value>true</value>
<description>Let Hive determine whether to run in local mode automatically</description>
</property>
2
3
4
5
# 修改日志路径
Hive 的默认日志路径是由 conf/hive-log4j.properties.template
文件中的 hive.log.dir
属性决定的,默认值是 ${java.io.tmpdir}/${user.name}
。我们需要将hive-log4j.properties.template
文件重命名为hive-log4j.properties
,并修改默认存储位置为/opt/module/hive/logs
。
mv hive-log4j.properties.template hive-log4j.properties
hive.log.dir = /opt/lagou/servers/hive-2.3.7/logs
2
3
# 参数配置方式
Hive 有三种参数配置参数的方式:
- 用户自定义配置文件(hive-site.xml、hive-default.xml)
- 启动 Hive 时指定参数(--hiveconf)
- 在 Hive 的客户端中通过命令行的方式指定参数(set)
不同配置的优先级: set > -hiveconf > hive-site.xml > hive-default.xml
# 配置文件
默认配置文件:hive-default.xml,用户自定义配置文件:hive-site.xml。用户自定义配置会覆盖默认配置。另外,Hive 也会读入 Hadoop 的配置,因为 Hive 是作为 Hadoop 的客户端启动的,Hive 的配置会覆盖 Hadoop 的配置。配置文件的设定对本机启动的所有 Hive 进程都有效。
# 启动时指定参数值
启动 Hive 时,可以在命令行添加 -hiveconf param=value
来设定参数,这些设定仅对本次启动有效。
# 启动时指定参数
bin/hive -hiveconf hive.exec.mode.local.auto=true
# 在命令行检查参数是否生效
hive> set hive.exec.mode.local.auto;
hive.exec.mode.local.auto=true
2
3
4
5
6
如果要在启动时指定多个参数,可以用多组-hiveconf param=value
,如:
bin/hive -hiveconf paramA=valueA -hiveconf paramB=valueB
# 命令行修改参数
可在 Hive 命令行中使用 set
关键字设定参数,同样仅对本次启动有效:
hive> set hive.exec.mode.local.auto=false;
hive> set hive.exec.mode.local.auto;
hive.exec.mode.local.auto=false
2
3
完整配置项可以在Hive 文档 (opens new window)中查看。