首先讲讲hive是什么?hive本身是一个数据仓库工具,那既然是仓库,那就要存东西,**存什么东西呢?**存的是元数据(俗称metadata),那再问,**什么是元数据呢?**元数据并不是真实的数据,可以理解为是一种数据映射表,将非结构化的数据映射为结构化数据。
从上图可以看出,hive中的元数据,其实只是一张张的数据映射表,你可以理解为mysql中的表也是这个样子,本身也就是一些映射表,真实的数据其实是存放在hdfs中,每当我们在hive中进行查询的时候,会根据hive中的映射表最终在hdfs上找到真实的数据。
那再讲讲hive为什么会存在,意义在哪呢?
首先hive是由facebook开源的,用于海量数据的统计分析工作,这是它存在的初衷。
其次,hive是hadoop生态的一员,架构在hadoop之上,可以理解为其实hive就是hadoop的一个客户端,有了hive以后,我们不再需要写复杂的MR任务,只需要写HQL(和sql很像)语句,系统会自动将HQL语句翻译为MR任务提交给集群,然后依托yarn进行任务调度,这大大降低了开发难度。
你学过一点hive可能就知道,在查询语句上,hive和sql是非常相似的。那他们之间到底有什么区别呢?
其实除了查询语句之外,其他都不像。
在数据更新上,hive不建议经常改写,而数据库是经常增删改查的。
在延迟上,hive底层是mapreduce实现,以及查询数据时没有索引,数据规模大等等,导致执行时延迟要比数据库大很多。
在数据规模上,也要比数据库大很多。
所以二者之间可以说是差别很大。
既然hive是hadoop生态的成员,而且haive处理的数据存储在hdfs,分析的底层实现是mapreduce,程序执行是在Yarn。综合种种,我们都要先安装hadoop,关于hadoop可以参照前之前的文章:hadoop集群部署之集群配置(三)
到hive官网下载要安装的hive版本,放到本地解压好,我这里是安装hive-3.1到ubuntu20.10系统下的/opt/module文件夹
下面对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
其实关于这个问题可以不解决,只是看着心烦而已。
跳转到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,你可以随意叫,创建的名字叫什么,这里就叫什么。下面截图给大家做个示例。
<!--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中的位置是哪里(不写也行,因为默认的地址也是这一个)
<!-- 指定存储元数据要连接的地址 -->
<!-- <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>
以上配置主要是为了进入客户端的时候,实时显示你所在的位置是哪个数据库下的哪个表而已,方便识别。
修改conf下的hive-log4j2.properties.template文件
mv hive-log4j2.properties.template hive-log4j2.properties
修改hive-log4j2.properties里面的log路径
其实以上就已经完全配置好了,但是如果你是选择了开启服务的模式,下面我也会提供一个启动服务的脚本。不做讲解,放到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
前面说了metastore在mysql下用于hive的元数据,我们从mysql端进入到metastore看看。
我截图了一半,看到里面有一个DBS,这个表就是管理着hive中创建的数据库。
再看看metastore中的表,还有一个叫TBLS
打开TBLS看看
最后追加一点补充:hive并不需要安装到整个集群的所有服务器,只需要安装到一台服务器上就可以,之所以不用所哟都安装,你可以理解为hive其实就是hadoop的一个客户端,他的数据存储是hdfs,计算是mr,资源分配是yarn,这些都已经在hadoop安装时分别安装到整个集群的所有服务器中了,所以hive并不需要安装到所有的服务器上。
好啦,本次关于hive的安装配置就到这里啦。