• hive 知识总结


    ​编辑

    01 hive 介绍与安装

    1 hive介绍与原理分析

    Hive是一个基于Hadoop的开源数据仓库工具,用于存储和处理海量结构化数据。它是Facebook 2008年8月开源的一个数据仓库框架,提供了类似于SQL语法的HQL(hiveSQL)语句作为数据访问接口。

    1.1 hive的优缺点#

    优点:

    1)Hive 使用类SQL 查询语法, 最大限度的实现了和SQL标准的兼容,大大降低了传统数据分析人员处理大数据的难度

    2)使用JDBC 接口,开发人员更易开发应用;

    3)以MR 作为计算引擎、HDFS 作为存储系统,为超大数据集设计的计算/ 扩展能力;

    4)统一的元数据管理(Derby、MySql等),并可与Pig 、spark等共享;

    file

    元数据:hive表所对应的字段、属性还有表所对应存储的HDFS目录。

    缺点:

    1)Hive 的HQL 表达的能力有限,比如不支持UPDATE、非等值连接、DELETE、INSERT单条等;

    insert单条代表的是 创建一个文件。

    2)由于Hive自动生成MapReduce 作业, HQL 调优困难;

    3)粒度较粗,可控性差,是因为数据是读的时候进行类型的转换,mysql关系型数据是在写入的时候就检查了数据的类型。

    4)hive生成MapReduce作业,高延迟,不适合实时查询。

    1.2 与关系数据库的区别#

    1)hive和关系数据库存储文件的系统不同,hive使用的是hadoop的HDFS(hadoop的分布式文件系统),关系数据库则是服务器本地的文件系统;

    2)hive使用mapreduce做运算,与传统数据库相比运算数据规模要大得多;

    3)关系数据库都是为实时查询的业务进行设计的,而hive则是为海量数据做数据统计分析的,实时性很差;实时性差导致hive的应用场景和关系数据库有很大的区别;

    4)Hive很容易扩展自己的存储能力和计算能力,这个是继承hadoop的,而关系数据库在这个方面要比Hive差很多。

    Hive关系型数据库
    查询语言HQLSQL
    数据存储HDFSRaw Device or Local FS
    执行MapReduce spark数据库引擎
    数据存储校验存储不校验存储校验
    可扩展性有限
    执行延迟
    处理数据规模

    1.3 hive架构#

    file

    服务端组件:

    Driver组件:该组件包括Complier(编译)、Optimizer(优化)和Executor(执行),它的作用是将HiveQL(类SQL)语句进行解析、编译优化,生成执行计划,然后调用底层的MapReduce计算框架。

    Metastore组件:元数据服务组件,这个组件存取Hive的元数据,Hive的元数据存储在关系数据库里,Hive支持的关系数据库有Derby和Mysql。作用是:客户端连接metastore服务,metastore再去连接MySQL数据库来存取元数据。

    HiveServer2服务:HiveServer2是Facebook开发的一个软件框架,它用来进行可扩展且跨语言的服务的开发,Hive集成了该服务,能让不同的编程语言调用Hive的接口。还可以做权限管理。

    客户端组件:

    CLI:Command Line Interface,命令行接口。

    JDBC/ODBC:Hive架构的JDBC和ODBC接口是建立在HiveServer2客户端之上。

    WEBGUI:Hive客户端提供了一种通过网页的方式访问Hive所提供的服务。这个接口对应Hive的HWI组件(Hive Web Interface),使用前要启动HWI服务。

    1.4 Hive查询的执行过程#

    file

    1)Execute Query:hive界面如命令行或Web UI将查询发送到Driver(任何数据库驱动程序如JDBC、ODBC,等等)来执行。

    2)Get Plan:Driver根据查询编译器解析query语句,验证query语句的语法,查询计划或者查询条件。

    3)Get Metadata:编译器将元数据请求发送给Metastore(数据库)。

    4)Send Metadata:Metastore将元数据作为响应发送给编译器。

    5)Send Plan:编译器检查要求和重新发送Driver的计划。到这里,查询的解析和编译完成。

    6)Execute Plan:Driver将执行计划发送到执行引擎。

    6.1)Execute Job:hadoop内部执行的是mapreduce工作过程,任务执行引擎发送一个任务到资源管理节点(resourcemanager),资源管理器分配该任务到任务节点,由任务节点上开始执行mapreduce任务。

    6.1)Metadata Ops:在执行引擎发送任务的同时,对hive的元数据进行相应操作。

    7)Fetch Result:执行引擎接收数据节点(data node)的结果。

    8)Send Results:执行引擎发送这些合成值到Driver。

    9)Send Results:Driver将结果发送到hive接口。

    2 hive 安装

    安装hive可以使用已经搭建好的hadoop集群,或者海牛实验室的公用hadoop组件

    薪牛老师的hadoop完全分布式镜像环境http://cloud.hainiubl.com/#/privateImageDetail?id=2919&imageType=private,可以直接添加镜像使用。

    2.1 在nn1节点上安装MYSQL#

    下载地址:MySQL :: Download MySQL Community Server (Archived Versions)

    1. # 由于网络原因,本课程采用离线安装方式
    2. # 解压安装包
    3. mkdir -p /opt/tools/mysql
    4. tar -xf mysql-5.7.22-1.el7.x86_64.rpm-bundle.tar -C /opt/tools/mysql
    5. # 删除系统自带的MySQL-libs
    6. yum remove -y mysql-libs
    7. # 安装server时要依赖
    8. yum install -y net-tools
    9. # 离线安装
    10. rpm -vih /opt/tools/mysql/mysql-community-common-5.7.22-1.el7.x86_64.rpm
    11. rpm -vih /opt/tools/mysql/mysql-community-libs-5.7.22-1.el7.x86_64.rpm
    12. rpm -vih /opt/tools/mysql/mysql-community-client-5.7.22-1.el7.x86_64.rpm
    13. rpm -vih /opt/tools/mysql/mysql-community-server-5.7.22-1.el7.x86_64.rpm
    14. rpm -ivh /opt/tools/mysql/mysql-community-libs-compat-5.7.22-1.el7.x86_64.rpm
    15. # 启动MySQL
    16. systemctl start mysqld
    17. systemctl status mysqld
    18. systemctl enable mysqld
    19. # cat /var/log/mysqld.log | grep password 查看初始化密码
    20. # 登录
    21. mysql -uroot -p
    22. # 输入初始化密码
    23. # 设置校验密码的长度
    24. set global validate_password_policy=LOW;
    25. # 修改密码
    26. set password=PASSWORD('12345678');
    27. # 修改my.cnf,默认在/etc/my.cnf,执行:vim /etc/my.cnf,添加如下内容:
    28. [client]
    29. default-character-set=utf8
    30. [mysql]
    31. default-character-set=utf8
    32. [mysqld]
    33. character_set_server=utf8
    34. # 重启生效
    35. systemctl restart mysqld
    36. # 对外开放权限
    37. set global validate_password_policy=LOW;
    38. grant all privileges on *.* to 'root'@'%' identified by '12345678';
    39. flush privileges;

    2.2 安装hive#

    1)root 用户上传并解压hive的tar包

    1. #解压到/usr/local/目录下
    2. tar -xzf apache-hive-3.1.3-bin.tar.gz -C /usr/local/

    file

    2)创建软链接

    ln -s /usr/local/apache-hive-3.1.3-bin /usr/local/hive

    file

    3)修改/usr/local/hive/apache-hive-3.1.3-bin目录所有者

    chown -R hadoop:hadoop /usr/local/apache-hive-3.1.3-bin

    file

    4)配置环境变量

    增加HIVE_HOME和HIVE_CONF_DIR

    1. export HIVE_HOME=/usr/local/hive
    2. export HIVE_CONF_DIR=/usr/local/hive/conf
    3. export PATH=$PATH:$HIVE_HOME/bin
    4. #更新配置
    5. source /etc/profile

    5)修改配置文件

    切换到hadoop用户,拷贝/usr/local/hive/conf目录下的hive-default.xml.template改名为hive-site.xml

    file

    1. #拷贝配置文件
    2. cp hive-default.xml.template hive-site.xml
    3. #对hive-env.sh.template改名
    4. mv hive-env.sh.template hive-env.sh
    5. #对hive-log4j2.properties.template改名
    6. mv hive-log4j2.properties.template hive-log4j2.properties

    file

    修改hive-site.xml

    1. <configuration>
    2. <!-- 数据库 start -->
    3. <property>
    4. <name>javax.jdo.option.ConnectionURL</name>
    5. <value>jdbc:mysql://nn1:3306/hive_meta?useSSL=false</value>
    6. <description>mysql连接</description>
    7. </property>
    8. <property>
    9. <name>javax.jdo.option.ConnectionDriverName</name>
    10. <value>com.mysql.jdbc.Driver</value>
    11. <description>mysql驱动</description>
    12. </property>
    13. <property>
    14. <name>javax.jdo.option.ConnectionUserName</name>
    15. <value>hive</value>
    16. <description>数据库使用用户名</description>
    17. </property>
    18. <property>
    19. <name>javax.jdo.option.ConnectionPassword</name>
    20. <value>12345678</value>
    21. <description>数据库密码</description>
    22. </property>
    23. <!-- 数据库 end -->
    24. <property>
    25. <name>hive.metastore.warehouse.dir</name>
    26. <value>/hive/warehouse</value>
    27. <description>hive使用的HDFS目录</description>
    28. </property>
    29. <property>
    30. <name>hive.cli.print.current.db</name>
    31. <value>true</value>
    32. </property>
    33. <!-- 其它 end -->
    34. </configuration>

    6)在mysql中创建hive用的数据库和hive用户

    1. --登录mysql
    2. mysql -uroot -p'12345678'
    3. --创建hive用户
    4. CREATE USER 'hive'@'%' IDENTIFIED BY '12345678';
    5. --在mysql中创建hive_meta数据库
    6. create database hive_meta default charset utf8 collate utf8_general_ci;
    7. --给hive用户增加hive_meta数据库权限
    8. grant all privileges on hive_meta.* to 'hive'@'%' identified by '12345678';
    9. --更新
    10. flush privileges;

    7)拷贝mysql驱动jar 到/usr/local/hive/lib/

    cp /public/software/database/mysql-connector-java-5.1.49.jar /usr/local/hive/lib/

    file

    8)删除冲突的log4j

    rm -f /usr/local/hive/lib/log4j-slf4j-impl-2.4.1.jar

    9)hive初始化mysql

    schematool -dbType mysql -initSchema

    报错:

    file

    原因:查看该jar包在hadoop和hive中的版本信息

    file

    删除hive自带的guava jar包

    file

    rm -rf guava-19.0.jar

    file

    10)在客户端用hive用户 连接 hive的元数据库hive_meta

    file

    2.2.1 配置hiveserver2服务#

    file

    修改/usr/local/hadoop/etc/hadoop/core-site.xml 开启hadoop代理功能

    1. <property>
    2. <name>hadoop.proxyuser.hadoop.groups</name>
    3. <value>*</value>
    4. <description>配置hadoop(超级用户)允许通过代理用户所属组</description>
    5. </property>
    6. <property>
    7. <name>hadoop.proxyuser.hadoop.hosts</name>
    8. <value>nn1</value>
    9. <description>配置hadoop(超级用户)允许通过代理访问的主机节点</description>
    10. </property>
    11. <property>
    12. <name>hadoop.proxyuser.hadoop.users</name>
    13. <value>*</value>
    14. </property>

    修改hive-site.xml 添加hiveserver2服务

    1. <property>
    2. <name>hive.server2.thrift.bind.host</name>
    3. <value>nn1</value>
    4. <description>hive开启的thriftServer地址</description>
    5. </property>
    6. <property>
    7. <name>hive.server2.thrift.port</name>
    8. <value>10000</value>
    9. <description>hive开启的thriftServer端口</description>
    10. </property>
    11. <property>
    12. <name>hive.server2.enable.doAs</name>
    13. <value>true</value>
    14. </property>

    启动hiveserver2服务

    nohup hiveserver2 >/dev/null 2>&1 &

    file

    通过beeline方式连接hive

    beeline -u jdbc:hive2://nn1:10000 -n hadoop

    file

    2.2.2 配置metastore服务#

    file

    默认hive cli和hiveserver2服务内嵌了metastore服务,可以直接连接mysql数据库,但是如果连接过多会造成mysql数据库压力过大,(一般练习时可以使用).另外对于metastore服务来说不安全,因为所有的配置信息在配置文件中都能看到。

    在企业中我们可以采用metastore服务单独的方式来进行设计

    在nn2上配置metastore的客户端

    1. <property>
    2. <name>hive.metastore.uris</name>
    3. <value>thrift://nn1:9083</value>
    4. </property>

    file

    在nn1上启动metastore服务

    nohup hive --service metastore > /dev/null 2>&1 &

    file

    在nn2通过hive cli连接到hive执行命令,发现可以成功查看数据库并创建表

    file

    用hiveserver2连接测试

    创建hive安装包的软连接,并修改/etc/profile环境变量文件

    1. #创建软连接
    2. chown -R hadoop:hadoop /usr/local/apache-hive-3.1.3-bin
    3. #修改环境变量文件
    4. export HIVE_HOME=/usr/local/hive
    5. export HIVE_CONF_DIR=/usr/local/hive/conf
    6. export PATH=$PATH:$HIVE_HOME/bin
    7. #更新配置
    8. source /etc/profile

    将hive-site.xml中hiveserver2的地址换成nn2

    file

    启动hiveserver2

    nohup hiveserver2 >/dev/null 2>&1 &

    file

    启动测试

    file

    如果停掉metastore服务

    file

    查询报错

    file

    3 启动hive

    3.1 hive的三种模式#

    3.1.1 使用内置的derby数据库做元数据的存储#

    ​ 使用内置的derby数据库做元数据的存储,操作derby数据库做元数据的管理,使用derby存储方式时,运行hive会在当前目录生成一个derby文件和一个metastore_db目录。这种存储方式的弊端是在同一个目录下同时只能有一个hive客户端能使用数据库,目录不同时元数据也无法共享,不适合生产环境只适合练习。

    3.1.2 本地模式#

    ​ 使用mysql做元数据的存储,操作mysql数据库做元数据的管理,可以多个hive client一起使用,并且可以共享元数据。但mysql的连接信息明文存储在客户端配置,不便于数据库连接信息保密和以后对元数据库进行更改,如果客户端太多也会对mysql造成较大的压力,因为每个客户端都自己发起连接。

    file

    安全角度:metastore存储mysql连接的数据库信息,driver和 metastore在一台机器上,数据库信息不安全。

    当多台机器的Driver 、 metastore都指向一个mysql 时,mysql的压力会增大。

    3.1.3 远程模式#

    ​ 使用mysql做元数据的存储,使用metastore服务做元数据的管理,优点便于元数据库信息的保密,因为只需要在运行metastore的机器上配置元数据库连接信息,客户端只需要配置metastore连接信息即可,缺点会引发单点问题,例如metastore服务挂了,其它hive终端就获取不到元数据信息了。企业环境推荐使用此种模式。

    file

    安全角度:meta从hive的driver上分离出来,在单独的机器上, 这样数据库的连接信息会安全。

    启动时,需要分别启动driver和metastore

    本地模式和远程模式的区别是

    1)本地模式不安全,远程模式安全。

    2)本地模式不需要单独起metastore服务,用的是跟hive在同一个进程里的metastore服务。

    远程模式需要单独起metastore服务,然后每个客户端都在配置文件里配置连接到该metastore服务。

    服务端指的是Metastore服务所在的机器,即安装metastore的机器

    metastore服务端配置

    file

    metastore客户端配置

    file

    3.2 启动hive#

    配置完成之后,先启动matesotre服务,再启动hive client

    1. # 启动zookeeper、hdfs、yarn、代理、历史
    2. # 启动metastore
    3. nohup hive --service metastore > /dev/null 2>&1 &
    4. # 启动hive客户端
    5. hive

    4 测试hive

    1)创建库

    1. # 创建数据库
    2. create database hainiu;
    3. # 显示建库语句
    4. show create database hainiu;
    5. # 进入数据库
    6. use hainiu;

    file

    数据库在hdfs的位置

    file

    2)新建表

    如果想在某个数据库下创建表,首先进入数据库(use 数据库名),

    如果没有进入数据库,那默认是default

    1. # 创建user_info 数据表
    2. create table user_info(id int,name string);
    3. # 查看表结构
    4. desc user_info;
    5. # 查看建表语句
    6. show create table user_info;

    file

    3)测试插入数据

    1. #默认会走mapreduce程序
    2. insert into user_info values(1,'zs');
    3. #报错需要指定提交队列的名字
    4. set mapreduce.job.queuename=hainiu

    查询数据

    file

    将数据下载下来查看

    file

    默认'\001'分割,vim中输入方法ctrl+v ctrl+a

    file

    不建议单条insert向hive表中插入数据

    所以我们需要准备好数据,放到hive表所在的目录

    1. touch user.txt
    2. echo "1 hangsan" >> user.txt
    3. echo "2 lisi" >> user.txt
    4. echo "3 wangwu" >> user.txt
    5. echo "4 zhaoliu" >> user.txt
    6. #将数据放入表所在的路径
    7. hadoop fs -put user.txt /hive/warehouse/hainiu.db/user_info

    4)测试查询

    select * from user_info;

    file

    数据错乱原因就是文件数据分隔符不对,需要修改成\001的方式

    file

    重新上传测试

    hadoop fs -put -f user.txt /hive/warehouse/hainiu.db/user_info

    file

    建表指定字段分隔符为空格

    create table student(id int,name string) row format delimited fields terminated by ' ';

    上传数据并测试

    file

    数据成功显示

    file

    5 元数据库中相关表的解释

    1. -- 数据库信息 (数据库id,数据库名称,数据库对应的hdfs存储位置)
    2. select * from DBS;
    3. -- 数据表信息(数据表id,数据库id,存储id,表名)
    4. select * from TBLS;
    5. -- 存储信息 (存储id,表对应的hdfs存储位置)
    6. select * from SDS;
    7. -- 数据库和表的关系
    8. select t1.`NAME`, t1.DB_LOCATION_URI, t2.TBL_NAME
    9. from DBS t1, TBLS t2
    10. where t1.DB_ID=t2.DB_ID and t1.`NAME` like 'hai%';
    11. select t1.`NAME`, t1.DB_LOCATION_URI, t2.TBL_NAME
    12. from DBS t1
    13. inner join TBLS t2
    14. on t1.DB_ID=t2.DB_ID and t1.`NAME` like 'hai%';
    15. -- 数据表和存储的关系
    16. select t1.TBL_NAME, t2.LOCATION from TBLS t1, SDS t2
    17. where t1.SD_ID=t2.SD_ID and t1.TBL_NAME = 'user_info';
    18. -- 数据库、表、存储的关系
    19. select t1.`NAME`, t2.TBL_NAME, t3.LOCATION from DBS t1, TBLS t2 , SDS t3
    20. where t1.DB_ID=t2.DB_ID and
    21. t2.SD_ID = t3.SD_ID AND
    22. t1.`NAME` = 'hainiu' AND
    23. t2.TBL_NAME = 'user_info' ;

    执行结果:

    file

  • 相关阅读:
    RabbitMQ之负载均衡-HAProxy
    发布的webservice缺少< wsdl:types/ >,< wsdl:message/ >标签
    PHP代码审计DVWASQL注入[SQL Injection]
    C Primer Plus(6) 中文版 第2章 C语言概述 2.1 简单的C程序示例
    js-array数组-slice-splice
    ResNet 图片分类并且部署成Web
    学习笔记-ThinkPHP5之文件包含审计分析(五)
    基于JavaSwing开发教学软件(在线考试测评)+报告+说明书 大作业 毕业设计
    Apache SkyWalking 监控 MySQL Server 实战
    数据结构与算法这么重要还不会?字节内部笔记来帮你轻松拿下!
  • 原文地址:https://blog.csdn.net/2301_76522810/article/details/133754227