hadoop集群部署之hive安装(四)

前言

首先讲讲hive是什么?hive本身是一个数据仓库工具,那既然是仓库,那就要存东西,**存什么东西呢?**存的是元数据(俗称metadata),那再问,**什么是元数据呢?**元数据并不是真实的数据,可以理解为是一种数据映射表,将非结构化的数据映射为结构化数据。
hadoop集群部署之hive安装(四)_第1张图片
从上图可以看出,hive中的元数据,其实只是一张张的数据映射表,你可以理解为mysql中的表也是这个样子,本身也就是一些映射表,真实的数据其实是存放在hdfs中,每当我们在hive中进行查询的时候,会根据hive中的映射表最终在hdfs上找到真实的数据。

hive存在的意义

那再讲讲hive为什么会存在,意义在哪呢?
首先hive是由facebook开源的,用于海量数据的统计分析工作,这是它存在的初衷。
其次,hive是hadoop生态的一员,架构在hadoop之上,可以理解为其实hive就是hadoop的一个客户端,有了hive以后,我们不再需要写复杂的MR任务,只需要写HQL(和sql很像)语句,系统会自动将HQL语句翻译为MR任务提交给集群,然后依托yarn进行任务调度,这大大降低了开发难度。

hive与数据取别

你学过一点hive可能就知道,在查询语句上,hive和sql是非常相似的。那他们之间到底有什么区别呢?
其实除了查询语句之外,其他都不像。
在数据更新上,hive不建议经常改写,而数据库是经常增删改查的。
在延迟上,hive底层是mapreduce实现,以及查询数据时没有索引,数据规模大等等,导致执行时延迟要比数据库大很多。
在数据规模上,也要比数据库大很多。
所以二者之间可以说是差别很大。

Hive安装

hadoop安装

既然hive是hadoop生态的成员,而且haive处理的数据存储在hdfs,分析的底层实现是mapreduce,程序执行是在Yarn。综合种种,我们都要先安装hadoop,关于hadoop可以参照前之前的文章:hadoop集群部署之集群配置(三)

环境变量设置

到hive官网下载要安装的hive版本,放到本地解压好,我这里是安装hive-3.1到ubuntu20.10系统下的/opt/module文件夹hadoop集群部署之hive安装(四)_第2张图片

下面对hive里面的文件做粗略说明
1.bin:保存常用命令,包括各种客户端的启动和服务的启动等等
2.conf:关于hive的所有配置文件都在里面,以后做hive的搭建主要就是修改这里面的内容
3.logs:日志收集文件夹,如果没有,可自行创建。
其他的不做说明,因为和安装没太大关系。

下面设置环境变量

vim /etc/profile.d/my_env.sh

增加如下的环境变量(你自己的hive放在哪里,路径就写哪里,不一定和我的一样)

#hive
export HIVE_HOME=/opt/module/hive-3.1.2
export PATH=$PATH:$HIVE_HOME/bin

之后刷新配置文件

source /etc/profile

这时候在终端窗口输入hive,如果结果如下,则表示环境变量配置成功

hive

结果
hadoop集群部署之hive安装(四)_第3张图片

解决jar包冲突

其实关于这个问题可以不解决,只是看着心烦而已。
跳转到hive文件夹下的lib目录

mv log4j-slf4j-impl2.10.0.jar log4j slf4j impl 2.10.0.bak

注意:你的log版本可能和我不一样,你只要保证前面的log4j-slf4j一样就行,修改那个文件就可以了

这时候基本上已经可以使用hive了,但是这时候元数据是存储在derby中,derby有很多问题,诸如不支持并发访问,也不支持多客户端访问等等,所以要更改为mysql作为源数据库,这里默认你安装好了mysql(网上有很多优秀的教程),安装好mysql后,将对应版本的mysql的jdbc驱动包拷贝到hive的lib目录下,我这里的版本是mysql-connector-java-8.0.25.jar

cp mysql-connector-java-8.0.25.jar /opt/module/hive/lib

配置文件的修改

在conf文件夹下新建hive-site.xml配置文件,添加内容如下:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>


<configuration>
	<!--jdbc 连接的 URL -->
	<property>
		<name>javax.jdo.option.ConnectionURL</name>
		<value>jdbc:mysql://hadoop100: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>942413</value>
	</property>

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


	<!--Hive 元数据存储授权 -->
	<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>
	<!-- 指定存储元数据要连接的地址 -->
<!-- 	<property>
		<name>hive.metastore.uris</name>
		<value>thrift://hadoop100:9083</value>
	</property> -->
	<!-- 指定hiveserver2连接的host -->
