三分钟解析大数据数仓基石 - Hive3.1.2

294 阅读12分钟

Hive 3.1.2

image-20201106221352661

Hive是基于 Hadoop 的一个【数据仓库工具】,可以将结构化和半结构化的数据文件映射为一张数据库表,并提供简单的 sql 查询功能

Hive的基本概念

上海优极限线下JAVA大数据课程,0元入学,保底年薪18W,薪资达标再付费

Hive简介

Hive本质是将SQL转换为MapReduce的任务进行运算,底层由HDFS来提供数据存储,说白了hive可以理解为一个将SQL转换为MapReduce的任务的工具,甚至更近一步可以说hive就是一个MapReduce客户端

思考:计算文件user.txt中张三出现几次,使用mapreduce怎么写,然后再比照下图的hive的实现过程

1589792202412

  • 为什么使用Hive

    • 直接不使用hadoop

      1)人员学习成本太高

      2)项目要求周期太短

      3)MapReduce实现复杂查询逻辑开发难度太大

    • 为什么要使用Hive

      1)操作接口采用类SQL语法,提供快速开发能力

      2)免去了写MapReduce,减少开发人员学历成本

      3)功能扩展很方便

  • Hive的特点

    • 可扩展性

      Hive可以自由的扩展集群的规模,一般情况下不需要重启服务

    • 延伸性

      Hive支持自定义函数,用户可以根据自己的需要来实现自己的函数

    • 容错

      即使节点出现错误,SQL仍然可以完成执行

  • Hive优缺点

    • 优点

      1. 操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。
      2. 避免了去写MapReduce,减少开发人员的学习成本。
      3. Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合。
      4. Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。
      5. Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
      6. 集群可自由拓展并且具有良好的容错性,节点出现问题SQL仍可完成执行。
    • 缺点

      1. Hive的HQL表达能力有限

      (1)迭代式算法无法表达

      (2)数据挖掘方面不擅长

      1. Hive的效率比较低

      (1)Hive自动生成的MapReduce作业,通常情况下不够智能化

      (2)Hive调优比较困难,粒度较粗

  • Hive和传统数据库对比

1589795784916

  • Hive应用场景

    • 日志分析:大部分互联网公司使用hive进行日志分析,包括百度、淘宝等。

      • 统计网站一个时间段内的pv、uv
      • 多维度数据分析
    • 海量结构化数据离线分析

Hive架构

1589793721196

Client

Hive允许client连接的方式有三个CLI(hive shell)、JDBC/ODBC(java访问hive)、WEBUI(浏览器访问hive)。JDBC访问时中间件Thrift软件框架,跨语言服务开发。DDL DQL DML,整体仿写一套SQL语句。

  • client--需要下载安装包

  • JDBC/ODBC 也可以连接到Hive

    • 现在主流都在倡导第二种 HiveServer2/beeline
    • 做基于用户名和密码安全的一个校验
  • Web Gui

    • hive给我们提供了一套简单的web页面
    • 我们可以通过这套web页面访问hive
    • 做的太简陋了

Metastore

元数据包括表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等。

  • 一般需要借助于其他的数据载体(数据库)
  • 主要用于存放数据库的建表语句等信息
  • 推荐使用Mysql数据库存放数据
  • 连接数据库需要提供:uri username password driver

Driver

元数据存储在数据库中,默认存在自带的derby数据库(单用户局限性)中,推荐使用Mysql进行存储。

(1) 解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如ANTLR;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。

(2) 编译器(Physical Plan):将AST编译生成逻辑执行计划。

(3) 优化器(Query Optimizer):对逻辑执行计划进行优化。

(4) 执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。

数据处理

Hive的数据存储在HDFS中,计算由MapReduce完成。HDFS和MapReduce是源码级别上的整合,两者结合最佳。解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。

Hive的安装

节点\功能metastorehiveserver2client
node01**
node02
node03*

PS: 安装前 请确认当前集群已经安装了Mysql数据库和Hadoop的Ha+Yarn

下载上传解压

  • 下载地址

    • archive.apache.org/dist/hive/
    • [root@node01 ~]# tar -zxvf apache-hive-3.1.2-bin.tar.gz 
      [root@node01 ~]# mv apache-hive-3.1.2-bin /opt/yjx/
      [root@node01 ~]# cd /opt/yjx/apache-hive-3.1.2-bin/conf
      

