Hive数据仓库工具

第1章 Hive入门

1.1 什么是Hive

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。

Hive本质是一个Hadoop客户端,用于HQL(Hive SQL转化成MapReduce程序

1.2 Hive架构原理

1.用户接口:Client 写sql的地方

2.元数据:Metastore。默认存储在自带的derby数据库中,由于derby数据库只支持单客户端访问,生产环境中为了多人开发,推荐使用MySQL存储Metastore

3.计算引擎:mr 可以更换hive on spark、 tez

4.hdfs 存储

第2章 Hive安装

2.1 Hive安装地址

1Hive官网地址http://hive.apache.org/

2文档查看地址https://cwiki.apache.org/confluence/display/Hive/GettingStarted

3下载地址http://archive.apache.org/dist/hive/

4githubhttps://github.com/apache/hive

 2.2 Hive安装部署

2.2.1 安装Hive

1)apache-hive-3.1.3-bin.tar.gz上传到Linux/opt/software目录下

2)解压apache-hive-3.1.3-bin.tar.gz/opt/module/目录下面

[wy@hadoop102 software]$ tar -zxvf /opt/software/apache-hive-3.1.3-bin.tar.gz -C /opt/module/

3)修改apache-hive-3.1.3-bin.tar.gz的名称为hive

[wy@hadoop102 software]$ mv /opt/module/apache-hive-3.1.3-bin/ /opt/module/hive

4)修改/etc/profile.d/my_env.sh添加环境变量

[wy@hadoop102 software]$ sudo vim /etc/profile.d/my_env.sh

(1)添加内容

#HIVE_HOME

export HIVE_HOME=/opt/module/hive

export PATH=$PATH:$HIVE_HOME/bin

(2)source一下

[wy@hadoop102 hive]$ source /etc/profile.d/my_env.sh

5)初始化元数据库(默认是derby数据库)

[wy@hadoop102 hive]$ bin/schematool -dbType derby -initSchema

 derby数据库的特点是同一时间只允许一个客户端访问。如果多个Hive客户端同时访问,就会报错。由于在企业开发中,都是多人协作开发,需要多客户端同时访问Hive,可以将Hive的元数据改为用MySQL存储,MySQL支持多客户端同时访问。

4)首先退出hive客户端。然后在Hive的安装目录下将derby.log和metastore_db删除,顺便将HDFS上目录删除

hive> quit;

[wy@hadoop102 hive]$ rm -rf derby.log metastore_db

[wy@hadoop102 hive]$ hadoop fs -rm -r /user

5)删除HDFS中/user/hive/warehouse/stu中数据

2.3 MySQL安装

2.3.1 安装MySQL

1)上传MySQL安装包以及MySQL驱动jar包

mysql-community-client-8.0.31-1.el7.x86_64.rpm

mysql-community-client-plugins-8.0.31-1.el7.x86_64.rpm

mysql-community-common-8.0.31-1.el7.x86_64.rpm

mysql-community-icu-data-files-8.0.31-1.el7.x86_64.rpm

mysql-community-libs-8.0.31-1.el7.x86_64.rpm

mysql-community-libs-compat-8.0.31-1.el7.x86_64.rpm

mysql-community-server-8.0.31-1.el7.x86_64.rpm

mysql-connector-j-8.0.31.jar

2)安装MySQL 

[wy@hadoop102 software]$ yum install -y *.rpm

3)启动MySQL

[wy@hadoop102 software]$ sudo systemctl start mysqld

4)更改MySQL密码级别

[wy@hadoop102 software]$ sudo vim /etc/my.cnf

# 在[mysqld]下面添加如下两行并保存

validate_password.length=4

validate_password.policy=0

# 保存过后重启MySQL

[wy@hadoop102 software]$ sudo systemctl start mysqld

5查看MySQL密码

[wy@hadoop102 software]$ sudo cat /var/log/mysqld.log | grep "temporary password" | awk '{print $NF}'

2.3.2 配置MySQL

配置主要是root用户 + 密码,在任何主机上都能登录MySQL数据库。

1)用刚刚查到的密码进入MySQL(如果报错,给密码加单引号)

[wy@hadoop102 software]$ mysql -uroot -p'password'

2设置简单好记的密码

mysql> set password=password("123456");

3允许MySQL以本地密码认证以兼容旧版JDBC驱动

mysql> alter user 'root'@'%' identified with mysql_native_password by '123456';

4进入MySQL

mysql> use mysql

5查询user

mysql> select user, host from user;

