Hive以及Hive分区的那些事

1.Hive 基本概念

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射成一张表,并提供类似SQL的查询功能

  • 使用HQL作为查询接口
  • 使用HDFS存储
  • 使用MapReduce计算

2. Hive的优缺点

优点:

  • 减少开发人员的学习成本
  • 可以和impala/spark等共享数据
  • 支持UDF,自定义存储格式
  • 非常适合离线数据处理

缺点:

  • Hive实时性差
  • Hive效率低
  • Hive依托Hadoop为基础, Hadoop本身就是批处理框架, 因此具有高延迟性

总结: Hive非常适合对非实时,离线的,对响应及时性要求不高的海量数据批量计算

3. Hive架构

在这里插入图片描述

3.1 从图中可见,HIVE主要可分为三部分 :

  1. 用户接口 : Client (客户端)

    • CLI (hive shell)
    • JDBC/ODBC(java访问Hive)
    • WEBUI(浏览器访问Hive)
  2. 元数据 : Metastore

    • 表名 , 表所属的数据库
    • 表拥有的列 , 行, 分区字段
    • 表的类型 , 表数据所在目录
  3. 驱动器 : Driver

    • 解释器 : 将hive sql 转化为抽象语法树AST
    • 编译器 : 将语法树编译为逻辑执行计划
    • 优化器 : 对逻辑执行计划进行优化
    • 执行器 : 调用底层执行框架执行逻辑执行计划

不知道各位童鞋对Hive和HBase有没有一些概念混淆,下面我总结一些Hive和HBase二者的不同之处

3.2 Hive和HBase之间的不同之处

  1. Hive : 是建立在Hadoop之上为了减少Mapreduce jobs编写工作的批处理系统
    HBase : 是为了支持并弥补Hadoop对项目进行实时操作的项目

  2. 在操作RMDB数据库(关系型数据库)
    如果是全表扫描 , 就用 Hive+Hadoop
    如果是索引访问 , 就用HBase + Hadoop

  3. Hive的实时性差
    HBase的实时性强

  4. Hive本身不存储和计算数据 , 他完全依赖于HDFS和Mapreduce , Hive中的表是纯逻辑
    HBase是物理表 , 不是逻辑表 , 提供了超大内存的Hash表 , 搜索引擎通过它来存储索引 , 方便查询

  5. 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 . 分区太多的话,有什么坏处? 对于创建分区,我们要注意什么呢?

坏处 :

  1. Hive如果有太多分区,由于底层是存储在HDFS上的,HDFS上更适合存储大文件而非小文件 , 如果小文件太多会使namenode负担太重.
  2. Hive会转变为mapreduce,然后mapreduce转变为一个个Task, 这些Task都要对应一个JVM实例, 因此小文件太多会导致过多的JVM开启销毁,导致操作系统效率变低.

注意事项 :

  1. 当小分区过多时 , 我们要执行严格模式 , 这样可以避免触发一个大的Mapreduce任务(尽量减少使用Hive创建过多的分区)
  2. 合理的分区不应该有过多的分区和目录 , 并且目录下的文件应该有足够大 .
发布了7 篇原创文章 · 获赞 7 · 访问量 285

猜你喜欢

转载自blog.csdn.net/weixin_45678465/article/details/105383938