一二, Hive 概述,安装及其基本使用

一, Hive概述

1. 什么是Hive

[概念]

Hive: 由FaceBook开源用于解决海量结构化日志的数据统计工具.

  • Hive是基于Hadoop的一个数据仓库工具, 可以将结构化的数据文件映射为一张表, 并提供类SQL(Hive SQL)查询功能.
  • Hive处理的数据存储在HDFS.
  • Hive的本质是将SQL语句转换为MapReduce任务运行, 使得不熟悉MapReduce的用户也能很方便利用HQL 处理和计算HDFS上的结构化数据,适用于离线的批量数据计算.

[本质]

请添加图片描述

Hive 依赖于 HDFS 存储数据,Hive 将 HQL 转换成 MapReduce 执行,所以说 Hive 是基于 Hadoop 的一个数据仓库工具,实质就是一款基于 HDFS 的 MapReduce 计算框架,对存储在 HDFS 中的数据进行分析和管理

2. Hive 优缺点

[优点]

[缺点]

3. Hive 架构

二, Hive安装

2.1 下载地址和文档地址

Hive-3.1.2 安装包下载
Hive官方文档地址

2.2 安装Hive

  1. 把下载的安装包apache-hive-3.1.2-bin.tar.gz上传到/opt/software目录中
    请添加图片描述

  2. 使用tar命令, 解压安装包到/opt/module/目录中, 然后改名hive-3.1.2
    在这里插入图片描述
    在这里插入图片描述

  3. 添加相应的环境变量, 千万不要忘了source /etc/profile 进行生效噢!
    在这里插入图片描述

  4. 解决日志jar包冲突
    在这里插入图片描述

  5. 初始化元数据库

# 加上 --verbose 可以打印下一些监控信息, 无关紧要.
[win10@bigdata01 hive-3.1.2]$ bin/schematool -dbType derby -initSchema --verbose
  • 成功执行后最终结果:
    在这里插入图片描述

初始化元数据可能会碰到的错误

[错误1-java.langNoSuchMethodError]

Exception in thread “main” java.langNoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V

在这里插入图片描述

  • 问题原因:
    hadoop安装目录lib库目录下的Guava-版本号-jre.jar包与 hive的lib库中的 Guava-版本号.jar包版本不一致导致的,
    • Guava-xx.jar包 在hadoop安装目录下的路径是/hadoop安装路径/share/hadoop/common/lib
    • 在hive安装目录下的路径是: /hive安装目录/lib
  • 解决办法:

用hadoop中的这个Guava-版本号-jre.jar替换掉hive路径下的jar包, 名字改成跟hive一致的形式, 即Guava-版本号.jar(当然版本号要与hadoop的一直即可.)

在这里插入图片描述

如下图, 上面是hive原有的jar包, 下面是从hadoop目录复制过来的jar包, 我们做以下修改即可:
在这里插入图片描述

[错误2-Error: DDL is not permitted for a read-only connection, user or database.]

在这里插入图片描述

  • 问题原因: /metastore_db目录下文件属于的用户名和组名有问题, 在当前用户中没有相关的读写权限, 之所以出现这种情况可能是因为在初始化元数据库的时候, 使用了root用户去启动(sudo 提权等等), 造成derby数据库生成的文件属于的用户名和组都成了root.
  • 解决办法, 直接重装最好, 但是也能通过找到Hive安装目录下的metastore.db目录, 更改为当前用户即可, 当然还要删除 .lck文件

在这里插入图片描述

2.3 启动和使用Hive

  1. 启动Hive
bin/hive

可能会出现的错误:
在这里插入图片描述

别忘了启动你的hadoop集群噢, 因为hive需要存储和读取hdfs中的数据!

  1. Hive的简单使用
  • 创建数据库test;
    在这里插入图片描述

  • 往test数据库添加新表testtable, 并查看表结构;
    在这里插入图片描述
    在这里插入图片描述

  • 往表中添加一条数据;
    在这里插入图片描述

