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上运行
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 构建在 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数据库的一个工具