Hive基础

公司的数据处理方式(四种主流):MR、HIVE、HBase、Spark....

非主流:pig、storm、mongodb、mr script.....       

流程:

1.使用MR开发:编写MR ,实现mapper、reducer、main在hadoop上运行

2.使用hive开发:

2.1使用内置函数:在hive的CLI模式下写HQL,自动转成MR,在hadoop上运行

2.2使用UDF自定义函数:写class打jar包,在hive的CLI下添加自定义函数,在CLI模式下写HQL,自动转成MR,在hadoop上运行

hive里mr是什么意思 hive库的mr是什么_hive

 

 

1.1:hive知识点总结:

     Hive是建立在Hadoop上的数据仓库基础构架(HDFS和MR),它提供了一系列工具可以用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模的数据机制。

    Hive就是在Hadoop上架了一层SQL接口,可以将SQL翻译成MapReduce去Hadoop上执行,这样就使得数据开发和分析人员很方便的使用SQL来完成海量数据的统计和分析,而不必使用编程语言开发MapReduce那么麻烦

     Hive是基于HDFS存储、基于MapReduce计算,提供HQL查询的数据仓库工具。Hive是一个很开放的系统,很多内容都支持用户定制。

     HQL:使用语言:QL语言(类SQL查询语言)。能处理内建的mapper和reducer无法完成的复杂分析工作。

  现在虽然有很多SQL ON Hadoop的解决方案,像Spark SQL、Impala、Presto等等,但就目前来看,在基于Hadoop的大数据分析平台、数据仓库中,Hive仍然是不可替代的角色。尽管它的相应延迟大,尽管它启动MapReduce的时间相当长,但是它太方便、功能太强大了,做离线批量计算、ad-hoc查询甚至是实现数据挖掘算法,而且,和HBase、Spark都能整合使用。

 

1.Hive是SQL解析引擎,它将SQL语句转译成M/R Job然后再Hadoop执行。

2.Hive的表其实是HDFS的目录(/文件夹),按表名把文件夹区分开。如果是分区表,则分区值是子文件夹,可以直接在M/R Job里使用这些数据。Hive的数据都是存储在HDFS上的,默认有一个根目录,在hive-site.xml中,由参数hive.metastore.warehouse.dir指定。默认值为/user/hive/warehouse.

例如:创建logs数据库,HDFS上的存储地址就是/user/hive/warehouse/logs.db

例如:创建day表,HDFS上的存储地址就是/user/hive/warehouse/logs.db/day/

 

1.2:Hive的系统架构

1.用户接口主要有三个:CLI,JdbC/ODBC,WebUI

(1)CLI,即shell命令行。

(2)JDBC/ODBC,是Hive的Java接口,与使用传统数据库JDBC方式类似。

(3)WebUI,是通过浏览访问Hive。

 

2.Hive将元数据存储在数据库(metastore)中,目前只支持MySQL,derby。(Hive中的元数据包括表名,表列,和分区及其属性,表属性,表的数据所在目录等)

3.解析器、编译器、优化器、执行器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划(plan)的生成。生成的查询计划存储在HDFS中,并在随后有MapReducer调用执行。

4.Hive的数据存储在HDFS中,大部分的查询由MapReducer完成(包括含*的查询,比如select * from table不会生成MapReducer任务)

  

Hive通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的Driver,结合元数据(MetaStore),将这些指令翻译成MapReduce,提交到Hadoop中执行,最后,将执行返回的结果输出到用户交互接口。

在使用过程中,至需要将Hive看做是一个数据库就行,本身Hive也具备了数据库的很多特性和功能。

1.3:Hive 和 Hadoop 关系 

  

hive里mr是什么意思 hive库的mr是什么_Hive_02

Hive 构建在 Hadoop 之上,

· HQL 中对查询语句的解释、优化、生成查询计划是由 Hive 完成的

· 所有的数据都是存储在

· 查询计划被转化为

· Hadoop和Hive都是用UTF-8编码的

 

1.4:hive的数据单元和数据类型

Databases:数据库。概念等同于关系型数据库的Schema,不多解释;

Tables:表。概念等同于关系型数据库的表,不多解释;

Partitions:分区。概念类似于关系型数据库的表分区,没有那么多分区类型,只支持固定分区,将同一组数据存放至一个固定的分区中。