修改配置文件

  • 配置hive-env.sh

    • [root@node01 conf]# cp hive-env.sh.template hive-env.sh
    • [root@node01 conf]# vim hive-env.sh
    • export HADOOP_HOME=/opt/yjx/hadoop-3.1.2/
      export HIVE_CONF_DIR=/opt/yjx/apache-hive-3.1.2-bin/conf 
      export HIVE_AUX_JARS_PATH=/opt/yjx/apache-hive-3.1.2-bin/lib
      
  • 创建hive-site.xml

    • [root@node01 conf]# cp hive-default.xml.template hive-site.xml
    • [root@node01 conf]# vim hive-site.xml
    • 删除多余的配置文件 6897dd
    • <!-- 数据库相关配置 -->
      <property>
          <name>javax.jdo.option.ConnectionURL</name>
          <value>jdbc:mysql://node01:3306/hive?createDatabaseIfNotExist=true</value>
      </property>
      <property>
          <name>javax.jdo.option.ConnectionDriverName</name>
          <value>com.mysql.jdbc.Driver</value>
      </property>
      <property>
          <name>javax.jdo.option.ConnectionUserName</name>
          <value>root</value>
      </property>
      <property>
          <name>javax.jdo.option.ConnectionPassword</name>
          <value>123456</value>
      </property>
      <!-- 自动创建表 -->
      <property>
          <name>datanucleus.schema.autoCreateAll</name>
          <value>true</value>
      </property>
      <!-- 元数据校验 -->
      <property>
          <name>hive.metastore.schema.verification</name>
          <value>false</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><!-- hive server -->
      <property>
          <name>hive.server2.webui.host</name>
          <value>node01</value>
      </property>
      <property>
          <name>hive.server2.webui.port</name>
          <value>10002</value>
      </property><!-- 数据存储位置 -->
      <property>
          <name>hive.metastore.warehouse.dir</name>
          <value>/hive/warehouse</value>
      </property><!--指定hive.metastore.uris的port.为了启动metastore服务的时候不用指定端口-->
      <property>
          <name>hive.metastore.uris</name>
          <value>thrift://node01:9083</value>
      </property>

    注意:如果MySQL数据库是8.0那么<value>com.mysql.jdbc.Driver</value>要改成<value> com.mysql.cj.jdbc.Driver</value>

  • 修改core-site.xml

    • [root@node01 conf]# vim /opt/yjx/hadoop-3.1.2/etc/hadoop/core-site.xml
    • 后面添加配置信息
    • <!--该参数表示可以通过httpfs接口hdfs的ip地址限制-->
      <property>
          <name>hadoop.proxyuser.root.hosts</name>
          <value>*</value>
      </property>
      <!--通过httpfs接口访问的用户获得的群组身份-->
      <property>
          <name>hadoop.proxyuser.root.groups</name>
          <value>*</value>
      </property>
      

配置日志组件

  • 创建文件目录

    • [root@node01 ~]# mkdir -p /opt/yjx/apache-hive-3.1.2-bin/logs
    • [root@node01 conf]# cp hive-log4j2.properties.template hive-log4j2.properties
    • [root@node01 conf]# vim hive-log4j2.properties
    • 24property.hive.log.dir = /opt/yjx/apache-hive-3.1.2-bin/logs
      

添加驱动包

  • Mysql驱动添加到hive的lib目录下(注意数据库的版本)

    [root@node01 ~] mv ~/mysql-connector-java-5.1.32-bin.jar /opt/yjx/apache-hive-3.1.2-bin/lib/
    # 如果是8.0的数据库,那么
    [root@node01 ~] mv ~/mysql-connector-java-8.0.20.jar /opt/yjx/apache-hive-3.1.2-bin/lib/
    
  • Guava包

    • 首先要删除hadoop中的guava-*.jar包
    • [root@node01 ~]# rm -rf /opt/yjx/hadoop-3.1.2/share/hadoop/common/lib/guava-*.jar
      [root@node01 ~]# rm -rf /opt/yjx/hadoop-3.1.2/share/hadoop/hdfs/lib/guava-*.jar
      
    • 将Hive的Guava拷贝给Hadoop
    • [root@node01 ~]# cp /opt/yjx/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/yjx/hadoop-3.1.2/share/hadoop/common/lib/
      [root@node01 ~]# cp /opt/yjx/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/yjx/hadoop-3.1.2/share/hadoop/hdfs/lib/
      

配置环境变量

