搭建前的准备
首先得搭建好Hadoop,可以参考之前的博客
Hive版本:apache-hive-2.3.2-bin.tar.gz。点击下载。
- 官方手册清单(目录)
- 官方手册开始 Hive 安装和配置
- 官方手册LanguageManual 语法
- 参考博客Hive 的几种内置服务
- 参考博客Hive-Metastore 及其配置管理
- 参考博客Hive metastore 三种配置方式
安装过程
解压
$ tar -xzvf hive-2.3.2.tar.gz -C /home/hadoop/
配置环境变量
PATH 环境变量中必须有 HADOOP_HOME
$ vim ~/.bash_profile
$ export HIVE_HOME=/home/hadoop/apache-hive-2.3.2
$ export PATH=$HIVE_HOME/bin:$PATH
$ source ~/.bash_profile
安装 mysql
如果不使用内嵌的 derby 管理 Metastore,可以配置 mysql 来管理 Metastore。
参考安装Mysql
# root用户登录 -h 指定 hostname,默认localhost
mysql -u root -p
# 创建一个新数据库实例,在mysql shell中';'是必须的
mysql> create database hive;
mysql> grant all privileges on hive.* to hive@"%" identified by 'hive';
添加 mysql 驱动包,去 mvn 下载 mysql 驱动包
$ mv mysql-connector-java-5.1.38.jar $HIVE_HOME/lib
修改配置文件
你可以在conf/hive-env.sh
里添加额外的环境变量。
$ cd $HIVE_HOME/conf/
$ cp hive-env.sh.template hive-env.sh
Hive 配置是Hadoop之上的一个覆盖,它默认继承了Hadoop配置变量,并默认从conf/hive-default.xml
中读取配置项,用户可以通过conf/hive-site.xml
覆盖默认的配置。
Hive 配置文件夹可以通过$HIVE_CONF_DIR
来修改,默认是$HIVE_HOME/conf/
# === 方式1 ===
$ cp hive-default.xml.template hive-default.xml
# 但是这样做会出现问题:
# java.lang.IllegalArgumentException:java.net.URISyntaxException:
# Relative path in absolute URI:${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
# 原因: Hive 找不到 ${system:java.io.tmpdir},${system:user.name}
# 解决方案:
# 创建本地临时文件夹
$ mkdir /home/hadoop/hive-2.3.2/temp
$ vim hive-default.xml
# 将所有 ${system:java.io.tmpdir} 替换成 /home/hadoop/hive-2.3.2/temp
:%s/\${system:java.io.tmpdir}/\/home\/hadoop\/hive-2.3.2\/temp/g
# 将所有 ${system:user.name} 改成 ${user.name}
:%s/\${system:user.name}/${user.name}/g
# === 方式2 ===
# 新建新的 hive-site.xml,当然需要包含 xml 命名空间和 configuration 标签
$ vim hive-site.xml
方式1需要修改,方式2需要添加如下内容
<configuration>
<!-- 注意:下面配置的都是 hdfs 路径 -->
<property>
<!--
指定Hive作业的HDFS根目录,全部写入权限(733)。
对于每一个连接的用户会创建一个HDFS临时目录,
路径是 ${hive.exec.scratchdir}/username,
并指定权限 ${hive.scratch.dir.permission} (700)
-->
<name>hive.exec.scratchdir</name>
<value>/tmp/hive</value>
</property>
<property>
<!-- 指定仓库默认数据库的位置 -->
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<!-- Hive运行时结构化日志文件的位置 -->
<name>hive.querylog.location</name>
<value>/user/hive/log</value>
</property>
<!-- 配置 Metastore 官网默认配置是 derby,配置 mysql 需要改成下面的样子 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<!-- hive 是 mysql 数据库的名称 -->
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&characterEncoding=UTF-8&useSSL=false</value>
</property>
<property>
<!-- 数据库驱动类 -->
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<!-- 数据库用户名 -->
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<!-- 数据库密码 -->
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
</property>
</configuration>
在hdfs创建基础目录并赋权
如果hive拥有hdfs根目录的写权限就不需要下面的操作了,他自己会生成。
# hive 的数据结构目录
$ bin/hadoop fs -mkdir -p /user/hive/warehouse
$ bin/hadoop fs -mkdir -p /tmp/hive
$ bin/hadoop fs -mkdir -p /user/hive/log
$ bin/hadoop fs -chmod -R 777 /user/hive/warehouse
$ bin/hadoop fs -chmod -R 777 /tmp/hive
$ bin/hadoop fs -chmod -R 777 /user/hive/log
初始化
使用 derby 进行初始化
# 在当前目录下 会看到一个文件 derby.log 和一个文件夹 metastore_db
$ schematool -dbType derby -initSchema
使用 mysql 进行初始化
$ schematool -dbType mysql -initSchema
Hive 的内置服务
# 查看 hive 内置服务
$ hive --service help
显示如下:
Usage ./hive <parameters> --service serviceName <service parameters>
# hive的所有服务/组件
Service List: beeline cleardanglingscratchdir cli hbaseimport hbaseschematool help hiveburninclient hiveserver2 hplsql jar lineage llap llapdump llapstatus metastore metatool orcfiledump rcfilecat schemaTool version
Parameters parsed:
--auxpath : Auxiliary jars
--config : Hive configuration directory
--service : Starts specific service/component. cli is default
Parameters used:
HADOOP_HOME or HADOOP_PREFIX : Hadoop install directory
HIVE_OPT : Hive options
# 查看某个服务/组件的详细用法
For help on a particular service:
./hive --service serviceName --help
Debug help: ./hive --debug --help
下面简单介绍几个服务:
- cli:是 Hive 的命令行界面,用的比较多,是默认服务,直接可以在命令行里使用。
- hiveserver:这个可以让Hive以提供Thrift服务的服务器形式来运行,可以允许许多个不同语言编写的客户端进行通信,使用需要启动HiveServer服务以和客户端联系,我们可以通过设置HIVE_PORT环境变量来设置服务器所监听的端口,在默认情况下,端口号为10000。这个可以通过以下方式来启动Hiverserver:
bin/hive --service hiveserver -p 10002
- HWI:其实就是hive web interface的缩写它是hive的web借口,是hive cli的一个web替代方案(该组件从Hive 2.2.0 开始被移除了)
- jar:与
hadoop jar
等价的 Hive 接口,这是运行类路径中同时包含 Hadoop 和 Hive 类的 Java 应用程序的简便方式 - metastore:在默认的情况下,metastore和hive服务运行在同一个进程中,使用这个服务,可以让metastore作为一个单独的进程运行,我们可以通过METASTOE——PORT来指定监听的端口号
启动
Hive 的启用方式大概可以分为三类:CLI(Command Line Interface)、HWI(Hive Web Interface)、HiveServer
CLI
启动 hive-cli
$ hive
开启 hive 的 log4j 日志,运行 hive-cli 的日志信息会在配置的目录下生成
$ mkdir /home/hadoop/apache-hive-2.3.2/logs
$ cd $HIVE_HOME/conf
$ cp hive-log4j2.properties.template hive-log4j2.properties
$ vim hive-log4j2.properties
property.hive.log.dir=/home/hadoop/apache-hive-2.3.2/logs
HWI
启动 HWI,用于通过浏览器来访问hive,浏览器访问地址是:127.0.0.1:9999/hwi。注意:该组件在 Hive2.2.0 开始被移除了。
$ bin/hive --service hwi &
HiveServer
启动 HiveServer2,用java、python等程序实现通过 jdbc 等驱动访问 hive 就需要这种启动方式。
# 默认地址:`jdbc:hive2://localhost:10000`
$ hiveserver2 &
在$HIVE_HOME/conf/hive-site.xml
中配置Hiveserver2的相关配置。
# 最小工作线程数,默认为5。
hive.server2.thrift.min.worker.threads
# 最大工作线程数,默认为500。
hive.server2.thrift.max.worker.threads
# TCP 的监听端口,默认为10000。
hive.server2.thrift.port
# TCP绑定的主机,默认为localhost
hive.server2.thrift.bind.host
# 默认值为binary(TCP),可选值HTTP。
hive.server2.transport.mode
# HTTP的监听端口,默认值为10001。
hive.server2.thrift.http.port
# 服务的端点名称,默认为 cliservice。
hive.server2.thrift.http.path
# 服务池中的最小工作线程,默认为5。
hive.server2.thrift.http.min.worker.threads
# 服务池中的最大工作线程,默认为500。
hive.server2.thrift.http.max.worker.threads
# 设置 impersonation,默认是 true
# 如果为 true,hive server 会以提交用户的身份去执行语句。
# 如果设置为 false,则会以起 hive server daemon 的 admin user 来执行语句。
hive.server2.enable.doAs
HiveClients
使用 beeline 连接 hiveserver2,HiveServer2 Clients, Beeline – Command Line Shell
$ beeline -u "jdbc:hive2://localhost:10000/"
# 对于启用了 Kerberos 的 Hive 需要加上 principal 信息
$ beeline --verbose=true -u "jdbc:hive2://node-04.hadoop.data.sensetime.com:10000/default;principal=hive/[email protected]"
# 通过 zookeeper 发现 hiveserver2 JDBC URL
$ beeline --verbose=true -u "jdbc:hive2://ambari3:2181,ambari1:2181,ambari2:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2"
如果出现以下异常:
Error:
Could not open client transport with JDBC Uri: jdbc:hive2://localhost:10000/:
Failed to open new session:
java.lang.RuntimeException:
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException):
User: despacito is not allowed to impersonate anonymous (state=08S01,code=0)
是因为 hadoop 引入了一个安全伪装机制,使得 hadoop 不允许上层系统直接将实际用户传递到 hadoop 层,而是将实际用户传递给一个超级代理,由此代理在 hadoop 上执行操作,避免任意客户端随意操作 hadoop。
解决方法:在hadoop的配置文件core-site.xml增加如下配置,并重启hdfs。
<property>
<!-- 需要将 xxx 换成你的超级代理的用户名,说明请求将由 xxx 用户代执行 -->
<name>hadoop.proxyuser.xxx.hosts</name>
<!-- 哪些 hosts 的请求要走超级代理,逗号分割,* 代表所有-->
<value>*</value>
</property>
<property>
<!-- 同上 -->
<name>hadoop.proxyuser.xxx.groups</name>
<!-- 哪些 gorup 的请求要走超级代理,同上 -->
<value>*</value>
</property>