Buckets (or Clusters):分桶。同一个分区内的数据还可以细分,将相同的KEY再划分至一个桶中,这个有点类似于HASH分区,只不过这里是HASH分桶,也有点类似子分区吧。

 

数据类型 : 基本类型和复杂类型

Hive中的数据库概念,本质上仅仅是表的一个目录结构或命名空间。

创建数据库的本质

HDFS上Hive的根目录下新建一个  数据库名.db  的文件夹

注意:默认的default库没有名字,就在根目录下

创建表的本质:

在表所在的库的目录下新建一个以表名为名字的文件夹

hive本身应该保存着这些元数据信息  hive本身有一个元数据库  

 

Hive元数据的存储:存储在关系型数据库中。默认存Derby,内嵌在Hive中。实际工作中使用的最多是MySQL。

hive默认的数据库 叫做  derby

7. a  hive在哪个目录下面启动  derby就会在哪个目录下生成一个存储元数据的存储文件 那就会造成 我们必须每次都在一个

目录下面去取  否则无法开发。

  b  derby数据库 支持单session

 

当我们在Hive中创建一张表后  hive做的工作

 a . 在元数据库中 会增加一条数据

 b .在hdfs上创建这张表所对应的目录

 hive表默认的存储目录 user/hive/warehouse

 

1.5:Hive的数据管理模式

hive插入数据时 采用的是读时模式  就是说  插入数据 就算有问题  也不报错 但是 查询全是Null

关系型数据库的数据管理模式:写时模式,即添加数据的时候就检查数据格式,格式错误无法插入。

   Hive的数据管理模式:读时模式,即读取数据的时候才检查数据格式,不匹配返回null。

即:Hive加载数据的时候并不操作或处理数据

所以:Hive可以在建表的时候就指定数据所在的目录

本质:Hive的建表语句就是对文件中的数据的结构的一种描述

原因:Hive的作用是分析海量数据(不需要精确管理)

 

1.6:Hive 的存储类型

    textfile

    sequencefile

    rcfile

到目前为止  我们使用的数据文件的类型都是

我们再末尾加上

使用textfile的好处?

他可以使用任意的分隔符进行分割  便于和其他工具共享数据  也可以方便的去编辑查看

    

不好的地方

相对于

也比那两个大

所以  我们推荐使用rcfile  

使用

 

首先,Hive 没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织 Hive 中的表,只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据。

其次,Hive 中所有的数据都存储在 HDFS 中,Hive 中包含以下数据模型:Table,External Table,Partition,Bucket。

1. Hive 中的 Table 和数据库中的 Table 在概念上是类似的,每一个 Table 在 Hive 中都有一个相应的目录存储数据。例如,一个表 xiaojun,它在 HDFS 中的路径为:/ warehouse /xiaojun,其中,wh 是在 hive-site.xml 中由 ${hive.metastore.warehouse.dir} 指定的数据仓库的目录,所有的 Table 数据(不包括 External Table)都保存在这个目录中。 

2. Partition 对应于数据库中的 Partition 列的密集索引,但是 Hive 中 Partition 的组织方式和数据库中的很不相同。在 Hive 中,表中的一个 Partition 对应于表下的一个目录,所有的 Partition 的数据都存储在对应的目录中。例如:xiaojun 表中包含 dt 和 city 两个 Partition,则对应于 dt = 20100801, ctry = US 的 HDFS 子目录为:/ warehouse /xiaojun/dt=20100801/ctry=US;对应于 dt = 20100801, ctry = CA 的 HDFS 子目录为;/ warehouse /xiaojun/dt=20100801/ctry=CA

3. Buckets 对指定列计算 hash,根据 hash 值切分数据,目的是为了并行,每一个 Bucket 对应一个文件。将 user 列分散至 32 个 bucket,首先对 user 列的值计算 hash,对应 hash 值为 0 的 HDFS 目录为:/ warehouse /xiaojun/dt =20100801/ctry=US/part-00000;hash 值为 20 的 HDFS 目录为:/ warehouse /xiaojun/dt =20100801/ctry=US/part-00020

4. External Table 指向已经在 HDFS 中存在的数据,可以创建 Partition。它和 Table 在元数据的组织上是相同的,而实际数据的存储则有较大的差异。 