上海优极限线下JAVA大数据课程,0元入学,保底年薪18W,薪资达标再付费

  • vim /etc/profile

    • export HIVE_HOME=/opt/yjx/apache-hive-3.1.2-bin
      export PATH=$HIVE_HOME/bin:$PATH
      

拷贝到其他节点

  • hive文件夹

    • [root@node02 ~]# scp -r root@node01:/opt/yjx/apache-hive-3.1.2-bin /opt/yjx/
      [root@node03 ~]# scp -r root@node01:/opt/yjx/apache-hive-3.1.2-bin /opt/yjx/
      
  • 环境变量

    • [root@node01 ~]# scp /etc/profile root@node02:/etc/profile
      [root@node01 ~]# scp /etc/profile root@node03:/etc/profile
      
    • 【123】source /etc/profile
  • core-stie.xml

    • [root@node01 ~]# scp /opt/yjx/hadoop-3.1.2/etc/hadoop/core-site.xml root@node02:/opt/yjx/hadoop-3.1.2/etc/hadoop/
      [root@node01 ~]# scp /opt/yjx/hadoop-3.1.2/etc/hadoop/core-site.xml root@node03:/opt/yjx/hadoop-3.1.2/etc/hadoop/
      
  • jar包

    • [root@node02 ~]# rm -rf /opt/yjx/hadoop-3.1.2/share/hadoop/common/lib/guava-*.jar
      [root@node02 ~]# rm -rf /opt/yjx/hadoop-3.1.2/share/hadoop/hdfs/lib/guava-*.jar
      [root@node03 ~]# rm -rf /opt/yjx/hadoop-3.1.2/share/hadoop/common/lib/guava-*.jar
      [root@node03 ~]# rm -rf /opt/yjx/hadoop-3.1.2/share/hadoop/hdfs/lib/guava-*.jar
      ​
      [root@node02 ~]# cp /opt/yjx/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/yjx/hadoop-3.1.2/share/hadoop/common/lib/
      [root@node02 ~]# cp /opt/yjx/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/yjx/hadoop-3.1.2/share/hadoop/hdfs/lib/
      ​
      [root@node03 ~]# cp /opt/yjx/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/yjx/hadoop-3.1.2/share/hadoop/common/lib/
      [root@node03 ~]# cp /opt/yjx/apache-hive-3.1.2-bin/lib/guava-*.jar /opt/yjx/hadoop-3.1.2/share/hadoop/hdfs/lib/
      

客户端配置文件

  • 选取node03为客户端节点

    • [3] vim /opt/yjx/apache-hive-3.1.2-bin/conf/hive-site.xml
    • <property>
          <name>hive.metastore.warehouse.dir</name>
          <value>/hive/warehouse</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>
      <property>
          <name>hive.metastore.schema.verification</name>
          <value>false</value>
      </property>
      <property>
          <name>datanucleus.schema.autoCreateAll</name>
          <value>true</value>
      </property>
      <!--指定hive.metastore.uris的port.为了启动metastore服务的时候不用指定端口-->
      <!--hive ==service metastore -p 9083 & | hive ==service metastore-->
      <property>
          <name>hive.metastore.uris</name>
          <value>thrift://node01:9083</value>
      </property>
      

启动集群

  • 启动Zookeeper

    • 【123】zkServer.sh start
  • 启动Hdfs+Yarn

    • [root@node01 ~]# start-all.sh
  • 初始化数据库

    • [root@node01 ~]# schematool -dbType mysql -initSchema
    • image-20201111202011359
    • image-20201111202030606
  • 启动Hive

    • 启动服务器 二选一

      • [root@node01 ~]# hive --service metastore
      • [root@node01 ~]# nohup hive --service metastore > /dev/null 2>&1 &
    • [root@node03 ~]# hive

  • 启动HiveServer2

    • 启动服务器 二选一

      • nohup hive --service metastore > /dev/null 2>&1 &
      • [root@node01 ~]# hiveserver2
      • [root@node01 ~]# nohup hiveserver2 > /dev/null 2>&1 &
    • [root@node03 ~]# beeline -u jdbc:hive2://node01:10000 -n root

Hive的三种交互方式

1)第一种交互方式

shell交互Hive,用命令hive启动一个hive的shell命令行,在命令行中输入sql或者命令来和Hive交互。

服务端启动metastore服务:nohup hive --service metastore > /dev/null 2>&1 &
进入命令:hive
退出命令行:quit;

2)第二种交互方式