6修改userHost表内容修改为%

mysql> update user set host="%" where user="root";

7刷新

mysql> flush privileges;

8退出

mysql> quit;

 2.4 配置Hive元数据存储到MySQL

我们希望将Hive元数据写到MySQL的metastore数据库,MySQL默认没有meta store需要提前创建

2.4.1 配置元数据MySQL

1)新建Hive元数据库

#登录MySQL

[wy@hadoop102 software]$ mysql -uroot -p123456

#创建Hive元数据库

mysql> create database metastore;

mysql> quit;

2MySQLJDBC驱动拷贝到Hivelib目录下。

[wy@hadoop102 software]$ cp /opt/software/mysql-connector-j-8.0.31.jar $HIVE_HOME/lib

3)在$HIVE_HOME/conf目录下新建hive-site.xml文件

[wy@hadoop102 software]$ vim $HIVE_HOME/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://hadoop102:3306/metastore?useSSL=false&allowPublicKeyRetrieval=true&createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8</value>

    </property>    

    <!-- jdbc连接的Driver-->

    <property>

        <name>javax.jdo.option.ConnectionDriverName</name>

        <value>com.mysql.cj.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默认在HDFS的工作目录 -->

    <property>

        <name>hive.metastore.warehouse.dir</name>

        <value>/user/hive/warehouse</value>

</property>

</configuration>

5)初始化Hive元数据库(修改为采用MySQL存储元数据)

[wy@hadoop102 hive]$ bin/schematool -dbType mysql -initSchema -verbose

2.5 Hive服务部署 

2.5.1 hiveserver2服务

Hive的hiveserver2服务的作用是提供jdbc/odbc接口为用户提供远程访问Hive数据的功能,例如用户期望在个人电脑中访问远程服务中的Hive数据,就需要用到Hiveserver2。

生产环境,推荐开启用户模拟功能,因为开启后才能保证各用户之间的权限隔离。

hiveserver2部署

(1)Hadoop端配置

hivesever2的模拟用户功能,依赖于Hadoop提供的proxy user(代理用户功能),只有Hadoop中的代理用户才能模拟其他用户的身份访问Hadoop集群。因此,需要hiveserver2的启动用户设置为Hadoop的代理用户,配置方式如下:

修改配置文件core-site.xml,然后记得分发三台机器。

[wy@hadoop102 ~]$ cd $HADOOP_HOME/etc/hadoop

[wy@hadoop102 hadoop]$ vim core-site.xml

增加如下配置:

<!--配置所有节点的atguigu用户都可作为代理用户-->

<property>

    <name>hadoop.proxyuser.atguigu.hosts</name>

    <value>*</value>

</property>

<!--配置wy用户能够代理的用户组为任意组-->

<property>

    <name>hadoop.proxyuser.atguigu.groups</name>

    <value>*</value>

</property>

<!--配置wy用户能够代理的用户为任意用户-->

<property>

    <name>hadoop.proxyuser.atguigu.users</name>

    <value>*</value>

</property>

(2)Hive端配置

在hive-site.xml文件中添加如下配置信息。

[wy@hadoop102 conf]$ vim hive-site.xml

<!-- 指定hiveserver2连接的host -->

<property>

<name>hive.server2.thrift.bind.host</name>

<value>hadoop102</value>

</property>

<!-- 指定hiveserver2连接的端口号 -->

<property>

<name>hive.server2.thrift.port</name>

<value>10000</value>

</property>

2.5.2 metastore服务

Hive的metastore服务的作用是为Hive CLI或者Hiveserver2提供元数据访问接口。

1)metastore运行模式

metastore有两种运行模式,分别为嵌入式模式和独立服务模式。

2)编写脚本来管理服务的启动和关闭

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

第3分桶表

分区针对的是数据的存储路径,分桶针对的是数据文件。

分桶表的基本原理是,首先为每行数据计算一个指定字段的数据的hash值,然后模以一个指定的分桶数,最后将取模运算结果相同的行,写入同一个文件中,这个文件就称为一个分桶(bucket)。

4章 文件格式和压缩

text file默认使用的文件格式、orc一种列式存储的文件格式。、parquet、sequence file

第5章 HQL语法优化之Join优化

10.5.1 Join算法概述

1)Common Join ,一个mr

Common Join是Hive中最稳定的join算法,其通过一个MapReduce Job完成一个join操作。Map端负责读取join操作所需表的数据,并按照关联字段进行分区,通过Shuffle,将其发送到Reduce端,相同key的数据在Reduce端完成最终的Join操作。

