大数据体系与SQL简介| 青训营笔记

123 阅读3分钟

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

学习大数据课程的第一课,后面持续更新...
"One SQL rules data ALL."👌 课前预习:

🌸以下是课程内容的思维导图,本笔记用于知识点详解和课外补充。 大数据概况与SQL.svg

大数据体系:

声明:参考字节跳动青训营PPT。--侵删

image.png

SQL

SQL成为了大数据主流的接口。 主要负责大数据框架中的分析引擎部分。

SQL主要流程

graph LR
SQL--String-->Parser --AST--> Analyzer--Logical Plan-->Optimizer--Physical Plan--> Executer

Parser

语法分析器,将输入字符串经过词法分析或语法分析,转换为抽象语法树AST(abstract syntax tree)。

graph LR
字符串 --词法分析--> token--语法分析-->AST
  • 实现方式:
  • 递归下降-->click house
  • Flex Bison-->PostgreSQL
  • JavaCC -->Flink
  • Antlr --> Presto,Spark

Analyzer&Logical plan

  1. logical plan (left-deep tree)

    JOIN右边一定是一个SCAN表格类型

  2. analyzer

  • 合法性检查
  • 检查并绑定元信息
  • AST->Logical Plan

SQL查询优化

最复杂的部分,需要考虑边界case,以及是NP问题。 数据量很大,所以好的查询优化算法很重要。❗

phsical plan 和executer。

  • 数据亲和性: 每个节点最好读本地,跨节点网络传输读取速度会慢。所以感知数据分布,使用物理分布。以实现最小化网络传输的目的.
  • 执行:
  • 单机并行
  • 多机并行
shuffle算子:
graph LR
计划PLAN-->拆分成物理计划片段segment-->executer

查询优化器

Top-down

Bottom-up

RBO

特点

关系代数等价语义
启发式规则
访问表的元信息catalog,不访问表数据data

查询优化器学习资源:

论述:

关系代数:

关系代数的基本运算:这些运算的运算数是一个或两个关系,预算结果产生一个新的关系: union, intersection, selection, projection, Cartesian product 和rename

优化原则
  1. 优化前代码
SELECT pv.siteld, user.name 
FROM pv JOIN user 
ON pv.siteId = user.siteId AND pv.userId = user.id 
WHERE user.siteld > 123;
  1. 列裁剪

  2. 谓词下推

4.传递闭包

5.Runtime Filter

CBO(cost-based bptimizer)

模型估计执行计划的代价,选择最小代价的执行计划.

算子代价:

CPU,内存,磁盘1/O,网络1/0等代价

  • 算子输入数据的统计信息有关:输入、输出结果的行数,每行大小.
    • 叶子算子Scan: 通过统计原始表数据得到
    • 中间算子: 根据一定的推导规则,从下层算子的统计信息推导得到
  • 具体的算子类型,以及算子的物理实现有关

例子:

SparkJoin算子代价=weightrowcount+(1.0weight)sizeSpark Join 算子代价= weight * row_count + (1.0 - weight) * size

算子类型和输入数据和物理实现???
流程:
graph LR
统计信息+推导规划 --> 计算算子代价 --> 计算执行计划代价-->执行计划枚举
统计信息:
  • 原始表统计信息

  • 推导统计信息

    • 基数cardinality
    • 选择率selectivity
  • 收集方式:

    1. DDL
    CREATE TABLE REGION( 
        R_REGIONKEY INT NOT NULL,
        R_NAME CHAR(25)NOT NULL,
        R_COMMENT VARCHAR(152) 
    )DUPLICATE KEY(R_REGIONKEY)
    DISTRIBUTED BY HASH(R_REGIONKEY)BUCKETS 1 
    PROPERTIES ("stats_columns"="R_NAME");
    
    1. 手动执行,触发数据库收集
    ANALYZE TABLE table_name COMPUTE STATSICS FOR COLUMNS column-name1, column-name2, 
    
    1. 动态采样
    SELECT count(*) FROM table_name
    
  • 统计信息推导规则

    假设列列独立,且单个列的值是服从均匀分布

执行计划枚举

贪心算法或者动态规划

例子:实现三个表JOIN,先分解为两个表JOIN,然后算法优化

SELECT*FROMR,S,T 
WHERE R.a=S.a 
AND S.b=T.b
两表JOIN:
  • Hash
  • SortMerge