• Catalyst揭秘 Day2 Catalyst源码初探


    Catalyst揭秘 Day2

    Catalyst源码初探

    这节课从源码角度来讲catalyst。

    首先有一个观点要澄清,就是技术不是越底层就越是性能和效率更高。因为除了指令执行性能以外,更重要的是架构层次,里面的核心是数据和代码的本地性问题。如果是能在内存中或者多线程运行,很多时候Java会比C语言性能高很多。

    一般对rdd的操作都没有dataframe的快,主要就是catalyst这个执行优化器的作用。

    SqlContext处理流程

    写SparkSql的程序,有一个非常核心的东西,就是SQLContext。

    SQLContext是基于SparkContext来构建的SQL和dataframe数据处理的上下文,会做一部分解析和驱动工作之后,还是会把执行以rdd的方式交给SparkContext来执行。

    从源码的注释看,SQLContext是处理结构化数据的入口,允许我们创建dataframe,并可以基于dataframe进行sql查询。
    Snip20160722_104

    首先,通过catalog,我们可以对plan进行初步处理,比如确定表名和表中的列名,生成Logical plan。

    Snip20160722_105

    其内部核心是一个Hashmap,key是表名,value是LogicalPlan,主要提供了对表管理的一系列方法。
    Snip20160722_106

    sqlParser负责对SQL语法进行分词,构建并返回一个语法树。
    Snip20160722_107

    其中ParserDialect是核心,parse方法会负责具体的分词处理。
    Snip20160722_108

    analyzer是真正的语法分析器,进行最原始的语法解析,变成logic plan。

    Snip20160722_109

    Optimizer里面有一系列的优化规则,里面都是模式匹配,可以随意加规则,而且也不需要知道所有的东西。
    Snip20160722_110

    SparkPlanner 优化物理执行计划,包含了一系列的优化策略,来优化我们物理执行的过程。
    Snip20160722_113

    QueryExecution,是SQL执行执行上下文,负责生成结果。
    Snip20160722_115

    QueryExecution中,会生成RDD。
    Snip20160722_116

    至此,我们完整走了一遍流程,可以看到sql经过一系列处理后,生成了RDD,这个印证了昨天说的整个流程过程。

    结果展现

    那么这个生成的RDD后续会如何使用,我们简单的看一句SQL的结果展现:

    从show方法开始:
    Snip20160722_117

    show中会调用take方法,进而调用head方法。
    Snip20160722_118

    head方法主要调用了collect方法。这里主要是对语句进行执行。
    Snip20160722_119

    之后会执行SparkPlan中的execute方法生成RDD。
    Snip20160722_122

    而其最终,会调用到RDD的collect方法,生成Job,进行运行。
    Snip20160722_121

    欲知后事如何,且听下回分解!

    DT大数据每天晚上20:00YY频道现场授课频道68917580

  • 相关阅读:
    DBUtils温习2
    DBUtils温习1
    C3P0连接池温习1
    JDBC复习2
    JDBC复习1
    Spring的AOP基于AspectJ的注解方式开发3
    Spring的AOP基于AspectJ的注解方式开发2
    Spring的AOP基于AspectJ的注解方式开发1
    高血压认知3
    pandas cookbook
  • 原文地址:https://www.cnblogs.com/dt-zhw/p/5696927.html
Copyright © 2020-2023  润新知