1.Hive 基本概念
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射成一张表,并提供类似SQL的查询功能
- 使用HQL作为查询接口
- 使用HDFS存储
- 使用MapReduce计算
2. Hive的优缺点
优点:
- 减少开发人员的学习成本
- 可以和impala/spark等共享数据
- 支持UDF,自定义存储格式
- 非常适合离线数据处理
缺点:
- Hive实时性差
- Hive效率低
- Hive依托Hadoop为基础, Hadoop本身就是批处理框架, 因此具有高延迟性
总结: Hive非常适合对非实时,离线的,对响应及时性要求不高的海量数据批量计算
3. Hive架构
3.1 从图中可见,HIVE主要可分为三部分 :
-
用户接口 : Client (客户端)
- CLI (hive shell)
- JDBC/ODBC(java访问Hive)
- WEBUI(浏览器访问Hive)
-
元数据 : Metastore
- 表名 , 表所属的数据库
- 表拥有的列 , 行, 分区字段
- 表的类型 , 表数据所在目录
-
驱动器 : Driver
- 解释器 : 将hive sql 转化为抽象语法树AST
- 编译器 : 将语法树编译为逻辑执行计划
- 优化器 : 对逻辑执行计划进行优化
- 执行器 : 调用底层执行框架执行逻辑执行计划
不知道各位童鞋对Hive和HBase有没有一些概念混淆,下面我总结一些Hive和HBase二者的不同之处
3.2 Hive和HBase之间的不同之处
-
Hive : 是建立在Hadoop之上为了减少Mapreduce jobs编写工作的批处理系统
HBase : 是为了支持并弥补Hadoop对项目进行实时操作的项目 -
在操作RMDB数据库(关系型数据库)
如果是全表扫描 , 就用 Hive+Hadoop
如果是索引访问 , 就用HBase + Hadoop -
Hive的实时性差
HBase的实时性强 -
Hive本身不存储和计算数据 , 他完全依赖于HDFS和Mapreduce , Hive中的表是纯逻辑
HBase是物理表 , 不是逻辑表 , 提供了超大内存的Hash表 , 搜索引擎通过它来存储索引 , 方便查询 -
Hive需要用HDFS进行存储文件,需要用到Mapreduce计算框架
HBase是列存储 , 底层存储 , HDFS只是放文件的系统 , HBase是负责组织文件进行数据处理的
总结 : Hive和HBase是两种基于Hadoop的不同技术 , Hive是类SQL , 依靠Mapreduce计算框架的引擎 . HBase是在Hadoop基础之上的NoSQL的Key/Value数据库. 二者可以同时使用 , Hive用来进行全天的统计查询 , HBase可以用来进行搜索时的实时查询 , 数据可以从Hive写到HBase,再从HBase写回Hive中, 灵活运用是关键 .
4. Hive分区
-
什么是hive分区 : 就是一种对表进行粗略划分的机制,可以实现加快查询速度的组织形式.
-
在使用分区时, 在表目录下会有相应的子目录,当查询时添加了分区谓词,那么该查询会直接定位到相应的子目录中进行查询,避免全表查询,提成查询效率.
-
注意事项:
1 . hive的分区使用的表外字段,分区字段是一个伪列但是可以查询过滤。
2 . 分区字段不建议使用中文
3 . 不太建议使用动态分区。因为动态分区将会使用mapreduce来查询数据,如果分区数量过多将导致namenode和yarn的资源瓶颈。所以建议动态分区前也尽可能之前预知分区数量。
4 . 分区属性的修改均可以使用手动元数据和hdfs的数据内容
5 . 分区太多的话,有什么坏处? 对于创建分区,我们要注意什么呢?
坏处 :
- Hive如果有太多分区,由于底层是存储在HDFS上的,HDFS上更适合存储大文件而非小文件 , 如果小文件太多会使namenode负担太重.
- Hive会转变为mapreduce,然后mapreduce转变为一个个Task, 这些Task都要对应一个JVM实例, 因此小文件太多会导致过多的JVM开启销毁,导致操作系统效率变低.
注意事项 :
- 当小分区过多时 , 我们要执行严格模式 , 这样可以避免触发一个大的Mapreduce任务(尽量减少使用Hive创建过多的分区)
- 合理的分区不应该有过多的分区和目录 , 并且目录下的文件应该有足够大 .