· Table 的创建过程和数据加载过程(这两个过程可以在同一个语句中完成),在加载数据的过程中,实际数据会被移动到数据仓库目录中;之后对数据对访问将会直接在数据仓库目录中完成。删除表时,表中的数据和元数据将会被同时删除。 

· External Table 只有一个过程,加载数据和创建表同时完成(CREATE EXTERNAL TABLE ……LOCATION),实际数据是存储在 LOCATION 后面指定的 HDFS 路径中,并不会移动到数据仓库目录中。当删除一个 External Table 时,仅删除 


1.7:Hive 和普通关系数据库的异同 

 

Hive

RDBMS

 

查询语言

HQL

SQL

 

数据存储

HDFS

Raw Device or Local FS

 

索引

 

执行

MapReduce

Excutor

 

执行延迟

 

处理数据规模

 

1. 查询语言。由于

2. 数据存储位置。Hive 是建立在 Hadoop 之上的,所有 Hive 的数据都是存储在 HDFS 中的。而数据库则可以将数据保存在块设备或者本地文件系统中。

3. 数据格式。Hive 中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:列分隔符(通常为空格、”\t”、”\x001″)、行分隔符(”\n”)以及读取文件数据的方法(Hive 中默认有三个文件格式 TextFile,SequenceFile 以及 RCFile)。由于在加载数据的过程中,不需要从用户数据格式到 Hive 定义的数据格式的转换,因此,Hive 在加载的过程中不会对数据本身进行任何修改,而只是将数据内容复制或者移动到相应的 HDFS 目录中。而在数据库中,不同的数据库有不同的存储引擎,定义了自己的数据格式。所有数据都会按照一定的组织存储,因此,数据库加载数据的过程会比较耗时。

4. 数据更新。由于

5. 索引。之前已经说过,Hive 在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些 Key 建立索引。Hive 要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。由于 MapReduce 的引入, Hive 可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive 仍然可以体现出优势。数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据的访问,数据库可以有很高的效率,较低的延迟。由于数据的访问延迟较高,决定了 Hive 不适合在线数据查询。

6. 执行。Hive 中大多数查询的执行是通过 Hadoop 提供的 MapReduce 来实现的(类似 select * from tbl 的查询不需要 MapReduce)。而数据库通常有自己的执行引擎。

7. 执行延迟。之前提到,Hive 在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致 Hive 执行延迟高的因素是 MapReduce 框架。由于 MapReduce 本身具有较高的延迟,因此在利用 MapReduce 执行 Hive 查询时,也会有较高的延迟。相对的,数据库的执行延迟较低。当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive 的并行计算显然能体现出优势。

8. 可扩展性。由于

数据规模。由于

数据库的操作是CRUD 增删改查  

hive的操作是create table,upload data,select col,drop table。CRUD

事物问题

Hql语法和数据库表的名字都不区分大小写

Mysql中的表名区分大小写

 

1.8:hive与mr的比较

1. 运算资源消耗

mr都是优于或者等于hive的。mr的灵活性是毋庸置疑的。在转换到hive的过程中,会有一些为了实现某些场景的需求而不得不用多步hive来实现的时候。

2. 开发成本/维护成本

hive的开发成本是远低于mr的。

3. 底层相关性

在使用hive以后,读取文件的时候,再也不用关心文件的格式,文件的分隔符,只要指定一次,hive就会保存好。相比mr来说方便了很多。

 

1.9:hive的优缺点

 1.hive独有的分区管理,方便进行数据的管理  优

2.代码的管理也很方便,就是直接的文本  优

3.逻辑的修改和生效很方便  优

4.但是当出现异常错误的时候,hive的调试会比较麻烦。特别是在大的生产集群上面的时候  缺

5. 当侧重关心与业务相关的内容的时候,用hive会比较有优势。而在一些性能要求高,算法研究的时候,mr会更加适合  缺

6. 批处理,高延迟的计算框架 缺

7. 内置的函数和自定义函数开发 优

8. Hive对事物的支持不够好,原因是HDFS本身就设计为一次写入,多次读取的分布式存储系统,因此,不能使用Hive来完成诸如DELETE、UPDATE等在线事务处理的需求

9. Hive擅长的是非实时的、离线的、对响应及时性要求不高的海量数据批量计算,即查询,统计分析。

总结:实际上HIVE基于Hadoop(HDFS+MR)和SQL数据库的一个工具