准备工作

下载Hive

Hive 1.x 和 Hadoop 1.x 对应;
Hive 2.x 和 Hadoop 2.x 对应;
Hive 3.x 和 Hadoop 3.x 对应;
到官网或者镜像中心下载对应版本的Hive。例如:apache-hive-3.1.3-bin.tar.gz

安装

解压

将 tar包上传到hadoop服务器,例如 hadoop102上的 /opt/software文件夹中。
解压到/opt/module文件夹:

  1. tar -zxvf apache-hive-3.1.3-bin.tar.gz -C /opt/module/

如果感觉解压后的文件名比较长,可以进行重命名:

  1. cd /opt/module
  2. mv apache-hive-3.1.3-bin/ hive-3.1.3

配置环境变量

/etc/profile.d/my_env.sh中加入以下环境变量:

  1. # HIVE_HOME
  2. export HIVE_HOME=/opt/module/hive-3.1.3
  3. export PATH=$PATH:$HIVE_HOME/bin

解决日志 jar 包冲突

移除HIVE的日志jar包:

  1. mv $HIVE_HOME/lib/log4j-slf4j-impl-2.17.1.jar $HIVE_HOME/lib/log4j-slf4j-impl-2.17.1.bak

不需要集群部署

因为Hive只是一个将HQL语句转换成MapReduce的工具,本质上也还是一个执行MapReduce任务的客户端,就和我们运行一个java程序一样,所以不存在集群化部署。

启动

初始化元数据库

当不修改配置时,hive默认使用的是自带的 derby 数据库。
启动前,需要先初始化元数据库:

  1. bin/schematool -dbType derby -initSchema

如果执行报以下错误:

  1. Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
  2. at org.apache.hadoop.conf.Configuration.set(Configuration.java:1357)
  3. at org.apache.hadoop.conf.Configuration.set(Configuration.java:1338)
  4. at org.apache.hadoop.mapred.JobConf.setJar(JobConf.java:536)
  5. at org.apache.hadoop.mapred.JobConf.setJarByClass(JobConf.java:554)
  6. at org.apache.hadoop.mapred.JobConf.<init>(JobConf.java:448)
  7. at org.apache.hadoop.hive.conf.HiveConf.initialize(HiveConf.java:5144)
  8. at org.apache.hadoop.hive.conf.HiveConf.<init>(HiveConf.java:5107)
  9. at org.apache.hive.beeline.HiveSchemaTool.<init>(HiveSchemaTool.java:96)
  10. at org.apache.hive.beeline.HiveSchemaTool.main(HiveSchemaTool.java:1473)
  11. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  12. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  13. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  14. at java.lang.reflect.Method.invoke(Method.java:498)
  15. at org.apache.hadoop.util.RunJar.run(RunJar.java:323)
  16. at org.apache.hadoop.util.RunJar.main(RunJar.java:236)

则可能是 hive 内依赖的 guava.jar 和 hadoop内的 guava.jar版本不一致造成的。