Hive启动为一个服务器,对外提供服务,其他机器可以通过客户端通过协议连接到服务器,来完成访问操作,这是生产环境用法最多的

hadoop fs -chmod -R 777 /yjx
​
服务端启动hiveserver2服务:
nohup hive --service metastore > /dev/null 2>&1 &
nohup hiveserver2 > /dev/null 2>&1 &
​
需要稍等一下,启动服务需要时间:
​
进入命令:1)先执行beeline,在执行! connect jdbc:hive2://node01:10000 
        2)或者直接执行 beeline -u jdbc:hive2://node01:10000 -n root
退出命令行:!exit

3)第三种交互方式

  • 使用 –e 参数来直接执行hql的语句
bin/hive -e "show databases;"
  • 使用 –f 参数通过指定文本文件来执行hql的语句
vim hive.sql
use myhive;
select * from test;

保存退出

hive -f hive.sql

特点:执行完sql后,回到linux命令行。

4)在hive cli和beeline cli的区别

1591354514255

  • metastore服务实际上就是一种thrift服务,通过它我们可以获取到hive元数据,并且通过thrift获取原数据的方式,屏蔽了数据库访问需要驱动,url,用户名,密码等等细节。 HiveServer2(HS2)是一个服务端接口,使远程客户端可以执行对Hive的查询并返回结果。一般来讲,我们认为HiveServer2是用来提交查询的,也就是用来访问数据的。 而MetaStore才是用来访问元数据的。
  • beeline cli优化了命令行界面

Hive元数据

上海优极限线下JAVA大数据课程,0元入学,保底年薪18W,薪资达标再付费

Hive元数据库中一些重要的表结构及用途,方便Impala、SparkSQL、Hive等组件访问元数据库的理解。

1、存储Hive版本的元数据表(VERSION)

该表比较简单,但很重要。

VER_IDSCHEMA_VERSIONVERSION_COMMENT
ID主键Hive版本版本说明
11.1.0Set by MetaStore

如果该表出现问题,根本进入不了Hive-Cli。比如该表不存在,当启动Hive-Cli时候,就会报错”Table ‘hive.version’ doesn’t exist”。

2、Hive数据库相关的元数据表(DBS、DATABASE_PARAMS)

DBS:该表存储Hive中所有数据库的基本信息,字段如下:

表字段说明示例数据
DB_ID数据库ID1
DESC数据库描述Default Hive database
DB_LOCATION_URI数据HDFS路径hdfs://193.168.1.75:9000/test-warehouse
NAME数据库名default
OWNER_NAME数据库所有者用户名public
OWNER_TYPE所有者角色ROLE
DATABASE_PARAMS:该表存储数据库的相关参数,在CREATE DATABASE时候用WITH DBPROPERTIES(property_name=property_value, …)指定的参数。
表字段说明示例数据
DB_ID数据库ID1
PARAM_KEY参数名createdby
PARAM_VALUE参数值root

DBS和DATABASE_PARAMS这两张表通过DB_ID字段关联。 3、Hive表和视图相关的元数据表

主要有TBLS、TABLE_PARAMS、TBL_PRIVS,这三张表通过TBL_ID关联。

TBLS:该表中存储Hive表,视图,索引表的基本信息

表字段说明示例数据
TBL_ID表ID21
CREATE_TIME创建时间1447675704
DB_ID数据库ID1
LAST_ACCESS_TIME上次访问时间1447675704
OWNER所有者root
RETENTION保留字段0
SD_ID序列化配置信息41,对应SDS表中的SD_ID
TBL_NAME表名ex_detail_ufdr_30streaming
TBL_TYPE表类型EXTERNAL_TABLE
VIEW_EXPANDED_TEXT视图的详细HQL语句
VIEW_ORIGINAL_TEXT视图的原始HQL语句

TABLE_PARAMS:该表存储表/视图的属性信息

表字段说明示例数据
TBL_ID表ID1
PARAM_KEY属性名totalSize,numRows,EXTERNAL
PARAM_VALUE属性值970107336、21231028、TRUE
TBL_PRIVS:该表存储表/视图的授权信息
表字段说明示例数据
TBL_GRANT_ID授权ID1
CREATE_TIME授权时间1436320455
GRANT_OPTION0
GRANTOR授权执行用户root
GRANTOR_TYPE授权者类型USER
PRINCIPAL_NAME被授权用户username
PRINCIPAL_TYPE被授权用户类型USER
TBL_PRIV权限Select、Alter
TBL_ID表ID21,对应TBLS表的TBL_ID

