大数据中sql的处理流程|青训营笔记

203 阅读5分钟

这是我参与「第四届青训营 」笔记创作活动的的第1天

笔者对大数据还是停留在使用层面,理解还不够深入,但是面试一般爱问这些深入的东西,所以也下定决心要学好这些内容,根据老师所讲和自己的思考,多记录一下大数据的内容方便日后复习。

1.SQL在大数据中的位置

正如课上老师所讲"One SQL rules big data all"一样,可以看出来在大数据领域中SQL的重要性,SQL主要位于大数据的分析引擎上面,其中根据分析处理的方式不同,又有以下不同的分析处理引擎:

  1. 批式分析处理:Spark,Hive,MapReduce等
  2. 实时分析处理:Flink等
  3. 交互分析处理:Presto,ClickHouse,Doris等

2.SQL的执行流程

和我们所熟知的那些关系型数据库一样,它们都是SQL,有自己的执行流程,它们很多地方都是相似的。 SQL的处理流程如下图所示: SQL执行流程.jpg 用语言描述一下就是:一条SQL语句通过Parser(词法剖析器)处理后,由String字符串变为AST(abstract syntax tree:抽象语法树),然后AST通过Analyzer(分析器)检查分析SQL的合法性变为Logical Plan(逻辑计划树),经过查询优化器优化后变为Physical Plan(物理执行计划),最后由Executor(执行器)完成执行。

下面是对老师课上所讲对各个阶段的详细说明记录:

  1. Parser(词法剖析器)

    • 把sql语句变成抽象语法树结构(AST),有以下两个阶段:

      • 词法分析阶段:拆分字符串,得到关键字、字符串、数值、运算符号等token。
      • 语法分析阶段:将token乘除AST node,也就是把词条按照定义的语法规则组装成抽象语法树结构。
    • 实现:递归下降(Click House),Flex和Bison(PostgreSQL),JavaCC(Flink),Antlr(presto,spark)

  2. Analyzer(分析器)

    • 访问数据库、表、列的元信息并进行绑定
    • 判断 SQL 是否合理,比如数据库,表和列名是否存在,列的数据类型是否正确,或者是一些函数如min/max/avg的输入是否是数值。
    • 最终将 AST 转换成逻辑计划树(在某些系统中这个工作由一个 Converter 完成)
  3. Logical Plan(逻辑计划树)

    • 作用:逻辑地描述SQL对应分步骤的计算操作
    • 计算操作:算子(operator)
    • 所谓逻辑计划树,可以理解为逻辑地描述一个 SQL 如何一步步地执行查询和计算,最终得到执行结果的一个分步骤地计划。树中每个节点是是一个算子,定义了对数据集合的计算操作(过滤,排序,聚合,连接等),边代表了数据的流向,从孩子节点流向父节点。之所以称它为逻辑的,是因为算子定义的是逻辑的计算操作,没有指定实际的算法,比如对于逻辑的排序算子,逻辑计划树里没有指定使用快排还是堆排。如下面的例子:

    • SELECT country.name, SUM(weblog.bytes) as total
      FROM country
          INNER JOIN geoip ON country.id = geoip.country_id
          INNER JOIN weblog ON geoip.host = weblog.host
      WHERE weblog.reply = "200" and weblog.host is not null
      GROUP BY country.name
      ORDER BY total
      LIMIT 10
      

      上述SQL语句转为逻辑计划树如下图

逻辑执行计划.jpg

  1. Optimizer(查询优化器)

    • SQL 是一种声明式语言,用户只描述做什么,没有告诉数据库怎么做。
    • 查询优化的目标是为 SQL 找到一个正确的且执行代价最小的执行计划。
    • 一般 SQL 越复杂,Join 的表越多,数据量越大,查询优化的意义就越大,因为不同执行方式的性能差别可能有成百上千倍
  2. Physical Plan(物理执行计划)

    • 优化器的输出是一个分布式的物理执行计划。

    • 分布式物理执行计划的目标是在单机 Plan 的基础上最小化数据移动和最大化本地 Scan,生成 PlanFragment 树。

      • PlanFragment:执行计划字数
      • 它的目标是进行最小化的网络数据传输
      • 利用数据的物理分布(数据亲和性)
      • 增加Shuffle算子
    • 一个 PlanFragment 封装了在一台机器上对数据集的操作逻辑。每个 PlanFragment 可以在每个 executor 节点生成 1 个或多个执行实例,不同执行实例处理不同的数据集,通过并发来提升查询性能。

    • Plan 分布式化的方法是增加 shuffle 算子,执行计划树会以 shuffle 算子为边界拆分为PlanFragment。

    • 上个例子的具体的物理执行计划如下图:

物理执行计划.jpg

  1. Executor(执行器)

    • Executor 按照物理执行计划扫描和处理数据,充分利用机器资源(CPU 流水线,乱序执行,cache,SIMD)

3.小节

  1. One SQL rules big data all
  2. SQL需要依次经过Parser, Analyzer, Optimizer 和Executor的处理
  3. 查询优化器是数据库的大脑,在大数据场景下对查询性能至关重要
  4. 查询优化器需要感知数据分布,充分利用数据的亲和性
  5. 查询优化器按照最小化网络数据传输的目标把逻辑计划拆分成多个物理计划片段

今日总结:老师讲的很好,自己基础还是太差了,听得有些吃力,多做笔记多复习吧。