检查方法:

  • 查看$HIVE_HOME/lib下的guava-xxx.jar(hive 3.1.3自带的是guava-19.0.jar
  • 查看$HADOOP_HOME/share/hadoop/common/lib下的guava-xxx.jar(hadoop 3.2.3自带的是guava-27.0-jre.jar

将hive中低版本的guava的jar包移除,更换成 hadoop 的高版本 guava 包:

  1. mv $HIVE_HOME/lib/guava-19.0.jar $HIVE_HOME/lib/guava-19.0.bak
  2. cp $HADOOP_HOME/share/hadoop/common/lib/guava-27.0-jre.jar $HIVE_HOME/lib/

然后重新执行初始化元数据命令即可。

初始化元数据库成功后,会在hive目录下生成:derby.log日志文件、metastore_db元数据库信息文件夹。

启动hive客户端

使用命令启动hive客户端:

  1. bin/hive

查看启动日志,默认的日志保存位置为:/tmp/用户名/hive.log

启动后,会出现一个警告:

  1. 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. spark, tez) or using Hive 1.X releases.
  2. 基于MRHive hive 2时已经过时,将来版本中可能会被弃用,考虑使用其他引擎(例如sparktez),或者使用 hive 1.x

简单的命令

HQL命令类似于Mysql的SQL:

  1. -- 查看所有数据库
  2. show databases;
  3. -- 查看所有表
  4. show tables;
  5. -- 创建表
  6. create table test(id string); -- 字符串是string,整数是int,类似java的类型
  7. -- 插入一条数据
  8. insert into test values('aaa'); -- 该语句执行后,会被转换成一个MapReduce任务

默认生成的test文件为:/user/hive/warehouse/test/000000_0。该路径也可以自定义

更换元数据库

derby数据库的弊端

hive默认使用的是自带的derby数据库,该数据库使用起来不方便:

  • 不能连接进去查看具体的内部数据
  • 不支持多用户。当启动两个及以上的hive客户端时,就会报错

所以需要将hive的元数据库修改为MySQL。

安装Mysql数据库

下载:
到mysql官网下载对应Linux版本的Mysql 5.7安装包:mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
将安装包上传到 hadoop102 的/opt/software/目录并解压:

  1. # 解压完的几个文件还是安装包,所以直接解压到 /opt/software 文件夹即可
  2. tar -xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar

卸载系统自带的Mysql:

  1. # 检查当前系统是否已经自带了Mysql
  2. rpm -qa | grep mariadb
  3. # 如果已经自带了Mysql,例如mariadb-libs-5.5.56-2.el7.x86_64,则先进行卸载
  4. sudo rpm -e --nodeps mariadb-libs
  5. # 卸载完重新检查
  6. rpm -qa | grep mariadb

安装Mysql:

需要注意安装顺序,后面的rpm对前面的有依赖

  1. sudo rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm
  2. sudo rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
  3. sudo rpm -ivh mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
  4. sudo rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm
  5. sudo rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm

如果出现检测mysql-community-libs-8.0.29-1.el7.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 3a79bd29: NOKEY 安装命令后面加 —nodeps —force 例如 rpm -ivh mysql-community-libs-8.0.16-2.el7.x86_64.rpm —nodeps —force

如果linux是最小版本的,可能会缺少libaio等依赖,根据报错安装相关依赖即可:

  1. # 如果报错缺少libaio依赖,则安装依赖即可。没报错则无需安装
  2. yum install -y libaio

删除datadir中的内容:

查看文件/etc/my.cnf 文件中的 datadir的值,默认是/var/lib/mysql
进入该路径,查看该路径下是否有内容。如果有则清空该文件夹下的内容,如果没有则无需理会。
初始化数据库:

  1. sudo mysqld --initialize --user=mysql

启动Mysql服务:

  1. sudo systemctl start mysqld

mysqld服务默认就是开机自启,无需再配置开机自启。
查看临时生成的root用户的密码:

  1. # 查看日志文件中生成root用户的临时密码 A temporary password is generated for root@localhost:
  2. sudo cat /var/log/mysqld.log

使用该密码登录数据库:

  1. mysql -uroot -p

登入数据库后,修改root用户的密码,否则执行其他操作可能会报错:

  1. -- set password = password("新密码");
  2. set password = password("root");

修改Mysql库下的user表中的root用户允许任意ip连接:

  1. update mysql.user set host='%' where user='root';
  2. flush privileges;

更换为Mysql数据库

添加jdbc驱动:

从Maven中央仓库下载mysql驱动包:mysql-connector-java-5.1.37.jar

将mysql的jdbc驱动包放到$HIVE_HOME/lib目录下。

添加配置文件:

hive的配置文件位于$HIVE_HOME/conf目录下,该目录下自带了一些.template的模板样例。

与Hadoop的xxx-site.xml配置文件类似,Hive中用户自定义的配置文件叫hive-site.xml

$HIVE_HOME/conf下新建hive-site.xml:

内容可以参考hive-default.xml.template模板

  1. <?xml version="1.0"?>
  2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
  3. <configuration>
  4. <property>
  5. <name>javax.jdo.option.ConnectionURL</name>
  6. <value>jdbc:mysql://hadoop102:3306/hive?useSSL=false</value>
  7. <description>jdbc连接的URL</description>
  8. </property>
  9. <property>
  10. <name>javax.jdo.option.ConnectionDriverName</name>
  11. <value>com.mysql.jdbc.Driver</value>
  12. <description>jdbc驱动类</description>
  13. </property>
  14. <property>
  15. <name>javax.jdo.option.ConnectionUserName</name>
  16. <value>root</value>
  17. <description>用户名</description>
  18. </property>
  19. <property>
  20. <name>javax.jdo.option.ConnectionPassword</name>
  21. <value>root</value>
  22. <description>密码</description>
  23. </property>
  24. <!-- 下面两处的校验是为了derby的校验。如果换成了Mysql数据库,都需要设置成false,否则hive会启动失败 -->
  25. <property>
  26. <name>hive.metastore.schema.verification</name>
  27. <value>false</value>
  28. <description>hive元数据存储版本的验证</description>
  29. </property>
  30. <property>
  31. <name>hive.metastore.event.db.notification.api.auth</name>
  32. <value>false</value>
  33. <description>hive元数据存储授权</description>
  34. </property>
  35. <property>
  36. <name>hive.metastore.warehouse.dir</name>
  37. <value>/user/hive/warehouse</value>
  38. <description>Hive表数据在HDFS的默认存储的工作目录</description>
  39. </property>
  40. </configuration>

初始化Mysql元数据库

登录Mysql,根据hive-site.xml配置的数据库实例名,在Mysql中创建Hive的元数据库:

  1. create database hive;

使用hive的schematool工具初始化hive元数据库:

  1. /opt/module/hive-3.1.3/bin/schematool -initSchema -dbType mysql -verbose

image.png
再次启动hive:

  1. # 启动hive进行查看
  2. bin/hive

Hive向外提供服务

Hive安装之后,可以在本机进行使用,但是还无法让第三方客户端连接。

如果想在Java程序等第三方客户端中连接使用Hive服务,则还需开启Hive的对应服务。

使用元数据服务的方式访问Hive

  1. hive-site.xml文件中添加如下信息:
    1. <property>
    2. <name>hive.metastore.uris</name>
    3. <value>thrift://hadoop102:9083</value>
    4. <description>指定存储元数据要连接的地址</description>
    5. </property>
  1. 启动metastore服务:
    1. hive --service metastore
  1. 启动hive
    1. bin/hive

配置了metastore服务后,第三方工具就可以通过该服务来连接本机的hive。

注意事项:

如果在hive-site.xml中配置了metastore服务,那么就必须启动该服务才能使用hive,否则会报错。

使用JDBC方式访问Hive

  1. hive-site.xml中添加如下信息:
    1. <!-- 需要先配置metastore服务的:hive.metastore.uris -->
    2. <property>
    3. <name>hive.server2.thrift.bind.host</name>
    4. <value>hadoop102</value>
    5. <description>指定hive server2连接的host</description>
    6. </property>
    7. <property>
    8. <name>hive.server2.thrift.bind.port</name>
    9. <value>10000</value>
    10. <description>指定hive server2连接端口号</description>
    11. </property>
  1. 启动hive server2:
    1. # 需要先启动metastore服务 hive --service metastore
    2. hive --service hiveserver2
    3. # 也可以使用 bin/hiveserver2命令启动
  1. 启动 beeline 客户端:(hiveserver2服务启动的比较慢,需要等待一会儿才能连上)
    1. # beeline -u jdbc地址 -n 用户名
    2. # 不需要密码,hiveserver2没有密码
    3. bin/beeline -u jdbc:hive2://hadoop102:10000 -n tengyer
  1. 连接上之后,就可以正常的进行查询:
    1. show tables;
    2. select * from test;
  1. hiveserver2启动后,会向外暴露一个WebUI服务,端口号是 10002,可以用浏览器进行访问:http://hadoop102:10002/

image.png
注意事项:

使用 hiveserver2时,底层会去连接 metastore 服务,所以除了要启动 hiveserver2服务外,还需要启动 metastore服务。

使用beeline连接hiveserver2时,如果报错:

  1. WARN jdbc.HiveConnection: Failed to connect to hadoop102:10000
  2. Error: Could not open client transport with JDBC Uri: jdbc:hive2://hadoop102:10000: Failed to open new session: java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: tengyer is not allowed to impersonate tengyer (state=08S01,code=0)

需要在 Hadoop 的core-site.xml中添加配置:

  1. <!-- 任意地址都可以使用hadoop 的超级代理用户tengyer连接(hive需要用) -->
  2. <property>
  3. <name>hadoop.proxyuser.tengyer.hosts</name>
  4. <value>*</value>
  5. </property>
  6. <property>
  7. <name>hadoop.proxyuser.tengyer.groups</name>
  8. <value>*</value>
  9. </property>

配置完需要重启Hadoop。

编写Hive服务启动脚本

hive --service xxxx开启的服务或者bin/hiveserver2启动的服务默认是在前台运行的,需要保证窗口不关闭,所以需要改为使用 nohup 启动。

  1. nohup hive --service metastore 2>&1 &
  2. nohup hive --service hiveserver2 2>&1 &

为了方便使用,可以编写成脚本,来管理服务的启动和关闭:~/bin/hiveservices.sh

  1. #!/bin/bash
  2. HIVE_LOG_DIR=/opt/module/hive-3.1.3/logs
  3. if [ ! -d $HIVE_LOG_DIR ]
  4. then
  5. mkdir -p $HIVE_LOG_DIR
  6. fi
  7. # 检查进程是否运行正常,参数1为进程名,参数2为进程端口
  8. function check_process()
  9. {
  10. pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print $2}')
  11. ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut -d '/' -f 1)
  12. echo $pid
  13. [[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1
  14. }
  15. function hive_start()
  16. {
  17. metapid=$(check_process HiveMetastore 9083)
  18. cmd="nohup /opt/module/hive-3.1.3/bin/hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &"
  19. [ -z "$metapid" ] && eval $cmd || echo "Metastore 服务已启动"
  20. server2pid=$(check_process HiveServer2 10000)
  21. cmd="nohup /opt/module/hive-3.1.3/bin/hiveserver2 >$HIVE_LOG_DIR/HiveServer2.log 2>&1 &"
  22. [ -z "$server2pid" ] && eval $cmd || echo "HiveServer2 服务已启动"
  23. }
  24. function hive_stop()
  25. {
  26. metapid=$(check_process HiveMetastore 9083)
  27. [ "$metapid" ] && kill $metapid || echo "Metastore服务未启动"
  28. server2pid=$(check_process HiveServer2 10000)
  29. [ "$server2pid" ] && kill $server2pid || echo "HiveServer2服务未启动"
  30. }
  31. case $1 in
  32. "start")
  33. hive_start
  34. ;;
  35. "stop")
  36. hive_stop
  37. ;;
  38. "restart")
  39. hive_stop
  40. sleep 2
  41. hive_start
  42. ;;
  43. "status")
  44. check_process HiveMetastore 9083 >/dev/null && echo "Metastore服务运行正常" || echo "Metastore服务运行异常"
  45. check_process HiveServer2 10000 >/dev/null && echo "HiveServer2服务运行正常" || echo "HiveServer2服务运行异常"
  46. ;;
  47. *)
  48. echo Invalid Args!
  49. echo 'Usage: '${basename $0}' start|stop|restart|status'
  50. ;;
  51. esac