<!-- 	<property>
		<name>hive.server2.thrift.bind.host</name>
		<value>hadoop100</value>
	</property> -->
<!-- 	<property>
		<name>hive.server2.thrift.port</name>
		<value>10000</value>
	</property> -->
	<!--打印表头 -->
	<property>
		<name>hive.cli.print.header</name>
		<value>true</value>
	</property>	
	<!--打印当前库 -->
	<property>
		<name>hive.cli.print.current.db</name>
		<value>true</value>
	</property>		
</configuration>

下面对整个配置文件做个简单的说明:

	<!--jdbc 连接的 URL -->
	<property>
		<name>javax.jdo.option.ConnectionURL</name>
		<value>jdbc:mysql://hadoop100:3306/metastore?useSSL=false</value>
	</property>

这一部分主要是将元数据库设置为mysql,下的metastore,这里的hadoop100是我安装的mysql的服务器地址,3306是公认的mysql的端口地址,metastore,这个就是hive的的元数据存储到mysql的位置,他需要你自己在mysql中创建。
注意:这里元数据库名不一定叫metastore,你可以随意叫,创建的名字叫什么,这里就叫什么。下面截图给大家做个示例。

1.在mysql中创建metastore
hadoop集群部署之hive安装(四)_第4张图片

	<!--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>942413</value>
	</property>

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

以上主要指定,hive连接mysql时采用jdbc驱动,已经登录的用户为root,密码为自己的登录密码。

<!--Hive 默认在 HDFS 的工作目录 -->
	<property>
		<name>hive.metastore.warehouse.dir</name>
		<value>/user/hive/warehouse</value>
	</property>

以上主要指定的是hive创建放在hdfs中的位置是哪里(不写也行,因为默认的地址也是这一个)
hadoop集群部署之hive安装(四)_第5张图片

	<!-- 指定存储元数据要连接的地址 -->
<!-- 	<property>
		<name>hive.metastore.uris</name>
		<value>thrift://hadoop100:9083</value>
	</property> -->
	<!-- 指定hiveserver2连接的host -->
<!-- 	<property>
		<name>hive.server2.thrift.bind.host</name>
		<value>hadoop100</value>
	</property> -->
	<!-- Hive 默认在 HDFS 的工作目录 -->
<!-- 	<property>
		<name>hive.server2.thrift.port</name>
		<value>10000</value>
	</property> -->

以上是为hive开启一个服务,提供给用户去远程连接,而不需要进入客户端才能操作hive。
这里可以按需要配置,这里我的已经注释掉。

<!--打印表头 -->
	<property>
		<name>hive.cli.print.header</name>
		<value>true</value>
	</property>	
	<!--打印当前库 -->
	<property>
		<name>hive.cli.print.current.db</name>
		<value>true</value>
	</property>	

以上配置主要是为了进入客户端的时候,实时显示你所在的位置是哪个数据库下的哪个表而已,方便识别。
hadoop集群部署之hive安装(四)_第6张图片

log日志收集配置

修改conf下的hive-log4j2.properties.template文件

mv hive-log4j2.properties.template hive-log4j2.properties

修改hive-log4j2.properties里面的log路径
hadoop集群部署之hive安装(四)_第7张图片
在这里插入图片描述

其实以上就已经完全配置好了,但是如果你是选择了开启服务的模式,下面我也会提供一个启动服务的脚本。不做讲解,放到bin下,直接用就行。

#!/bin/bash
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

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 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

hive测试

最后测试一下是否配置成功
执行hive命令
hadoop集群部署之hive安装(四)_第8张图片
hadoop集群部署之hive安装(四)_第9张图片

metastore的补充

前面说了metastore在mysql下用于hive的元数据,我们从mysql端进入到metastore看看。

hadoop集群部署之hive安装(四)_第10张图片
我截图了一半,看到里面有一个DBS,这个表就是管理着hive中创建的数据库。
hadoop集群部署之hive安装(四)_第11张图片

再看看metastore中的表,还有一个叫TBLS
hadoop集群部署之hive安装(四)_第12张图片
打开TBLS看看
hadoop集群部署之hive安装(四)_第13张图片

最后追加一点补充:hive并不需要安装到整个集群的所有服务器,只需要安装到一台服务器上就可以,之所以不用所哟都安装,你可以理解为hive其实就是hadoop的一个客户端,他的数据存储是hdfs,计算是mr,资源分配是yarn,这些都已经在hadoop安装时分别安装到整个集群的所有服务器中了,所以hive并不需要安装到所有的服务器上。
好啦,本次关于hive的安装配置就到这里啦。

你可能感兴趣的:(hadoop,hive,hadoop)