可以看到在插入数据到表的时候, 数据经过了Map-Reduce过程, 之后肯定是被存放到了HDFS中.

  • 查看表中的数据
    1. 从hive客户端查看:
      在这里插入图片描述
    2. 直接查看HDFS目录中的数据.
      在这里插入图片描述
  1. 如何实时查看 Hive的运行日志? 为什么我们需要替换掉元数据库 Derby?
  • 在xshell单独开一个终端, 并实时监控日志: tail -f /tmp/win10(linux主句用户名)/hive.log, 同时我们再开一个终端去启动hive bin/hive,
  • 此时查看log日志变化, 会疯狂报错, 结束后从日志末尾往上三分之一处, 会出现这么一句话:
    在这里插入图片描述
  • 这句话是说已经有别的Derby实例在使用数据库了, 即Derby同一时刻只能由一个用户使用.
  • 综上我们可以知道在Hive中元数据库 Derby被替换的原因:
      1. Derby数据库不支持并发,也就是只支持单线程操作,当有一个用户在对Hive进行操作时,其他用户则无法操作, 若应用在生产环境效率低下;
      1. 当在切换目录后,重新进入Hive会找不到原来已经创建的数据库和表。主要原因是比如第一次是在bin目录下进入Hive,在进入后,会在bin目录下创建一个metaStore.db的目录和一个derby.log的日志文件. 那么经过更换目录后,然后进入Hive就会存在一个问题,原有的元数据信息都是基于bin目录下创建的,所以在找数据库和表的信息时候,都是基于bin目录的,而此时就会存在找不到原有创建的数据库和表的信息,所以会将默认的Derby数据库进行更换为Mysql。

2.4 安装MySQL

  1. 检查当前系统是否安装了Mysql, 如果有, 卸载之;
    在这里插入图片描述

  2. 下载后, 将安装包 Mysql完全版+JDBC连接器, 提取码: lqi4拷贝到linux系统的/opt/software目录下, 解压之, 连接器后面再用.
    在这里插入图片描述

  3. 按照以下顺序(common->libs–>libs-compat–>client–>server),执行安装命令
    在这里插入图片描述在这里插入图片描述

  4. 删除/etc/my.cnf 文件中datadir所指向的目录中所有的内容;(当然初次安装, 里面是没有数据的,也就不需要执行这一步了.)

在这里插入图片描述

  1. 初始化数据库, 并查看临时生成的root用户的密码
  • 初始化
    在这里插入图片描述

  • 查看临时生成root用户的密码
    在这里插入图片描述

  1. 启动Mysql服务
sudo systemctl start mysqld

# 验证mysql是否为running
sudo systemctl status mysqld

可能会出现的问题:
在这里插入图片描述

解决办法: /etc/selinux/config里修改SELINUX=permissive后,再reboot就可了!

  1. 登录mysql数据库, 并修改root用户的密码
    在这里插入图片描述
    在这里插入图片描述

可能出现的问题:
Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)

解决方法:在这里插入图片描述

  1. 修改mysql库下的user表中的root用户, 让其允许任意ip连接(而不止 root@localhost)
mysql> update mysql.user set host='%' where user='root';
mysql> flush privileges;

2.5 Hive 元数据配置到MySQL

2.5.1 将MySQl的JDBC驱动拷贝到Hive的lib目录下

  1. /opt/software/mysql-connector-xx -> $HIVE_HOME/lib

在这里插入图片描述

2.5.2 配置MetaStore到MySQL

  1. 在 $HIVE_HOME/conf 新建 hive-site.xml, 并输入以下内容:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>

<!-- jdbc 连接的 URL, 注意哦, metastore是代表元数据库名叫 metastore噢, 在mysql建库的时候一定要跟这个保持一致噢 -->
<property>
	<name>javax.jdo.option.ConnectionURL</name>
	<value>jdbc:mysql://bigdata01:3306/metastore?useSSL=false</value>
</property>

<!-- jdbc 连接的 Driver-->
<property>
	<name>javax.jdo.option.ConnectionDriverName</name>
	<value>com.mysql.jdbc.Driver</value>
</property>

<!-- jdbc 连接的 username-->
<property>
	<name>javax.jdo.option.ConnectionUserName</name>
	<value>root</value>
</property>

<!-- jdbc 连接的 password -->
<property>
	<name>javax.jdo.option.ConnectionPassword</name>
	<value>123456</value>
</property>

<!-- Hive 元数据存储版本的验证 -->
<property>
	<name>hive.metastore.schema.verification</name>
	<value>false</value>