Hive 交互命令

不进入hive交互窗口执行sql

Hive提供的交互命令可以通过-help进行查看:

  1. hive -help

使用-e直接执行sql,不需要再进入hive提示符中。就可以把sql写到shell脚本中进行执行:

  1. # 后面可以执行多个sql语句
  2. hive -e "select * from test;"

使用-f执行sql文件:

  1. # sql文件中可以带有多个sql语句
  2. hive -v hive.sql

查看在hive中输入的所有历史命令:

  1. cat ~/.hivehistory

hive交互窗口

hive窗口进入:

  1. bin/hive

hive窗口退出:

  1. # exit或quit
  2. exit;

在hive交互窗口中查看 HDFS 文件系统内容:

  1. # 在hive交互窗口中,可以直接查看hdfs文件系统内容
  2. dfs -fs /;

在hive交互窗口中执行Linux本地的命令:

在命令前加上!即可执行Linux命令

  1. !ls;
  2. !clear;

静默模式:

只打印结果,不打印中间转换成MR的调试信息

  1. hive -S

Hive 其他常用属性配置

Hive运行日志信息配置

Hive的log默认存放在 /tmp/用户名/hive.log文件中。

$HIVE_HOME/conf下新建hive-log4j2.properties配置文件,修改hive的日志配置信息:

内容可以复制hive-log4j2.properties.template模板

  1. # 修改配置文件中hive的日志文件夹路径配置
  2. property.hive.log.dir=/opt/module/hive/logs

打印当前所处的数据库和表头

通过bin/hive进入Hive交互窗口后,如果使用use xxx;切换了数据库实例,不方便看出来。使用select查询时也没有表头列名。

可以在hive-site.xml中加入如下两个配置:

  1. <property>
  2. <name>hive.cli.print.header</name>
  3. <value>true</value>
  4. </property>
  5. <property>
  6. <name>hive.cli.print.current.db</name>
  7. <value>true</value>
  8. </property>

参数配置方式

查看当前所有配置信息。在Hive的交互窗口中使用set;命令查看:

  1. set;

参数配置的三种方式:

  • 使用配置文件配置
    默认的配置文件为:hive-default.xml。用户自定义的配置文件为:hive-site.xml
    用户自定义配置会覆盖默认配置。另外,Hive也会读入Hadoop的配置项,因为Hiva是作为Hadoop的客户端启动的,Hive的配置会覆盖Hadoop的配置。配置文件的设定对本机启动的所有Hive进程都有效。
  • 命令行参数方式配置
    启动Hive时,可以在命令行添加-hiveconf param=value来设定参数。
    该配置参数只对本地hive启动有效。
    例如:
    1. hive -hiveconf mapred.reduce.tasks=10;
  • 参数声明方式
    可以在HQL中使用SET关键字设定参数。
    例如:
    1. set mapred.reduce.tasks=100;

优先级:配置文件 < 命令行参数 < 参数声明。

有些系统级别的参数(例如 log4j 相关设定),必须使用前两种方式。

使用DBeaver等工具连接Hive

当Hive启动 jdbc 服务后,便可以使用 DBeaver 等第三方工具连接Hive。
Hive的 jdbc 驱动jar位于:$HIVE_HOME/jdbc文件夹下,如:hive-jdbc-3.1.3-standalone.jar

配置数据库连接:
主机:hadoop102,
端口:10000(配置的jdbc服务的端口)
数据库/默认:default(根据实际情况选择对应的数据库实例名)
用户名:kaixin(即hadoop的core-site.xml中配置的代理用户名)
密码:空
最终生成的JDBC url为:jdbc:hive2://hadoop102:10000/default
image.png