hive对hdfs中数据进行抽象成表,可以通过sql组装m_p的过程。(更多大数据处理见:https://segmentfault.com/a/11...)。数据通过mysql和hdfs存储,存储格式用的现有文件格式,mysql存结构/hdfs存表数据(比如insert id name 4 ss,hdfs存 4ss)。只是sql到m_p的映射,这过程又比较复杂。所以这里只介绍下hive的执行过程和框架,存储的分层组织和事务的支持。

官方:Apache Hive™数据仓库软件有助于使用SQL读取,编写和管理驻留在分布式存储中的大型数据集。可以将结构投影到已存储的数据中。提供了命令行工具和JDBC驱动程序以将用户连接到Hive。
https://hive.apache.org/
适用:离线计算。用sql生成task调用map_Reduce。

clipboard.png

  • UI
  • driver
    会话和JDBC/ODBC接口
  • metadata
    Hive将元数据存储在数据库中,如mysql、derby。Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。元数据提供数据的抽象和发现能力,存于database还是文件,考虑到要随机更新、可查询,因此用database。表和元数据用来生成task
  • complier
    解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后有MapReduce调用执行。
  • 执行引擎
    执行编译器创建的执行计划的组件。该计划是一个阶段的DAG。执行引擎管理计划的这些不同阶段之间的依赖关系,并在适当的系统组件上执行这些阶段
  • 数据存储/计算
    Hive的数据存储在HDFS中,大部分的查询、计算由MapReduce完成(包含的查询,比如select from tbl不会生成MapRedcue任务)。
    将大多数查询转换为mr组合的计算(select *等不需要)转化过程比较复杂:
    https://blog.csdn.net/u010738...
    HDFS的存储:表=》分区=》桶
    1)、表:Hive中的表和关系型数据库中的表在概念上很类似,每个表在HDFS中都有相应的目录用来存储表的数据,这个目录可以通过${HIVE_HOME}/conf/hive-site.xml配置文件中,如果我有一个表wyp,那么在HDFS中会创建/user/hive/warehouse/wyp 目录(这里假定hive.metastore.warehouse.dir配置为/user/hive/warehouse);wyp表所有的数据都存放在这个目录中。
    2)、外部表:Hive中的外部表和表很类似,但是其数据不是放在自己表所属的目录中,而是存放到别处,这样的好处是如果你要删除这个外部表,该外部表所指向的数据是不会被删除的,它只会删除外部表对应的元数据;而如果你要删除表,该表对应的所有数据包括元数据都会被删除。
    3)、分区:在Hive中,表的每一个分区对应表下的相应目录,所有分区的数据都是存储在对应的目录中。比如wyp 表有dt和city两个分区,则对应dt=20131218,city=BJ对应表的目录为/user/hive/warehouse /dt=20131218/city=BJ,所有属于这个分区的数据都存放在这个目录中。
    4)、桶:对指定的列计算其hash,根据hash值切分数据,目的是为了并行,每一个桶对应一个文件(注意和分区的区别)。比如将wyp表id列分散至16个桶中,首先对id列的值计算hash,对应hash值为0和16的数据存储的HDFS目录为:/user /hive/warehouse/wyp/part-00000;而hash值为2的数据存储的HDFS 目录为:/user/hive/warehouse/wyp/part-00002。
    表文件格式支持:text/avro/jsonfile/ORC等
    数据行支持:serde/json/csv
  • 执行流程
    UI调用驱动程序的执行接口(图1中的步骤1)。
    驱动程序为查询创建会话句柄,并将查询发送到编译器以生成执行计划(步骤2)。
    编译器从Metastore获取必要的元数据(步骤3和4)。此元数据用于检查查询树中的表达式以及基于查询谓词修剪分区。由编译器生成的计划(步骤5)是阶段的DAG,其中每个阶段是m/p作业,元数据操作或对HDFS的操作。
    执行引擎将这些阶段提交给适当的组件(步骤6,6.1,6.2和6.3)。在每个任务(m/p)中,与表或中间输出相关联的反序列化器用于从HDFS文件中读取行,这些行通过关联的运算符树传递。生成输出后,它将通过序列化程序写入临时HDFS文件(如果操作不需要减少,则会在映射器中发生)。临时文件用于向计划的m/p提供数据。对于DML操作,最终临时文件将移动到表。此方案用于确保不读取脏数据(文件重命名是HDFS中的原子操作)

https://cwiki.apache.org/conf...

  • 高可用
    hive提供了跨集群(跨hadoop,一般部署需要hadoop,mysql,hive,hadoop对其中文件其实有3份备份的,为了跨hadoop高可用)基于HCatalog的发布订阅(JMS)和EXPORT和IMPORT命令
  • 事务
    锁+快照
    锁:DbLockManager 在hive的metastore 中管理所有的锁和事务。(锁和事务的信息是持久化存储的,即便server挂掉也不会有影响)这也意味着,一旦开启式了事务,之前在zookeeper中的锁行为也不在支持。为了防止客户端因为挂掉而导致事务和锁无法释放,在锁的持有者和事务的初始化器到server的metastore 间会维持一个周期性的心跳。一旦心跳超时,锁和事务就会被释放。
    需要明确事务表
    只支持快照隔离级别。当一个给定的查询启动时,它会提供该数据的一致快照。
    必须分桶
    支持了单key的update/delete。新的记录和更新,删除都存在delta files。一次事务操作创建一系列的delta files。在读取的时候,将基础文件和修改,删除合并,最后返回给查询。涉及到delta的合并和删除,Minor compaction :将已有的delta files重写到一个单独的delta file,每个分桶一个。Major compaction: 将delta文件和base 重写到一个新的base file,每个分桶一个。

梦想家
107 声望76 粉丝