2)Map Join 两个map

Map Join算法可以通过两个只有map阶段的Job完成一个join操作。其适用场景为大表join小表。若某join操作满足要求,则第一个Job会读取小表数据,将其制作为hash table,并上传至Hadoop分布式缓存(本质上是上传至HDFS)。第二个Job会先从分布式缓存中读取小表数据,并缓存在Map Task的内存中,然后扫描大表数据,这样在map端即可完成关联操作。

3)Bucket Map Join

Bucket Map Join是对Map Join算法的改进,其打破了Map Join只适用于大表join小表的限制,可用于大表join大表的场景。

Bucket Map Join的核心思想是:若能保证参与join的表均为分桶表,且关联字段为分桶字段,且其中一张表的分桶数量是另外一张表分桶数量的整数倍,就能保证参与join的两张表的分桶之间具有明确的关联关系,所以就可以在两表的分桶间进行Map Join操作了。这样一来,第二个Job的Map端就无需再缓存小表的全表数据了,而只需缓存其所需的分桶即可。

第6章HQL语法优化之数据倾斜

6.1 数据倾斜概述

数据倾斜问题,通常是指参与计算的数据分布不均,即某个key或者某些key的数据量远超其他key,导致在shuffle阶段,大量相同key的数据被发往同一个Reduce,进而导致该Reduce所需的时间远超其他Reduce,成为整个任务的瓶颈。

Hive中的数据倾斜常出现在分组聚合和join操作的场景中,下面分别介绍在上述两种场景下的优化思路。

6.2 分组聚合导致的数据倾斜

6.2.1 优化说明

前文提到过,Hive中未经优化的分组聚合,是通过一个MapReduce Job实现的。Map端负责读取数据,并按照分组字段分区,通过Shuffle,将数据发往Reduce端,各组数据在Reduce端完成最终的聚合运算。

如果group by分组字段的值分布不均,就可能导致大量相同的key进入同一Reduce,从而导致数据倾斜问题。

由分组聚合导致的数据倾斜问题,有以下两种解决思路:

1Map-Side聚合

开启Map-Side聚合后,数据会现在Map端完成部分聚合工作。这样一来即便原始数据是倾斜的,经过Map端的初步聚合后,发往Reduce的数据也就不再倾斜了。最佳状态下,Map-端聚合能完全屏蔽数据倾斜问题。

2Skew-GroupBy优化

Skew-GroupBy的原理是启动两个MR任务,第一个MR按照随机数分区,将数据分散发送到Reduce,完成部分聚合,第二个MR按照分组字段分区,完成最终聚合。

6.3 Join导致的数据倾斜

未经优化的join操作,默认是使用common join算法如果关联字段的值分布不均,就可能导致大量相同的key进入同一Reduce,从而导致数据倾斜问题。

1map join

使用map join算法,join操作仅在map端就能完成,没有shuffle操作,没有reduce阶段,自然不会产生reduce端的数据倾斜。该方案适用于大表join小表时发生数据倾斜的场景。

2skew join

skew join的原理是,为倾斜的大key单独启动一个map join任务进行计算,其余key进行正常的common join。

第7章 HQL语法优化之任务并行度

7.1 优化说明

对于一个分布式的计算任务而言,设置一个合适的并行度十分重要。Hive的计算任务由MapReduce完成,故并行度的调整需要分为Map端和Reduce端。

7.1.1 Map端并行度

Map端的并行度,也就是Map的个数。是由输入文件的切片数决定的。一般情况下,Map端的并行度无需手动调整。

以下特殊情况可考虑调整map端并行度:

1)查询的表中存在大量小文件

按照Hadoop默认的切片策略,一个小文件会单独启动一个map task负责计算。若查询的表中存在大量小文件,则会启动大量map task,造成计算资源的浪费。这种情况下,可以使用Hive提供的CombineHiveInputFormat,多个小文件合并为一个切片,从而控制map task个数。

2)map端有复杂的查询逻辑

若SQL语句中有正则替换、json解析等复杂耗时的查询逻辑时,map端的计算会相对慢一些。若想加快计算速度,在计算资源充足的情况下,可考虑增大map端的并行度,令map task多一些,每个map task计算的数据少一些。

7.1.2 Reduce端并行度

Reduce端的并行度,也就是Reduce个数。相对来说,更需要关注。Reduce端的并行度,可由用户自己指定,也可由Hive自行根据该MR Job输入的文件大小进行估算。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值