开源SQL-on-Hadoop系统一览

引言

查询分析是大数据要解决的核心问题之一,而SQL作为查询分析中使用最简单、最广泛的的语言之一,必然而然的催生了许多支持在Hadoop上使用SQL的系统,这就是所谓的SQL-on-Hadoop系统,其中大众熟知的Hive就是最早的SQL-on-Hadoop系统。

经过若干年的发展,SQL-on-Hadoop系统已经百花齐放,按照架构划分这些系统大致可以分为以下几类:

  • MapReduce架构系统:如Hive,这类系统是在MapReduce计算框架上封装了一个SQL语义层,在运行过程中把SQL转换为MapReduce程序来执行
  • MPP架构系统:如Impala、Presto、Drill等,这类系统采用MPP(Massively Parallel Processing)架构,而非MapReduce
  • 预计算系统:如Druid、Kylin等,这类系统主要特点是对数据进行预计算,并将结果保存,而在查询时直接获取相应结果值

本文主要是对这些系统做了一个基本总结,并简单介绍了一些主流系统的架构以及处理流程。下表是按照时间顺序,对这些系统的一个概述,包括技术特点和主导公司等。

项目名称时间点技术特点主导公司
Apache Hive2008年进入Apache,2010年毕业一款基于HDFS的MapReduce计算框架,提供类SQL的数据查询功能,本质是将SQL转换为MapReduce任务运行初期由Facebook开发,后被各大公司广泛接受
Apache Spark2010年进入Apache,2014年毕业数据在内存中以RDD(Resilient Distributed Datasets)表示,DataFrame是其核心编程抽象,同时也支持交互式查询和流计算Databricks
Cloudera Impala2012年进入Apache,2017年11月毕业一款使用C/C++实现的MPP SQL查询引擎,使用HDFS作为存储,并支持列存Cloudera
Apache Drill2012年进入Apache,2014年毕业以Google Dremel论文为基础,一个MPP数据查询引擎,支持schema free的交互式数据查询MapR
Presto2013年开源基于内存的计算引擎,本身并不存储数据,支持跨数据源的级联查询Facebook
Stinger Initiative2013年对Hive的性能优化和提升Hortonworks
Apache Phoenix2013年进入Apache,2014年5月毕业构建在HBase上的一个SQL层初期由Salesforce开发
Apache Tajo2013年进入Apache,2014年5月毕业基于Hadoop的数据仓库和SQL数据查询执行引擎由Database Lab., Korea University开发
Apache Flink2014年4月进入Apache,2014年12月毕业流式的数据流执行引擎,基于流计算来模拟批计算,分别提供了流处理和批处理APIData Artisans
Apache Kylin2014年11月进入Apache,2015年11月毕业使用CUBE技术做多维数据预计算和聚合初期由ebay开发,现由Kyligence主导
Apache HAWQ2015年进入Apache,2018年5月毕业Hadoop原始大规模并行SQL分析引擎,支持ACID事物特性Hortonworks
Apache Trafodion2015年进入Apache,孵化中构建在HBase上的一个SQL层HP实验室

Apache Hive

Apache Hive是Hadoop生态系统中最早的SQL引擎,它可以将结构化数据文件映射为一张数据库表,并提供类SQL查询功能。Hive本质上是在MapReduce计算框架上封装了一个SQL语义层,并在运行过程中把SQL转换为MapReduce程序来执行。

Hive通过用户交互接口接收SQL后,其Driver结合元数据将SQL翻译成MapReduce程序,并提交到Hadoop中执行,最后将执行结果输出,其架构如下图所示:

主要组成部分包括:

  • user interface:即用户接口,包含CLI(命令行),JDBC/ODBC等
  • Metastore:即元数据,包括表名、表的数据所在目录等;默认元数据存储在自带的derby数据库中,推荐使用MySQL
  • Driver:即驱动器,包含以下几个组件:

    • 解析器(SQL Parser):将SQL转换成抽象语法树(AST),并对AST进行语法分析
    • 编译器(Compiler):将AST编译生成逻辑执行计划
    • 优化器(Query Optimizer):对逻辑执行计划进行优化
    • 执行器(Execution):把逻辑执行计划转换成可以运行的物理计划

Hive提供的类SQL查询功能避免了开发人员书写复杂的MapReduce程序,极大的简化了MapReduce程序的开发,大大减少了相应的学习成本。随着技术的不断进步,Hive的执行引擎也不断发展,尤其是有了Tez之后,其性能有了很大的改进。不过,其不足依旧很明显,即处理速度慢,因而比较适合运行在批处理场景中,而不适合交互式查询等对时延要求高的场景中。

Apache Spark

Spark是一个通用的大数据计算框架,期望使用一个技术栈来解决大数据领域包括批处理、流计算、交互式查询、图计算和机器学习在内的各种计算任务,其软件栈如下图所示:

