hive简单介绍

Hive有关介绍
Hive是什么
使用Hive的好处
Hive的特点
Hive架构
Hive工作原理
Hive的适用场景
Hive中表的分类
Hive与HBase的联系和区别
Hive与HBase的联系
Hive与HBase的区别
Hive是什么
(1)由Facebook开源,最初用于解决海量结构化的日志数据统计问题;
​(2)构建在Hadoop之上的数据仓库;
(3)Hive定义了一种类SQL查询语言:HQL(类似SQL但不完全相同);
​(4)通常用于进行离线数据处理(采用MapReduce);
​(5)底层支持多种不同的执行引擎(Hive on MapReduce、Hive on Tez、Hive on Spark);
​(6)支持多种不同的压缩格式、存储格式以及自定义函数(压缩:GZIP、LZO、Snappy、BZIP2… ;
​(7)存储:TextFile、SequenceFile、RCFile、ORC、Parquet ; UDF:自定义函数)。

使用Hive的好处
(1)简单、容易上手(提供了类似SQL查询语言HQL);
​(2)为超大数据集设计的计算/存储扩展能力(MR计算,HDFS存储);
​(3)统一的元数据管理(可与Presto/Impala/SparkSQL等共享数据)。

Hive的特点
(1)它存储架构在一个数据库中并处理数据到HDFS。
(2)它是专为OLAP设计。
(3)它提供SQL类型语言查询叫HiveQL或HQL。
(4)它是熟知、快速、可扩展的。

Hive架构
下面的组件图描绘了Hive的结构:

该组件图包含不同的单元。下表描述每个单元:

单元名称    操作
用户接口/界面    Hive是一个数据仓库基础工具软件,可以创建用户和HDFS之间互动。用户界面,Hive支持是Hive的Web UI,Hive命令行,HiveHD洞察(在Windows服务器)。
元存储    Hive选择各自的数据库服务器,用以储存表,数据库,列模式或元数据表,它们的数据类型和HDFS映射。
HiveQL处理引擎    HiveQL类似于SQL的查询上Metastore模式信息。这是传统的方式进行MapReduce程序的替代品之一。相反,使用Java编写的MapReduce程序,可以编写为MapReduce工作,并处理它的查询。
执行引擎    HiveQL处理引擎和MapReduce的结合部分是由Hive执行引擎。执行引擎处理查询并产生结果和MapReduce的结果一样。它采用MapReduce方法。
HDFS 或 HBASE    Hadoop的分布式文件系统或者HBASE数据存储技术是用于将数据存储到文件系统。
Hive工作原理
下图描述了Hive 和Hadoop之间的工作流程

 

下表定义Hive和Hadoop框架的交互方式:

Step No.    操作
1    Execute QueryHive接口,如命令行或Web UI发送查询驱动程序(任何数据库驱动程序,如JDBC,ODBC等)来执行。
2    Get Plan在驱动程序帮助下查询编译器,分析查询检查语法和查询计划或查询的要求。
3    Get Metadata编译器发送元数据请求到Metastore(任何数据库)。
4    Send MetadataMetastore发送元数据,以编译器的响应。
5    Send Plan编译器检查要求,并重新发送计划给驱动程序。到此为止,查询解析和编译完成。
6    Execute Plan驱动程序发送的执行计划到执行引擎。
7    Execute Job在内部,执行作业的过程是一个MapReduce工作。执行引擎发送作业给JobTracker,在名称节点并把它分配作业到TaskTracker,这是在数据节点。在这里,查询执行MapReduce工作。
7(1)    Metadata Ops与此同时,在执行时,执行引擎可以通过Metastore执行元数据操作。
8    Fetch Result执行引擎接收来自数据节点的结果。
9    Send Results执行引擎发送这些结果值给驱动程序。
10    Send Results驱动程序将结果发送给Hive接口。
Hive的适用场景
Hive 构建在基于静态批处理的Hadoop 之上,Hadoop 通常都有较高的延迟并且在作业提交和调度的时候需要大量的开销。因此,Hive 并不能够在大规模数据集上实现低延迟快速的查询。例如:Hive 在几百MB 的数据集上执行查询一般有分钟级的时间延迟。因此,Hive 并不适合那些需要低延迟的应用。例如:联机事务处理(OLTP)。

Hive 查询操作过程严格遵守Hadoop MapReduce 的作业执行模型,Hive 将用户的HiveQL 语句通过解释器转换为MapReduce 作业提交到Hadoop 集群上,Hadoop 监控作业执行过程,然后返回作业执行结果给用户。Hive 并非为联机事务处理而设计,Hive 并不提供实时的查询和基于行级的数据更新操作。Hive 的最佳使用场合是大数据集的批处理作业。例如:网络日志分析。

