• hive介绍及架构设计


                        hive介绍及架构设计

                                               作者:尹正杰

    版权声明:原创作品,谢绝转载!否则将追究法律责任。

      我们知道MapReduce和Spark它们提供了高度抽象的编程接口便于用户编写分布式程序,它们具有极好的扩展性和容错性,能够处理超大规模的数据集。这些计算引擎提供了面向高级语言(比如Java,Python等)的编程接口,然而,考虑到分布式程序编写的复杂性,直接使用这些编程接口实现应用系统(比如报表系统)无疑会提高使用门槛,降低开发效率。考虑到SQL仍然是一种非常主流的数据分析语言,开源社区在分布式计算框架基础山构建了支持SQL的引擎,其中典型的代表是MapReduce之上的Hive以及Spark之上的Spark SQL,这些数据分析引擎通常不支持标准得到SQL,而是对SQL进行了选择性支持,并进行了适当扩展,其中最主流的数据分析语言为HQL(Hive Query Language)。

      简而言之,Hive是对非Java,python等编程者对hdfs数据做MapReduce操作。

    一.概述    

    1>.背景

        大数据计算引擎为大规模数据处理提供了解决方案,它们提供了高级编程语言(比如Java,Python等)编程接口,可让程序员很容易表达计算逻辑。但在大数据领域,仅提供对编程语言的支持是不够的,这会降低一些数据分析场景(比如报表系统)下的开发效率,也提高了使用门槛。
        为了让更多人使用这些大数据引擎分析数据,提高系统开发效率,大数据系统引入了对SQL的支持。SQL作为一种主流的数据分析语言,仍广受数据分析师欢迎,主要原因如下:
            (1)SQL能够跟现有系统进行很好的集成,现有的有JDBC/ODBC BI系统兼容。
            (2)很多工程师习惯使用SQL。
            (3)相比于MapReduce和Spark等,SQL更容易表达。
        需要注意的是,大数据SQL引擎通常不支持标准SQL。大数据SQL主要是面向数据分析(另外一类是面向事务)的,支持绝大部分标准SQL语法,并进行了适当扩展。
      为了让大家更高效地使用MapReuce和Spark等计算引擎,开源社区在计算引擎基础上构建了更高级的SQL引擎,其中典型的代表是Hive和Spark SQL。Hive提供的查询语言被成为“HQL”(Hive Query Language),该语言的跟标准的SQL语法极为相似,已经掌握SQL的工程师可以很容易学习HQL;Spark SQL提供的查询语言接近HQL,但在个别语法上稍有不同。

    2>SQL On Hadoop 

        如下图所示,目前构建在Hadoop之上的SQL引擎主要分为两类,基于计算引擎和基于MPP架构:
        (1)基于计算引擎
            这些SQL引擎是在计算引擎基础上构建的,其基本原理是将SQL语聚翻译成分布式应用程序,之后运行在集群中。典型的代表有构建在MapReduce之上的Hive和构建在Spark之上的Spark SQL。这类SQL引擎的特点是具有良好的扩展性和容错性,能够应对海量数据。
        (2)基于MPP架构
            这些SQL引擎是基于MPP架构构建的,其基本原理是将SQL翻译成可分布式执行的任务,采用Volcano风格的计算引擎并处理这些任务,任务之间的数据流动和交换由专门的Exchange运算符完成。典型的代表有Presto和Impala等。这些SQL引擎具有良好的可扩展性,但容错性较差。

    二.Hive架构

        Hive是构建在分布式计算框架之上的SQL引擎,它重用了Hadoop中的分布式存储系统HDFS/HBase和分时计算框架MapReduce/Tez/Spark等。Hive是Hadoop生态系统中的重要部分,目前是应用最广泛的SQL On Hadoop解决方案。

    1>.Hive基本架构

        Hive对外提供了三种访问方式,包括Web UI,CLI(Client Line Interface)和Thrift协议(支持JDBC/ODBC),而在Hive后端,主要包括三个服务组件构成,如下图所示:
        (1)Driver(驱动器)
            与关系型数据库的查询引擎类似,Driver实现了SQL解析,生成逻辑计划,物理计划,查询优化与执行等,它的输入是SQL语句,输出为一系列分布式执行程序(可以为MapReduce,Tez或Spark等)。
        (2)Metastore
            Hive Metastore是管理和存储元信息的服务,它保存了数据库的基本信息以及数据表的定义等,为了能够可靠地保存这些元信息,Hive Metastore一般将它们持久化到关系型数据库中,默认采用了嵌入式数据库Derby(数据存放在内存中),用户可以根据需要启用其他数据库,比如MySQL。
        (3)Hadoop
            Hive依赖与Hadoop,包括分布式文件系统HDFS,分布式资源管理系统YARN以及分布式计算引擎MapReduce,Hive中的数据表对应的数据存放在HDFS上,计算资源由YARN分配,而计算任务则来自MapReduce引擎。

        根据访问方式不同,可将Hvie分成三种部署模式,即嵌入式不模式,本地模式和远程模式。

        如上图所示,在嵌入式模式中,Metasotre和数据库(Derby)两个进程嵌入到Driver中,当Driver启动时会同时运行这两个进程,一般用于测试。

        如上图所示,在本地模式中,Driver和Metastore运行在本地,而数据库(比如MySQL)启动在一个共享节点上。

        如上图所示,在远程模式中,Metastore运行在单独一个节点上,被其他所有服务共享。使用Beeline,JDBC/ODBC,CLI个Thrift等方式访问Hive时,则采用该的是该模式,这是一种常用于生成环境下的部署模式。

      Hive是Hadoop生态系统中最早的SQL引擎,它的Metastore服务已经被越来越多的SQL引擎所支持,已经成为大数据系统的元信息标准存储仓库。比如Spark SQL,Impala和Presto等引擎均可直接读取并处理Hive Metastore中的数据表,真正实现“一份数据多种引擎”的计算方式。 

    2>.Hive查询引擎

        Hive最初是构建在MapReduce计算引擎之上的,但随着越来越多的新型计算引擎的出现,Hive也逐步支持其他更高效的DAG计算引擎,包括Tez和Spark等,如下图所示,用户可个性化指定每个HQL的执行执行引擎。

        相比于每个MapReduce计算引擎,新型DAG计算引擎采用以下优化机制让HQL具有更高的执行性能:
            (1)避免借助分布式文件系统交换数据而减少不必要的网络和磁盘IO。
            (2)将重复使用的数据缓存队列到内存中以加速读取效率。
            (3)复用资源直到HQL运行结束(比如在Spark,Executor一旦启用后不会释放,直到所有任务运行完成)。

        如上图所示,在Hive中运行以下HQL,在该HQL中,3个表进行链接操作,并按照state唯独进行交互操作:
          SELECT a.state,COUNT(*),AVERAGE(c.price)
            FROM a
            JOIN b ON (a.id = b.id)
            JOIN c ON (a.itemid = c.itemid)
            GROUP BY a.state
        (1)如果采用MapReduce计算引擎
            该HQL最终被转换成4个MapReduce作业,它们之间通过分布式文件系统HDFS交换数据,并最终由一个MapReduce作业将结果返回。在该计算过程中,中间结果要被前一个作业写入HDFS(需要写三个副本),并由下一个作业从HDFS读取数据,并进一步处理。

        (2)如果采用类似Tez或Spark的DAG计算引擎
            该HQL最终仅被转化成1个应用程序(得益于DAG引擎的通用性),该作业HQL中不同算子的数据交换可以直接通过本地磁盘或者网络进行,因而磁盘的网络IO开销较小,性能会更高。

    三.Spark SQL基本架构

        Spark SQL是构建在分布式计算框架Spark之上的结构化数据处理引擎,它不仅支持类HQL查询语言,也提供了一套结构化编程接口DataFreame/DataSet。它是一个异构化数据处理引擎,支持多种数据源,包括HDFS(各种文件格式),Hive,关系型数据库等,用户可以使用Spark SQL提供的类HQL语言和结构化编程结构处理这些数据源中的数据。

        Spark SQL基本架构如上图所示,主要由四层构成:
        (1)用户接口层
            Spark SQL提供了两套访问接口:    
              1)类HQL语言
                  该语言兼容绝大部分HQL语法,支持CLi,JDBC/ODBC等访问方式。它可以于Hive无缝集成,直接存取Hive Metastore中的数据库和数据表。
              2)结构化编程接口DataFrame/DataSet
                  众所周知,SQL表达能力是有限的,对于复杂的数据分析,比如机器学习算法实现,SQL很难胜任。
                  为了解决SQL的缺点,Spark SQL引入了一套结构化编程接口 DataFrame/DataSet,基于这套API,用户可以灵活控制自己的计算逻辑,目前是Spark生态系统中最重要的编程接口,而Spark Steaming,Mlib和graphX等系统均基于这套API实现自己的引擎和编程接口。
        (2)SQL引擎层
            Spark SQL引擎层主要职责是将HQL或DataFrame/DataSet程序编译成可分布式运行的程序,设计生成逻辑计划,物理计划,查询优化于执行等。其最重要的组件就是查询优化器catalyst,确保生成最优化的分布式程序。
        (3)计算引擎层
            SQL引擎层的输入是HQL或DataFrame/DataSet程序,而输出则是基于RDD模型的Spark分布式计算程序,这些程序会直接运行在Spark计算引擎层。
        (4)存储层
            Spark SQL另一个强大之处就是对数据源进行抽象,内置了对大量存储引擎的支持,包括HDFS(支持各种数据存储格式Text和Sequence File,列式存储格式Parquet和ORC等),Hive,各种关系行数据库等。用户也可以根据需要将特定数据存储引擎接入Spark SQL,进而利用其强大而灵活的引擎进行数据分析。

    四.Spark SQL和Hive对比

        Spark SQL于Hive均支持类SQL语言,能够很方便地处理海量数据,但它们也有明显的区别,如下图所示:

        整体上说,在表达能力和数据源支持方面,Spark SQL更胜一筹,在表达能力方面Spark SQL不仅仅支持SQL,也支持更加灵活的DataFrame与DataSet API,而对数据源支持方面,Spark SQL借助data source API,适合操作多种异构数据源,在查询引擎支持方面,Hive借助插拔是引擎设计,则此Spark SQL更具灵活性。

    五.博主推荐阅读

    链接一:Hive快速入门篇之Hive环境搭建(https://www.cnblogs.com/yinzhengjie/p/9154324.html 。

    链接二:Hive快速入门篇之HQL的基础语法(https://www.cnblogs.com/yinzhengjie/p/9154339.html)。

    链接三:HQL基本语法及应用案例(https://www.cnblogs.com/yinzhengjie/p/10847527.html)。

  • 相关阅读:
    qt的.pro配置总结
    【GOJ 1489】Monster Hunter
    CPU 杂谈
    【CF 1061C|GOJ 3505】Multiplicity
    【CF 1039D|GOJ 3502】You Are Given a Tree
    我跳过的坑
    【CF 1101D|GOJ 3501】GCD Counting
    【HDU 5269|GOJ 739】xor的最低位
    beta阶段组间的140字互评
    【第七周】【新蜂站会】3
  • 原文地址:https://www.cnblogs.com/yinzhengjie/p/10836132.html
Copyright © 2020-2023  润新知