Hive简介

最近的项目中可能用到Hive,先从概念上简单理解下~
 
Hive是基于Hadoop(HDFS, MapReduce)的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。
本质是将SQL转换为MapReduce程序。
通常用于离线分析。
 
Hive系统结构
 
Hive组成
  • 元数据存储(Metastore)
  • 驱动(Driver)
  • 查询编译器(Query Compiler)
  • 执行引擎(Execution Engine)
  • 服务器(HiveServer)
  • 客户端组件
  • 可扩展接口部分
Hive原数据:
  元数据(数据的描述信息:表的名称,数据库的名称,权限,所有者,组成字段等等),  默认情况下存储在hive内部自带的derby数据库中。
  问题:derby数据库,在同一时刻,只允许一个线程操作
  建议:使用MySQL对元数据进行存储
用户接口:
  CLI:启动的时候,会同时启动一个Hive副本
  Client:Hive的客户端,用户连接至Hive Server
  WUI:通过浏览器访问Hive
语句转换:
  解析器:生成抽象语法树
  语法分析器:验证查询语法
  逻辑计划生成器(包括优化器):生成操作符树
  查询计划生成器:转换为map-reduce任务
数据存储:
  Hive数据以文件形式存储在HDFS的指定目录下
  Hive语句生成查询计划,由MapReduce调用执行
 
运行顺序
1. 用户使用命令行工具或者JDBC发送HQL
2. 使用Driver驱动结合MetaStore元数据,将指定翻译成MapReduce
3. 首先使用SQL Parser解释器进行HQL的翻译
4. 使用编译器对解释结果进行编译
5. 使用优化器对编译结果进行优化
6. 最后将优化的结果使用执行器进行执行操作(本质上就是在Hadoop集群上使用MapReduce操作)
7. 将处理结果返回给客户端用户
 
Hive和普通关系型数据库的异同
  • 数据存储:Hive是建立在Hadoop之上的,所有hive的数据都是存储在HDFS中的;数据库则可以将数据保存在块设备或者本地文件系统中。
  • 数据格式:Hive中没有定义专门的数据格式,由用户指定,需要制定三个属性:列分隔符,行分隔符,以及读取文件数据的方法;数据库中,存储引擎定了自己的数据格式,所有数据都会按照一定的组织存储。
  • 数据更新:Hive的内容是读多写少的,因此不支持对数据的改写和删除,数据都是在加载的时候确定好的;数据中的数据通常是经常需要修改的。
  • 执行延时:Hive在查询数据时,需要扫描整个表或者分区,因此延时较高,因为Hive只有在处理大数据时才有优势;数据库在处理小数据时执行延迟较低。
  • Hive中没有索引(暴力扫描整张表 , 访问数据延迟高;使用MR,并行访问数据) 
 
为什么要使用Hive?
  • 操作接口采用类SQL语法,提供快速开发的能力
  • 避免了去写MapReduce,减少开发人员的学习成本
Hive的特点
  • 可扩展,Hive可以自由扩展集群的规模,一般情况下不需要重启服务
  • 延展性,Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数
  • 容错,良好的容错性,节点出现问题SQL仍可完成执行
 
Hive运算基于Hadoop的MapReduce模型,MapReduce不能保证低延迟。因此,Hive的查询页不能保证低延迟。
Hive的工作模式是:提交一个任务,等到任务结束时被通知,而不是实时查询。相对应的是,类似于Oracle这样的系统当运行小数据集的时候,响应非常快,可当处理的数据集非常大的时候,可能需要数小时。需要说明的是,hive即使在很小的数据集上运行,也可能需要数分钟才能完成。
 
总之,低延迟不是hive追求的首要目标。Hive的设计目标是:可伸缩、可扩展、容错及输入格式松耦合。
 
 
原文地址:https://www.cnblogs.com/daydayup-lin/p/13525891.html