Hive中表的分类
分类包括:内部表、外部表、分区表、桶表

分类    内容
内部表    删表时数据和表一起删除。
外部表    (1)数据已经存在于HDFS。(2)外部表只是走一个过程,加载数据和创建表同时完成,不会移动到数据仓库目录中,仅仅是和数据建立了一个连接。(3)删表数据不会删除数据。
分区表    (1)在Hive Select查询中,一般会扫描整个表内容,会消耗很多时间做没必要的工作。 分区表指的是在创建表时,指定partition的分区空间。扫描时可以只扫描某一个分区的数据。(2)分区表存储时分局所设立的分区分别存储数据(分区字段就是一个文件夹的标识)。
桶表    (1)对于每一个表(table)或者分区,Hive可以进一步组织成桶,也就是说捅是更为细粒度的数据范困划分。(2)桶表是对指定的分桶的列进行哈希运算,运算结果模(%)分桶的数量然后把数据根据运算结果分别放入这几个桶中。
内部表外部表的区分:

在导入数据到外部表,数据并没有移动到自己的数据仓库目录下,也就是说外部表中的数据并不是由它自己来管理的!
而内部表则不一样,在删除内部表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据是不会删除的!

Hive与HBase的联系和区别
在大数据架构中,Hive和HBase是协作关系。

Hive与HBase的联系
在大数据架构中,Hive和HBase是协作关系,数据流一般如下图:

 

(1)通过ETL工具将数据源抽取到HDFS存储;
(2)通过Hive清洗、处理和计算原始数据;
(3)Hive清洗处理后的结果,如果是面向海量数据随机查询场景的可存入Hbase
(4)数据应用从HBase查询数据。

Hive与HBase的区别
(1)Hive中的表是纯逻辑表,就只是表的定义等,即表的元数据。Hive本身不存储数据,它完全依赖HDFS和MapReduce。这样就可以将结构化的数据文件映射为为一张数据库表,并提供完整的SQL查询功能,并将SQL语句最终转换为MapReduce任务进行运行。 而HBase表是物理表,适合存放非结构化的数据。

(2)Hive是基于MapReduce来处理数据,而MapReduce处理数据是基于行的模式;HBase处理数据是基于列的而不是基于行的模式,适合海量数据的随机访问。

(3)HBase的表是疏松的存储的,因此用户可以给行定义各种不同的列;而Hive表是稠密型,即定义多少列,每一行有存储固定列数的数据。

(4) Hive使用Hadoop来分析处理数据,而Hadoop系统是批处理系统,因此不能保证处理的低迟延问题;而HBase是近实时系统,支持实时查询。

(5) Hive不提供row-level的更新,它适用于大量append-only数据集(如日志)的批任务处理。而基于HBase的查询,支持和row-level的更新。

(6)Hive提供完整的SQL实现,通常被用来做一些基于历史数据的挖掘、分析。而HBase不适用与有join,多级索引,表关系复杂的应用场景。

1. Hive是什么
1.1 hive的概念
Hive:由Facebook开源,用于解决海量(结构化日志)的数据统计。

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

本质是:将Hive SQL转化成MapReduce程序

1.2 Hive与数据库的区别

Hive 具有 SQL 数据库的外表,但应用场景完全不同。

Hive 只适合用来做海量离线数据统计分析,也就是数据仓库。

1.3 Hive的优缺点
优点

操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。

避免了去写MapReduce,减少开发人员的学习成本。

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

缺点

Hive 不支持记录级别的增删改操作

Hive 的查询延时很严重

Hive 不支持事务

1.4 Hive架构原理
 


1、用户接口:Client

CLI(hive shell)、JDBC/ODBC(java访问hive)、WEBUI(浏览器访问hive)

2、元数据:Metastore

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

默认存储在自带的derby数据库中,==推荐使用MySQL存储Metastore==

3、Hadoop集群

使用HDFS进行存储,使用MapReduce进行计算。

4、Driver:驱动器

解析器(SQL Parser)

将SQL字符串转换成抽象语法树AST

对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。

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

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

执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说默认就是mapreduce任务

2. Hive的安装部署
​ 注意hive就是一个构建数据仓库的工具,只需要在一台服务器上安装就可以了,不需要在多台服务器上安装。

1、提前先安装好mysql服务和hadoop集群