4、Hive文件存储信息相关的元数据表

主要涉及SDS、SD_PARAMS、SERDES、SERDE_PARAMS,由于HDFS支持的文件格式很多,而建Hive表时候也可以指定各种文件格式,Hive在将HQL解析成MapReduce时候,需要知道去哪里,使用哪种格式去读写HDFS文件,而这些信息就保存在这几张表中。

SDS:

该表保存文件存储的基本信息,如INPUT_FORMAT、OUTPUT_FORMAT、是否压缩等。TBLS表中的SD_ID与该表关联,可以获取Hive表的存储信息。

表字段说明示例数据
SD_ID存储信息ID41
CD_ID字段信息ID21,对应CDS表
INPUT_FORMAT文件输入格式org.apache.hadoop.mapred.TextInputFormat
IS_COMPRESSED是否压缩0
IS_STOREDASSUBDIRECTORIES是否以子目录存储0
LOCATIONHDFS路径hdfs://193.168.1.75:9000/detail _ufdr_streaming_test
NUM_BUCKETS分桶数量0
OUTPUT_FORMAT文件输出格式org.apache.hadoop.hive.ql.io.H iveIgnoreKeyTextOutputFormat
SERDE_ID序列化类ID41,对应SERDES表

SD_PARAMS: 该表存储Hive存储的属性信息,在创建表时候使用STORED BY ‘storage.handler.class.name’ [WITH SERDEPROPERTIES (…)指定。

表字段说明示例数据
SD_ID存储配置ID41
PARAM_KEY存储属性名
PARAM_VALUE存储属性值

SERDES:该表存储序列化使用的类信息

表字段说明示例数据
SERDE_ID序列化类配置ID41
NAME序列化类别名NULL
SLIB序列化类org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

SERDE_PARAMS:该表存储序列化的一些属性、格式信息,比如:行、列分隔符

表字段说明示例数据
SERDE_ID序列化类配置ID41
PARAM_KEY属性名field.delim
PARAM_VALUE属性值

5、Hive表字段相关的元数据表 主要涉及COLUMNS_V2

COLUMNS_V2:该表存储表对应的字段信息

表字段说明示例数据
CD_ID字段信息ID21
COMMENT字段注释NULL
COLUMN_NAME字段名air_port_duration
TYPE_NAME字段类型bigint
INTEGER_IDX字段顺序119

6、Hive表分分区相关的元数据表

主要涉及PARTITIONS、PARTITION_KEYS、PARTITION_KEY_VALS、PARTITION_PARAMS

PARTITIONS:该表存储表分区的基本信息

表字段说明示例数据
PART_ID分区ID21
CREATE_TIME分区创建时间1450861405
LAST_ACCESS_TIME最后一次访问时间0
PART_NAME分区名hour=15/last_msisdn=0
SD_ID分区存储ID43
TBL_ID表ID22
LINK_TARGET_IDNULL

PARTITION_KEYS:该表存储分区的字段信息

表字段说明示例数据
TBL_ID表ID22
PKEY_COMMENT分区字段说明NULL
PKEY_NAME分区字段名hour
PKEY_TYPE分区字段类型int
INTEGER_IDX分区字段顺序0

PARTITION_KEY_VALS:该表存储分区字段值

表字段说明示例数据
PART_ID分区ID21
PART_KEY_VAL分区字段值0
INTEGER_IDX分区字段值顺序1

PARTITION_PARAMS:该表存储分区的属性信息

表字段说明示例数据
PART_ID分区ID21
PARAM_KEY分区属性名numFiles,numRows
PARAM_VALUE分区属性值1,502195

6、其他不常用的元数据表

DB_PRIVS:数据库权限信息表。通过GRANT语句对数据库授权后,将会在这里存储。

IDXS:索引表,存储Hive索引相关的元数据

INDEX_PARAMS:索引相关的属性信息

TBL_COL_STATS:表字段的统计信息。使用ANALYZE语句对表字段分析后记录在这里

TBL_COL_PRIVS:表字段的授权信息

PART_PRIVS:分区的授权信息

PART_COL_PRIVS:分区字段的权限信息

PART_COL_STATS:分区字段的统计信息

FUNCS:用户注册的函数信息

FUNC_RU:用户注册函数的资源信息

上海优极限线下JAVA大数据课程,0元入学,保底年薪18W,薪资达标再付费