基本结构与概念
1.hive是什么
数据仓库:数据库 Database (Oracle, Mysql, PostgreSQL)主要用于事务处理,数据仓库 Datawarehouse (Amazon Redshift, Hive)主要用于数据分析。
数据库(Database)的特点是:相对复杂的表格结构,存储结构相对紧致,少冗余数据。读和写都有优化。相对简单的read/write query,单次作用于相对的少量数据。
数据仓库(Datawarehouse)的特点是:相对简单的(Denormalized)表格结构,存储结构相对松散,多冗余数据。一般只是读优化。相对复杂的read query,单次作用于相对大量的数据(历史数据)。
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,Hive 依赖于 HDFS 存储数据,Hive 将 HQL 转换成 MapReduce 执行。学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
值得注意的是:
Hive不是一个关系型数据库,虽然它有关系型数据表的结构;
Hive不能实时查询和行级更新。
2.hive的作用与结构
首先从Hadoop的整体结构去了解一下hive,Hadoop整个结构最底层是依托hdfs文件系统来搭建,所有 Hive 的数据都是存储在 hdfs 中的.
然后,再看看hive的架构:
访问hive的三种方式:
主要有三个:CIL(命令行),JDBC/ODBC(java),WebUI(浏览器访问);
元数据(通俗的讲,就是存储在 Hive 中的数据的描述信息):
元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列、分区字段、表的类型(是否是外部表)、表的数据所在的目录等;
默认存储在自带的derby数据库中,推荐使用采用MySQL存储Metastore;
Driver:
由四部分组成:驱动器Driver,编译器Compiler,优化器Optimizer,执行器Executor;
(1)解析器:将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工 具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否 存在、SQL语义是否有误(比如select中被判定为聚合的字段在group by中是 否有出现);
(2)编译器:将AST编译生成逻辑执行计划;
(3)优化器:优化器是对逻辑执行计划进行优化
(4)执行器:把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就
是MR/TEZ/Spark;
还有个忽略掉的部分,没有在图中显示
thrift server :跨语言服务
Thrift 是 Facebook 开发的一个软件框架,可以用来进行可扩展且跨语言的服务的开发, Hive 集成了该服务,能让不同的编程语言调用 Hive 的接口。
3.hive的执行过程
HiveQL 通过命令行或者客户端提交,经过 Compiler 编译器,运用 MetaStore 中的元数 据进行类型检测和语法分析,生成一个逻辑方案(Logical Plan),然后通过的优化处理,产生 一个 MapReduce 任务。
(1)Receive Request
Hive接收相关的查询请求,如命令行或Web UI发送查询驱动程序(任何数据库驱动程序,如JDBC,ODBC等)来执行。
(2) Parsing
驱动程序请求查询编辑器解析查询、检查语法、生成查询计划或者查询所需要的资源
(3)Query Metadata
根据查询的要求,编译器发送元数据请求到Metastore(元数据中存了表跟文件之间的映射关系、列和字段之间的关系等等)。
(4)Send Metadata
Metastore发送元数据给编译器。
(5)Send Plan
编译器Compiler得到元数据信息,对任务进行编译,先将HiveQL转换为抽象语法树,然后将抽象语法树转换成查询块,将查询块转化为逻辑的查询计划,重写逻辑查询计划,将逻辑计划转化为物理的计划(MapReduce), 最后选择最佳的策略。
(6)Execute Plan
驱动程序发送的执行计划到执行引擎。
(7)Execute Job
执行计划的处理是一个MapReduce作业。执行引擎向NameNode上的JobTracker进程发送作业,JobTracker把作业分配给DataNode上的TaskTracker进程。此时,查询执行MapReduce作业
(7.1)Metadata Ops
与此同时,执行引擎可能会执行元数据操作,如DDL语句等
(8)Receive Result
执行引擎接收来自数据节点的结果。
(9)Send Results
执行引擎发送这些结果值给驱动程序。
(10)Send Results
驱动程序将结果发送给Hive接口。
值得注意的是:
物理执行计划解析,生成 tasktree,然后会进行物理执行计划优化,生成真正的tasktree,该任务即是在集群上执行的作业任务。
4.hive的数据模型
database:Hive中的数据库包含一系列的数据库,每个数据库都对应于HDFS上的一个目录,默认的数据库为default,对应于HDFS目录是/user/hadoop/hive/warehouse,可以通过hive.metastore.warehouse.dir参数进行配置(hive-site.xml中配置)
table:
(1)内部表:元数据被删,hdfs文件夹目录也被删除
(2)外部表(External Table):元数据被删,hdfs文件夹目录文件不会被删
分区(Partition):在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念。分区表指的是在创建表时指定的partition的分区空间。
Hive可以对数据按照某列或者某些列进行分区管理,所谓分区我们可以拿下面的例子进行解释。
当前互联网应用每天都要存储大量的日志文件,几G、几十G甚至更大都是有可能。存储日志,其中必然有个属性是日志产生的日期。在产生分区时,就可以按照日志产生的日期列进行划分。把每一天的日志当作一个分区。
将数据组织成分区,主要可以提高数据的查询速度。至于用户存储的每一条记录到底放到哪个分区,由用户决定。即用户在加载数据的时候必须显示的指定该部分数据放到哪个分区。
桶:对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是 针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。
把表(或者分区)组织成桶(Bucket)有两个理由:
(1)获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。
(2)使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。
索引
值得注意的地方:hive没有索引
在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些Key建立索引。Hive要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。由于 MapReduce 的引入, Hive 可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive 仍然可以体现出优势。数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据的访问,数据库可以有很高的效率,较低的延迟。由于数据的访问延迟较高,决定了 Hive 不适合在线数据查询。
整个笔记会省掉安装hive的过程,笔记二主要介绍hive的一些基本语法,表的创建,数据查询等。