详细见https://www.cnblogs.com/brianzhu/p/8575243.html

2、下载hive的安装包

http://mirror.bit.edu.cn/apache/hive/hive-1.2.2/apache-hive-1.2.2-bin.tar.gz

apache-hive-1.2.2-bin.tar.gz

3、规划安装目录

/opt/bigdata

4、上传安装包到服务器中

5、解压安装包到指定的规划目录

tar -zxvf apache-hive-1.2.2-bin.tar.gz -C /opt/bigdata

6、重命名解压目录

mv apache-hive-1.2.2-bin hive

7、修改配置文件

    进入到Hive的安装目录下的conf文件夹中

    vim hive-env.sh(mv hive-env.sh.template hive-env.sh)

#配置HADOOP_HOME路径
export HADOOP_HOME=/opt/bigdata/hadoop
#配置HIVE_CONF_DIR路径
export HIVE_CONF_DIR=/opt/bigdata/hive/conf
    vim hive-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
        <property>
          <name>javax.jdo.option.ConnectionURL</name>
          <value>jdbc:mysql://node1:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8</value>
          <description>JDBC connect string for a JDBC metastore</description>
        </property>
        <property>
          <name>javax.jdo.option.ConnectionDriverName</name>
          <value>com.mysql.jdbc.Driver</value>
          <description>Driver class name for a JDBC metastore</description>
        </property>
        <property>
          <name>javax.jdo.option.ConnectionUserName</name>
          <value>root</value>
          <description>username to use against metastore database</description>
        </property>
        <property>
          <name>javax.jdo.option.ConnectionPassword</name>
          <value>123456</value>
          <description>password to use against metastore database</description>
        </property>
</configuration>
    需要将mysql的驱动包上传到hive的lib目录下

      例如 mysql-connector-java-5.1.38.jar

3. hive的交互方式 
先启动hadoop集群和mysql服务

3.1 Hive交互shell
cd /opt/bigdata/hive
bin/hive

3.2 Hive JDBC服务
  如何查询后台线程?

  netstat -nlp


启动hiveserver2服务

前台启动

弊端:控制台一直打印日志,且不能关掉控制台,关掉即服务挂掉。


bin/hive --service hiveserver2

后台启动

特点:控制台可以关闭,且在进程中运行,执行jps,可以看到hive的进程。


nohup  bin/hive --service hiveserver2 &

beeline连接hiveserver2


bin/beeline
beeline> !connect jdbc:hive2://node1:10000

3.3 Hive的命令
hive -e sql语句

使用 –e 参数来直接执行hql的语句

cd /opt/bigdata/hive
bin/hive -e "show databases"

hive -f sql文件

使用 –f 参数执行包含hql语句的文件


4、Hive的数据类型(5分钟)
4.1 基本数据类型
类型名称    描述    举例
boolean    true/false    true
tinyint    1字节的有符号整数    1
smallint    2字节的有符号整数    1
==int==    4字节的有符号整数    1
==bigint==    8字节的有符号整数    1
float    4字节单精度浮点数    1.0
==double==    8字节单精度浮点数    1.0
==string==    字符串(不设长度)    “abc”
varchar    字符串(1-65355长度,超长截断)    “abc”
timestamp    时间戳    1563157873
date    日期    20190715
 

4.2 复合数据类型
类型名称    描述    举例
array    一组有序的字段,字段类型必须相同 array(元素1,元素2)    Array(1,2,3)
map    一组无序的键值对 map(k1,v1,k2,v2)    Map(‘a’,1,'b',2)
struct    一组命名的字段,字段类型可以不同 struct(元素1,元素2)    Struct('a',1,2,0)
array字段的元素访问方式:

下标获取元素,下标从0开始

获取第一个元素

array[0]

map字段的元素访问方式

通过键获取值

获取a这个key对应的value

map['a']

struct字段的元素获取方式

定义一个字段c的类型为struct{a int;b string}

获取a和b的值

使用c.a 和c.b 获取其中的元素值

这里可以把这种类型看成是一个对象

create table complex(
         col1 array<int>,
         col2 map<string,int>,
         col3 struct<a:string,b:int,c:double>
)
5、Hive的数据类型转换 (5分钟)
5.1 隐式类型转换
系统自动实现类型转换,不需要用户干预

如tinyint可以转换成int,int可以转换成bigint。

所有整数类型、float 和 string类型都可以隐式地转换成double。

tinyint、smallint、int都可以转换为float。

boolean类型不可以转换为任何其它的类型。

