【4.分布式计算】hadoop-hive

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的执行过程和框架,存储的分层组织和事务的支持。mysql

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

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,每一个分桶一个。
相关文章
相关标签/搜索