其中的Spark SQL组件是一个用于处理结构化数据的组件,它吸收了一个叫Shark(Hive-on-Spark)的项目。Spark SQL中最重要的一个概念就是DataFrame,它是带有Shema信息的RDD,类似于传统数据库中的二维表格。Spark SQL支持将多种外部数据源的数据转化为DataFrame,包括Json、Parquet等,并可以通过将其注册为临时表,然后使用SQL来处理和分析这些数据。Spark SQL的运行流程包含以下几步,如图所示:

包含以下几个步骤:

  1. SQL语句经过SqlParser解析成UnresolvedLogicalPlan
  2. Analyzer结合catalog进行绑定,生成LogicalPlan
  3. Optimizer对LogicalPlan优化,生成OptimizedLogicalPlan
  4. SparkPlan将OptimizedLogicalPlan转换成PhysicalPlan
  5. prepareForExecution()将PhysicalPlan转换成executedPhysicalPlan
  6. PhysicalPlan执行得到最终结果RDD

传统的MapReduce程序中Map和Reduce阶段的结果都要写磁盘,这大大降低了系统性能。Spark使用RDD作为基本数据结构,数据常驻内存,所以计算速度得到了很大提高。但是当内存不足时,其计算速度会大大降低,甚至容易出现OOM错误。

Apache Impala

Apache Impala是一款基于HDFS/HBase的MPP查询引擎,其架构如下图所示:

主要组成部分包括:

  • Impalad: 即Impala Daemon(Impala守护进程);它运行在集群的每个node上,负责接收客户端的查询请求,对查询进行并行化处理。其中接收查询请求的Impalad为Coordinator,Coordinator对查询语句处理后生成执行计划,再把执行计划分发给具有相应数据的其它Impalad执行,其他Impalad执行完成后,把结果发送回
    Coordinator,由Coordinator构建最终结果,并返回给客户端。另外,Impalad进程也会和Statusstore通信以确认哪些Impalad是可以正常工作的
  • Statestore: 负责跟踪和检查Impalad健康状态的进程,由statestored进程表示;它负责处理Impalad的注册订阅,并且和各个Impalad进程保持心跳链接
  • CLI: 提供给用户查询使用的命令行工具(Impala Shell使用python实现),同时Impala还提供了Hue,JDBC, ODBC使用接口

Impala没有使用MapReduce计算框架,而是使用与商用并行关系数据库中类似的分布式查询引擎,并且Impala的中间结果不写入磁盘,而是通过网络以流的形式传递,这大大降低了IO开销,因而Impala的查询速度非常快。但是Impala缺点也很明显,如对用户自定义函数支持不好、不支持Transforms、不支持查询期的容错等。

Apache Drill

Apache Drill是一个分布式的MPP SQL引擎,是开源版本的Google Dremel。它支持对本地文件、HDFS、HBASE等数据进行数据查询,也支持对如JSON等schema-free的数据进行查询,其架构如下图所示:

从上图可以看到,Drill的核心是DrillBit,它主要负责接收客户端的请求,处理查询,并将结果返回给客户端。 Drill的查询流程包括以下步骤:

  1. drill客户端发起查询,任意DrilBit都可以接受来自客户端的查询
  2. 收到请求的DrillBit成为驱动节点(Foreman),对查询进行分析优化生成执行计划,之后将执行计划划分成各个片段,并确定合适的节点来执行
  3. 各个节点执行查询片段,并将结果返回给驱动节点
  4. 驱动节点将结果返回给客户端

Presto

Presto是一个分布式的MPP查询引擎,支持多种数据源,包括Hive、RDBMS、Redis等,并且可以跨数据源查询。Presto的基本架构如下图所示:

主要组成部分包括:

  • coodinator:用于解析查询SQL,生成执行计划,并分发给worker执行
  • discovery server:worker上线后,向discovery server注册。coodinator分发任务前,需要向discovery server获取可以正常工作worker列表
  • worker:具体执行任务的工作节点

Apache Phoenix

Apache Phoenix是一个运行在HBase上的SQL框架,其本质是用Java写的基于JDBC API操作HBase的开源SQL引擎,通过Phoenix可以像使用MySQL等关系型数据库一样操作HBase中的表。Apache Phoenix支持ACID事务功能的标准SQL,它将SQL编译成原生HBase的scan语句,其架构如下图所示:

从上图可以看到:

  • Phoenix的JDBC driver是在HBase的client端
  • Phoenix在HBase的RegionServer上

Apache Kylin

Apache Kylin是一个开源的分布式分析引擎,提供Hadoop/Spark之上的SQL查询接口及多维分析(OLAP)能力。Kylin的核心是预计算,即对可能用到的度量进行预计算,并将结果保存为Cube以便查询时直接访问。Kylin的架构如下图所示:

主要组成部分包括:

  • 离线构建部分:根据元数据的定义,从数据源(如Hive)抽取数据,并通过MapReduce Job构建Cube,构建后的Cube保存在HBase中
  • 在线查询部分:用户通过RESTful API、JDBC/ODBC等接口提交SQL,REST服务把SQL交给查询引擎处理。查询引擎解析SQL,生成逻辑执行计划,之后将其转化为基于Cube的物理执行计划,最后读取预计算生成的Cube并返回结果

Apache Flink

Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时提供流处理和批处理两种类型应用的功能。区别于其他流处理系统,Flink作为流处理时,把输入数据流看做是无界的,而批处理被作为一种特殊的流处理,只是它的输入数据流被定义为有界的。

基于同一个Flink运行时(Flink Runtime),Flink分别提供了流处理和批处理API,为了实现API层流与批的统一,Flink提供了一种关系型API,即Table & SQL API。

Apache HAWQ

Apache HAWQ的全称是Hadoop With Query,是一个Hadoop原生的MPP SQL引擎。HAWQ能直接在HDFS上读写数据,而不需要connector,并支持ACID事务特性,其架构如下图所示:

主要组成部分包括:

  • HAWQ master:负责处理客户端提交的SQL,解析优化后向集群Segment节点下发查询,合并从各Segemt节点返回的结果,并返回最终结果给客户端。HAWQ master内部由HAWQ Resource Manager,HAWQ Catalog Service,HAWQ Fault Tolerance Service,HAWQ Dispatcher等组件组成。HAWQ master还需要维护global system catalog,global system catalog是系统表的集合,其中包含了HAWQ集群的元数据信息
  • HAWQ segment:集群的计算节点,本身不存储任何数据,所有数据都存储在HDFS上。HAWQ master在分派SQL请求给Segment时会附带相关的元数据信息,元数据信息包含了表的HDFS URL,Segment通过HDFS URL访问需要处理的数据
  • PXF agent:PXF(Pivotal eXtension Framework)的服务。PXF是一个允许HAWQ访问外部系统数据的可扩展框架,其中内置了访问HDFS文件,HBase表以及Hive表的连接器,PXF还可以通过和HCatalog集成来直接访问Hive表

结束语

SQL-on-Hadoop系统经过了若干年的发展,已经有了很大的提高,但是目前各个系统仍然在不断完善提高,例如:

  • 执行计划方面:更强的优化器
  • 执行效率方面:支持code generation、vectorization等
  • 存储格式方面:支持更高效列存等

未来也会出现更多技术、更多系统。本文主要介绍了目前几大开源的SQL-on-Hadoop系统及其架构,包括Hive、Spark、Presto、Drill等。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519801.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PL/SQL中查询Oracle大数(17位以上)时显示科学计数法的解决方法

PL/SQL查询时,如果Number(17)以上的大数,会显示为科学计数法 解决方法: TOOLS->PREFERENCES->WINDOW TYPE->SQL WINDOW下选中Number fields to_char即可。

虎牙直播在微服务改造方面的实践和总结

相比文字和图片,直播提供了人与人之间更丰富的沟通形式,其对平台稳定性的考验很大,那么倡导“以技术驱动娱乐”的虎牙直播(以下简称“虎牙”)是如何在技术上赋能娱乐,本文将为您介绍虎牙在DNS、服务注册、C…

区块链人才缺口明年将达顶峰,核心开发者年入百万很正常

区块链技术一直备受争议,庞氏骗局、泡沫明显、去中心化无意义,技术无法真正建立信任、区块链技术并不能真正履行货币职能、比特币矿机耗电量大、浪费资源等等。2018年,加密货币市场总价值损失超过80%,链圈就此进入阴影。区块链技术…

阿里云移动端播放器高级功能---截图和音频波形

基本介绍 如果用户对视频播放中的某一帧画面特别感兴趣,可以使用截图功能将这一帧视频保存起来。另外有一种场景想知道是否有声音,或者想感知声音的大小震动频率等,可以通过显示一个声音的波形来形象的表示。如下图所示: 那么播放…

AES和RSA前后端加解密

先了解AES和RSA加密算法 AES算法 1、运算速度快,在有反馈模式、无反馈模式的软硬件中,Rijndael都表现出非常好的性能。 2、对内存的需求非常低,适合于受限环境。 3、Rijndael 是一个分组迭代密码, 分组长度和密钥长度设计灵活。 4、AES标…

PMBOK第六版最新十大大知识领域ITTO思维导图-干货!

PMBOK学习过程中,ITTO(输入、工具、技术、输出)是每年必考的内容,掌握ITTO的脉络,对学习和梳理PMP非常有帮助。知道这个过程要做什么,为什么做,做完有什么成果。也是项目经理必备的技能之一。 …