5.2 手动类型转换
可以使用cast函数操作显示进行数据类型转换

cast ('1' as int)将把字符串'1' 转换成整数1;

如果强制类型转换失败,如执行cast('x' as int),表达式返回空值 NULL。

6、Hive的DDL操作(20分钟)
6.1 hive的数据库DDL操作
6.1.1、创建数据库
hive > create database db_hive;
或者
hive > create database if not exists db_hive;
数据库在HDFS上的默认存储路径是/user/hive/warehouse/*.db

6.1.2、显示数据库
  hive> show databases;
6.1.3、显示数据库
hive> show databases like 'db_hive*';
6.1.4、查看数据库详情
hive> desc database db_hive;
6.1.5、显示数据库详细信息
hive> desc database extended db_hive;
6.1.6、切换当前数据库
hive > use db_hive;
6.1.7、删除数据库
#删除为空的数据库
hive> drop database db_hive;
#如果删除的数据库不存在,最好采用if exists 判断数据库是否存在
hive> drop database if exists db_hive;
#如果数据库中有表存在,这里需要使用cascade强制删除数据库
hive> drop database if exists db_hive cascade;
6.2 hive的表DDL操作
6.2.1 、建表语法介绍
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name 
[(col_name data_type [COMMENT col_comment], ...)] 
[COMMENT table_comment] 
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 分区
[CLUSTERED BY (col_name, col_name, ...) 分桶
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] 
[ROW FORMAT row_format]   row format delimited fields terminated by “分隔符”
[STORED AS file_format] 
[LOCATION hdfs_path]
6.2.2 、字段解释说明
create table

创建一个指定名字的表

EXTERNAL

创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),指定表的数据保存在哪里

COMMENT

为表和列添加注释

PARTITIONED BY

创建分区表

CLUSTERED BY

创建分桶表

SORTED BY

按照字段排序(一般不常用)

ROW FORMAT

指定每一行中字段的分隔符

row format delimited fields terminated by ‘\t’

STORED AS

指定存储文件类型

常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本,默认方式)、RCFILE(列式存储格式文件)

如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。

LOCATION

指定表在HDFS上的存储位置。

6.2.3、 创建内部表
1、直接建表

使用标准的建表语句

create table if not exists student(
id int, 
name string
)
row format delimited fields terminated by '\t'
stored as textfile;
2、查询建表法

通过AS 查询语句完成建表:将子查询的结果存在新表里,有数据

create table if not exists student1 as select id, name from student;
3、like建表法

根据已经存在的表结构创建表

create table if not exists student2 like student;
4、查询表的类型

hive > desc formatted student;

  

  加载数据:

    load data local inpath 本地路径 into table 表名;

6.2.4、 创建外部表
create external table if not exists emp(
id int,
name string,
age int
)
row format delimited fields terminated by '\t'
location '/hive/bigdata';
创建外部表的时候需要加上external关键字

location字段可以指定,也可以不指定

指定就是数据存放的具体目录

不指定就是使用默认目录 /user/hive/warehouse


 

6.2.5、 内部表与外部表的互相转换
1、内部表转换为外部表

#把student内部表改为外部表
alter table student set tblproperties('EXTERNAL'='TRUE');
2、外部表转换为内部表

#把student管理表改为外部表
alter table student set tblproperties('EXTERNAL'='FALSE');
6.2.6、 内部表与外部表的区别
1、建表语法的区别

外部表在创建的时候需要加上external关键字

2、删除表之后的区别

内部表删除后,表的元数据和真实数据都被删除了

外部表删除后,仅仅只是把该表的元数据删除了,真实数据还在,后期还是可以恢复出来(这里指定了,location '/hive/bigdata',文件存在linux中)

注意:外部表可以用于重要业务,以防表被误删,导致数据丢失。

7.1其他
hive cli命令窗口查看本地文件系统

与操作本地文件系统类似,这里需要使用 ! (感叹号),并且最后需要加上 ;(分号)

例如

!ls /;

hive cli命令窗口查看HDFS文件系统

与查看HDFS文件系统类似

dfs -ls / ;

hive的底层执行引擎有3种

mapreduce(默认)

tez(支持DAG作业的计算框架)

spark(基于内存的分布式计算框架)
————————————————
版权声明:本文为CSDN博主「Hi_Shook」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42575593/article/details/102050738

转载地址:

1. Hive全面介绍(有点详细)_hua_ge_zui_liang的博客-CSDN博客

2.hive基础知识一_Hi_Shook的博客-CSDN博客

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值