</property>

<!--元数据存储授权-->
<property>
	<name>hive.metastore.event.db.notification.api.auth</name>
	<value>false</value>
</property>

<!-- Hive 默认在 HDFS 的工作目录 -->
<property>
	<name>hive.metastore.warehouse.dir</name>
	<value>/user/hive/warehouse</value>
</property>
</configuration>
  1. 登录mysql, 并创建一个数据库作为元数据库;
[win10@bigdata01 hive-3.1.2] mysql -u root -p123456;

在这里插入图片描述

  1. 初始化Hive的元数据库
[win10@bigdata hive-3.1.2]schematool -initSchema -dbType mysql --verbose

在这里插入图片描述

2.5.3 再次启动Hive

  1. 启动后Hive(一定不要忘了开启Hadoop集群, 不然又得是connection refused报错!!)
[win10@bigdata01 hive-3.1.2]bin/hive
  1. 在xshell(crt)新建会话窗口, 并切换到hive目录再次启动一个hive 会话, 可以看到在切换元数据库为mysql后, 可以支持多用户访问元数据库了;

在这里插入图片描述

2.6 访问Hive的三种方式

2.6.1 前面提到的访问, 即本地访问 bin/hive

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

  1. 在 hive-site.xml 文件中添加如下配置信息:
<!-- 指定存储元数据要连接的地址 -->
<property>
    <name>hive.metastore.uris</name>
    <value>thrift://bigdata01:9083</value>
</property>
  1. 启动 metastore后, 去启动 hive

要注意到, metastore service是前台进程, 是在终端中运行的命令,那么该终端就为进程的控制终端,一旦这个终端关闭,这个进程也随之消失。所以这个服务启动后, 我们需要重新开一个终端进行别的操作.

在这里插入图片描述

[win10@bigdata01 hive-3.1.2] hive --service metastore

## 下面是在新的终端中启动hive
[win10@bigdata01 hive-3.1.2] bin/hive

注意: 在这里容易发生下面的错误
org.apache.thrift.transport.TTransportException: Could not create ServerSocket on address 0.0.0.0/0.0.0.0:9083.

错误原因: 启动hive服务(hive --service metastore 之前 开启了hive(bin/hive))
解决办法: jps, 然后用 kill -9 pid 删除所有的 runjar
在这里插入图片描述

2.6.3 使用JDBC方式访问Hive

  1. 在 hive-site.xml 添加以下配置信息
<!-- 指定 hiveserver2 连接的 host -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>bigdata01</value>
</property>

<!-- 指定 hiveserver2 连接的端口号 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
  1. 启动 hiveserver2(同样也是前台进程)(在这之前, 前面我们配置的元数据服务也是需要启动的 哦!)

前提: 开启元数据服务(前台进程)
hive --service metastore

  • 开启hiveserver2
[win10@bigdata01 hive] hive --service hiveserver2
  • 启动成功的标志
    在这里插入图片描述

在这一步需要注意的是: hiveserver2的启动时间会比较长一些, 当你观察日志(tail -f /tmp/linux用户名/hive.log)的时候,还会出现报错(如下图所示), 这个错误的主要原因是我们没有设置tez引擎相关的东西, 此时一分钟之后将会重试开启hiveserver2, 我们只需耐心等待启动成功即可.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zSR4D9JA-1627818273327)(2021-08-01-11-06-58.png)]

什么是hiveserver2, 它的作用是什么?

  1. 启动 beeline客户端
[win10@bigdata01 hive-3.1.2] bin/beeline -u jdbc:hive2://bigdata01:10000 -n win10

注意: 这里极易出现以下错误:
在这里插入图片描述
解决办法: beeline连接hiveserver2报错:User: root is not allowed to impersonate root

  1. 以上工作做完之后, 成功连接会出现以下界面:

在这里插入图片描述

  1. Hive 服务启停脚本(只使用,暂时不用理解)
##// Hive 启停脚本

#!/bin/bash
# 判断logs是否存在, 目录不存在, 新建之
HIVE_LOG_DIR=$HIVE_HOME/logs			
if [ ! -d $HIVE_LOG_DIR ]
then
	mkdir -p $HIVE_LOG_DIR