这个情人节,工程师用阿里云来试着表达不一样的爱意

年轻的时候谈的恋爱就像TCP链接,恋爱时三次握手即可,可分手时却分了四次。而常常久久的爱情,更像是icmp协议,无论对方身在何处,无论是否是可靠连接,无论你何时去ping她/他,她/他都默默地响应你。…

云+X案例展 | 金融类:金山云为新网银行重塑金融服务提供云计算动力

本案例由金山云投递并参与评选,CSDN云计算独家全网首发;更多关于【云X 案例征集】的相关信息,点击了解详情丨挖掘展现更多优秀案例,为不同行业领域带来启迪,进而推动整个“云行业”的健康发展。作为国内第三家、中西部…

对于AES和RSA算法的结合使用以及MD5加盐注册登录时的密码加密

RSA和AES结合使用 接上篇的RSA和AES算法加密之后,AES对称算法对数据量大的加密比较快,而RSA公私钥加密的话会影响加密效率,但是AES的加密与解密的密钥是一致的,导致密钥不能外泄,密钥在网络传输过程中,很有…

Unity人物移动的几种方法

Unity人物移动的几种方法 方法一:transform.Translate世界坐标系移动自身移动的案例 方法二:CharacterController.Move(vector dir)按照世界坐标轴移动按照自身坐标轴移动 方法三:CharacterController.SimpleMove&…

可应用于实际的14个NLP突破性研究成果(四)

可应用于实际的14个NLP突破性研究成果(一) 可应用于实际的14个NLP突破性研究成果(二) 可应用于实际的14个NLP突破性研究成果(三) 11.对序列建模的通用卷积和递归网络的实证评估作者:SHAOJIE …

量子通信,到底是什么工作原理?

戳蓝字“CSDN云计算”关注我们哦!作者 | 小枣君责编 | 阿秃今天,小枣君要和大家聊的是“量子通信”。最开始计划写这个专题的时候,小枣君的内心是很纠结的。鲜枣课堂的目的,就是传递“普通人都能听懂”的知识。每一个知识点专题&a…

图(关系网络)数据分析及阿里应用

2019年1月18日,由阿里巴巴MaxCompute开发者社区和阿里云栖社区联合主办的“阿里云栖开发者沙龙大数据技术专场”走近北京联合大学,本次技术沙龙上,阿里巴巴资深技术专家钱正平为大家分享了大数据技术背景下图数据的应用前景,以及阿…

架构的“一小步”,业务的一大步

前言: 谈到“架构”这两个字,会有好多的名词闪现,比如:分层架构、事件驱动架构、DDD、CQRS等。亦或者一堆的软件设计原则,如:KISS原则(Keep it Simple and Stupid)、SOLID原则(单一责任原则、开…

牵手大企,关于图形计算、HPC与AI,NVIDIA言有尽而意无穷!

戳蓝字“CSDN云计算”关注我们哦!作者 | 晶少出品 | CSDN云计算(ID:CSDNcloud)在黄仁勋看来,随着摩尔定律消亡,GPU加速才是撬动未来高性能计算发展的有力杠杆。有数据显示,目前NVIDIA已经销售了…

如何合理的规划jvm性能调优

JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响。但也有一些基础的理论和原则,理解这些理论并遵循这些原则会让你的性能调优任务将会更加轻松。为了更好的理解本篇所介绍的内容。你需要已经了解和遵循以下内…

如何衡量研发效能?阿里资深技术专家提出了5组指标

阿里妹导读:新的一年,相信很多产品技术团队把研发效能提升列为重要的目标,甚至还有团队为此专门成立了项目组。然而,到底什么是好的研发效能,却很少有人能够表达清楚。标准不清晰,又何谈提升? …

官宣!2020年,这5类程序员要过苦日子!网友:明年咋活?!

2020年就要来了,有人说:经历了2019年的“市场变革”后,未来这一年将会至关重要,是决定各自命运的定型年。那么对于程序员来说,明年的风向标是如何?哪些编程语言会持续大热,哪些要做好被“淘汰”…

Perseus-BERT——业内性能极致优化的BERT训练方案【阿里云弹性人工智能】

一,背景——横空出世的BERT全面超越人类 2018年在自然语言处理(NLP)领域最具爆炸性的一朵“蘑菇云”莫过于Google Research提出的BERT(Bidirectional Encoder Representations from Transformers)模型。作为一种新型的…

Kubernetes的共享GPU集群调度

问题背景 全球主要的容器集群服务厂商的Kubernetes服务都提供了Nvidia GPU容器调度能力,但是通常都是将一个GPU卡分配给一个容器。这可以实现比较好的隔离性,确保使用GPU的应用不会被其他应用影响;对于深度学习模型训练的场景非常适合&#…