fi
#检查进程是否运行正常,参数 1 为进程名,参数 2 为进程端口
function check_process()
{
    
    
	pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print$2}')
	ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut -d '/' -f 1)
	echo $pid
	[[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1
}
## 启动 Metastore.service (元数据服务) + hiveserver2服务
function hive_start()
{
    
    
	metapid=$(check_process HiveMetastore 9083)
	cmd="nohup hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1&"
	[ -z "$metapid" ] && eval $cmd || echo "Metastroe 服务已启动"
	server2pid=$(check_process HiveServer2 10000)
	cmd="nohup hive --service hiveserver2 >$HIVE_LOG_DIR/hiveServer2.log 2>&1 &"
	[ -z "$server2pid" ] && eval $cmd || echo "HiveServer2 服务已启动"
}

## 停止
function hive_stop()
{
    
    
	metapid=$(check_process HiveMetastore 9083)
	[ "$metapid" ] && kill $metapid || echo "Metastore 服务未启动"
	server2pid=$(check_process HiveServer2 10000)
	[ "$server2pid" ] && kill $server2pid || echo "HiveServer2 服务未启动"
}

case $1 in
"start")
	hive_start
;;
"stop")
	hive_stop
;;
"restart")
	hive_stop
	sleep 2
	hive_start
;;
"status")
	check_process HiveMetastore 9083 >/dev/null && echo "Metastore 服务运行正常" || echo "Metastore 服务运行异常"
	check_process HiveServer2 10000 >/dev/null && echo "HiveServer2 服务运行正常" || echo "HiveServer2 服务运行异常"
;;
*)
	echo Invalid Args!
	echo 'Usage: '$(basename $0)' start|stop|restart|status'
;;
esac
  1. 赋予执行权限;

在这里插入图片描述

  1. 添加到全局环境变量, 随处便可运行;
  • 其实有点脱裤子放屁, 因为这个脚本正好是放在了hive安装目录下的/bin目录中, 权当复习了哈哈
    在这里插入图片描述
  1. 在我们脚本启动时候, 便可以利用 bin/hive, 或者 bin/beeline -u jdbc:hive2://bigdata01:10000 -n win10 启动hive客户端了

  2. 注释掉 hiveServer2服务的启动配置, 因为我们访问hive有三种方式呢, 这种使用(metastore service + hiveserver2), 然后在用beeline启动客户端的交互方式太麻烦,时间还长, 所以我们在下面的实操中不使用这种方式, 而是直接使用 bin/hive 启动hive客户端进行交互操作.

在这里插入图片描述

2.7 Hive常用的交互命令

在这里插入图片描述

  1. hive -e “sql语句;”
    在这里插入图片描述

  2. hive -f 写入了sql命令的文件

在这里插入图片描述
在这里插入图片描述

  • 追加.
    在这里插入图片描述

可能出现的问题:
在这里插入图片描述

2.8 Hive其他命令操作

  1. 退出hive窗口(exit/quit)

  2. 在hive 客户端里面查看hdfs文件系统(dfs -ls /)
    在这里插入图片描述

  3. 查看在hive中输入的历史命令

    1. 进入到当前用户的主目录(/root 或者是 /home/win10)
    2. cat .hivehistory
    3. 在这里插入图片描述

2.9 Hive 常见属性配置

2.9.1 Hive运行日志信息配置

  1. Hive 的运行日志默认放在: /tmp/用户名/hive.log中, 非当天的日志自动命名为 hive.log.年-月-日
  2. 下面我们修改运行日志的存储目录为/opt/module/hive-3.1.2/logs
    1. 修改**/opt/module/hive-3.1.2/conf/hive-log4j2.properties.template**文件名,改为 hive-log4j.properties
      在这里插入图片描述

    2. 修改上述文件中log的存放位置
      在这里插入图片描述

2.9.2 打印当前数据库名和表名(方便)

<!-- 打印当前表的表名 -->
<property>
    <name>hive.cli.print.header</name>
    <value>true</value>
</property>

<!-- 打印当前使用数据库的名 -->
<property>
    <name>hive.cli.print.current.db</name>
    <value>true</value>
</property>

在这里插入图片描述

2.9.3 参数配置方式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/nmsLLCSDN/article/details/119302568