`

Spark SQL运行 过程 抄的别人的,记录 学习

 
阅读更多
抄的别人的,觉得写的特别好


val FILESOURCE_TABLE_RELATION_CACHE_SIZE =
    buildStaticConf("spark.sql.filesourceTableRelationCacheSize")


org.apache.spark.sql.catalyst.catalog.SessionCatalog#tableRelationCache

  private val tableRelationCache: Cache[QualifiedTableName, LogicalPlan] = {
    val cacheSize = conf.tableRelationCacheSize
    CacheBuilder.newBuilder().maximumSize(cacheSize).build[QualifiedTableName, LogicalPlan]()
  }

这里记录的是  QualifiedTableName 和 LogicalPlan 的对应关系。

每个表 和这个表的关系



这里是处理了刷新表  ,这里有好几个 Map 都存了什么
tableRelationCache
tempTables
globalTempViewManager



def refreshTable(name: TableIdentifier): Unit = synchronized {
    val dbName = formatDatabaseName(name.database.getOrElse(currentDb))
    val tableName = formatTableName(name.table)

    // Go through temporary tables and invalidate them.
    // If the database is defined, this may be a global temporary view.
    // If the database is not defined, there is a good chance this is a temp table.
    if (name.database.isEmpty) {
      tempTables.get(tableName).foreach(_.refresh())
    } else if (dbName == globalTempViewManager.database) {
      globalTempViewManager.get(tableName).foreach(_.refresh())
    }

    // Also invalidate the table relation cache.
    val qualifiedTableName = QualifiedTableName(dbName, tableName)
    tableRelationCache.invalidate(qualifiedTableName)
  }








https://blog.csdn.net/junerli/article/details/78607708

meta 这一块
org.apache.spark.sql.catalyst.catalog.SessionCatalog

org.apache.spark.sql.hive.HiveSessionCatalog

private[sql] class HiveSessionCatalog(
    externalCatalog: HiveExternalCatalog,
    globalTempViewManager: GlobalTempViewManager,
    val metastoreCatalog: HiveMetastoreCatalog,
    functionRegistry: FunctionRegistry,
    conf: SQLConf,
    hadoopConf: Configuration,
    parser: ParserInterface,
    functionResourceLoader: FunctionResourceLoader)
  extends SessionCatalog(
      externalCatalog,
      globalTempViewManager,
      functionRegistry,
      conf,
      hadoopConf,
      parser,
      functionResourceLoader) {








Spark SQL运行流程

    将SQL语句通过词法和语法解析生成未绑定的逻辑执行计划(Unresolved LogicalPlan),包含Unresolved Relation、Unresolved Function和Unresolved Attribute,然后在后续步骤中使用不同的Rule应用到该逻辑计划上
Analyzer使用Analysis Rules,配合元数据(如SessionCatalog 或是 Hive Metastore等)完善未绑定的逻辑计划的属性而转换成绑定的逻辑计划。具体流程是县实例化一个Simple Analyzer,然后遍历预定义好的Batch,通过父类Rule Executor的执行方法运行Batch里的Rules,每个Rule会对未绑定的逻辑计划进行处理,有些可以通过一次解析处理,有些需要多次迭代,迭代直到达到FixedPoint次数或前后两次的树结构没变化才停止操作。
Optimizer使用Optimization Rules,将绑定的逻辑计划进行合并、列裁剪和过滤器下推等优化工作后生成优化的逻辑计划。
Planner使用Planning Strategies,对优化的逻辑计划进行转换(Transform)生成可以执行的物理计划。根据过去的性能统计数据,选择最佳的物理执行计划CostModel,最后生成可以执行的物理执行计划树,得到SparkPlan。
在最终真正执行物理执行计划之前,还要进行preparations规则处理,最后调用SparkPlan的execute执行计算RDD。
三、SparkContext运行原理分析
    前面我们队Spark SQL运行架构进行分析,知道从输入SQL语句到生成Dataset分为5个步骤,但实际运行过程中在输入SQL语句之前,Spark还有加载SessionCatalog步骤。
3.1 使用SessionCatalog保存元数据
    在解析SQL语句之前需要初始化SQLContext,它定义了Spark SQL执行的上下文,并把元数据保存在SessionCatalog中,这些元数据包括表名称、表字段名称和字段类型等。
    SessionCatalog中保存的是表名和逻辑执行计划对应的哈希列表,这些数据将在解析未绑定的逻辑计划上使用。(SessionCatalog中的表名对应的逻辑执行计划是什么?是这个Dataset对应的逻辑执行计划)
3.2 使用Antlr生成未绑定的逻辑计划
    Spark 2.0版本起使用Antlr进行词法和语法解析。使用Antlr生成未绑定的逻辑计划分为两个阶段:第一阶段的过程为词法分析(Lexical Analysis),负责将符号(Token)分组成符号类(Token class or Token type),第二阶段就是真正的Parser,默认Antlr会构建出一颗分析树(Parser Tree)或者叫语法树(Syntax Tree)。
    SQLContext类中定义了SQL的解析方法parseSql。具体的SQL解析在AbastrctSqlParser抽象类中的parse方法进行,解析完毕后生成语法树,语法树会根据系统初始化的AstBuilder解析生成表达式、逻辑计划或表标识对象。
    在AbstractSqlParse的parse方法中,先实例化词法解析器SqlBaseLexer和语法解析器SqlBaseParser,然后尝试用Antlr较快的解析模式SLL,如果解析失败,则会再尝试使用普通解析模型LL,解析完毕后返回解析结果。
3.3 使用Analyzer绑定逻辑执行计划
    该阶段Analyzer使用Analysis Rules,结合SessionCatalog元数据,对未绑定的逻辑计划进行解析,生成了已绑定的逻辑计划。在该处理过程中,先实例化一个Analyzer,在Analyzer中定义了FiexedPoint和Seq[Batch]两个变量,其中FixedPoint为迭代次数的上线,而Seq[Batch]为所定义需要执行批处理的序列,每个批处理由一系列Rule和策略所组成,策略一般分为Once和FixedPoint(可理解为迭代次数)
3.4 使用Optimizer优化逻辑计划
    Optimizer的实现和处理方式同Analyzer类似,在该类中定义一系列Rule并同样继承于RuleExecutor。利用这些Rule对逻辑计划和Expression进行迭代处理,从而达到对树的节点进行合并和优化。其中主要的优化策略总结起来是合并、列裁剪和过滤器下推等几大类。
    Optimizer的优化策略不仅对已绑定的逻辑计划进行优化,而且对逻辑计划中的Expression也进行了优化,其原理就是遍历树,然后应用优化Rule,但是注意一点,对逻辑计划处理时先序遍历,而对Expression的处理是后续遍历(根据树节点类型来判断是逻辑计划还是Expression吗?)
3.5 使用SparkPlanner生成可执行物理计划
    SparkPlanner使用Planning Strategies对优化的逻辑计划进行转换(Transform),生成可以执行的物理计划。在QueryExecution类代码中,调用SparkPlanner.plan方法对优化的逻辑计划进行处理,而SparkPlanner并未定义plan方法,实际是调用SparkPlanner的祖父类QueyrPlanner的plan方法,然后会返回一个Iterator[Physicalplan]。
    SparkPlanner继承于SparkStrategies,而SparkStrategies继承了QueryPlanner。其中SparkStrategies包含了一系列特定的Strategies,这些Strategies是继承自QueryPlanner中定义的GenericStrategy。在SparkPlanner通过改写祖父类QueryPlanner中strategies策略变量,在该变量中定义了转换成物理计划所执行的策略。
3.6 使用QueryExecution执行物理计划
    在该步骤中先调用SparkPlanner.preparations对物理计划进行准备工作,规范返回数据行的格式等,然后调用SparkPlan.execute执行物理计划,从数据库中查询数据并生成RDD。
    SparkPlan的preparations其实是一个RuleExecutor[SparkPlan],它会调用RuleExecutor的execut方法对前面生成的物理计划应用Rule进行匹配,最终生成一个SparkPlan。
    SparkPlan继承于QueryPlan,SparkPlan中定义了SQL语句执行的execute方法,执行完execute方法返回的是一个RDD,之后可以运行Spark作业对该RDD进行操作。
分享到:
评论

相关推荐

    Learning Spark SQL epub

    Learning Spark SQL 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    Spark SQL操作JSON字段的小技巧

    主要给大家介绍了关于Spark SQL操作JSON字段的小技巧,文中通过示例代码介绍的非常详细,对大家学习或者使用spark sql具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

    Spark SQL常见4种数据源详解

    Spark SQL的DataFrame接口支持多种数据源的操作。一个DataFrame可以进行RDDs方式的操作,也可以被注册为临时表。把DataFrame注册为临时表之后,就可以对该DataFrame执行SQL查询。 Spark SQL的默认数据源为Parquet...

    2015 Spark技术峰会-Spark SQL结构化数据分析-连城

    Databrciks工程师,Spark Committer,Spark SQL主要开发者之一的连城详细解读了“Spark SQL结构化数据分析”。他介绍了Spark1.3版本中的很多新特性。重点介绍了DataFrame。其从SchemaRDD演变而来,提供了更加高层...

    Spark SQL 教学讲解PPT

    参考Spark官网以及一些文献,制作的Spark SQL教学幻灯片,适合进行Spark入门介绍与教学!所有的Spark教学系列都在我的资源内!

    Spark SQL 表达式计算

    表达式计算在Spark SQL中随处可见,本演讲将简介表达式、UDF、UDAF、UDTF的概念,主要的API,以及如何扩展Spark SQL函数库。本演讲还将提及Catalyst在计划阶段和Project Tungsten在执行层做的优化,以及未来性能提升...

    Spark SQL 实验

    Spark SQL 详细介绍 实验介绍 有需要的尽快下载吧

    Learning Spark SQL - Aurobindo Sarkar

    Learning Spark SQL - Aurobindo Sarka

    Spark SQL分批入库

    List<row> list= spark.sql(sql).collectAsList(),获或者其他方法将数据存在List里面,然后就list转为 Dataset分批入库

    spark sql解析-源码分析

    spark-sql解析-源码分析

    Spark SQL操作大全.zip

    Spark SQL操作大全.zip

    Spark SQL源码概览.zip

    Spark SQL源码概览.zip Spark SQL源码概览.zip Spark SQL源码概览.zip Spark SQL源码概览.zipSpark SQL源码概览.zip

    Spark SQL Introduction

    关于spark sql的英文讲义,通过讲义的学习,可以对spark sql有一定的了解

    实训指导书_使用Spark SQL进行法律服务网站数据分析.zip

    实训指导书_使用Spark SQL进行法律服务网站数据分析.zip

    Spark SQL源码概览.pdf

    Spark SQL 包含 3 个子项目:Core、Catalyst、Hive。其中 Catalyst 是核心的查询优化引 擎,独立于 Spark 平台;Spark SQL Core 封装 Catalyst,向应用程序提供 SparkSession、Dataset、 DataFrame 等 API...

    Learning-Spark-SQL.epub

    the basics of Spark SQL and its role in Spark applications. After the initial familiarization with Spark SQL, we will focus on using Spark SQL to execute tasks that are common to all big data projects

    Spark SQL 2.3.0:深入浅出

    Spark SQL 2.3.0:深入浅出,看了下,还行,希望对大家有帮助

    基于成本的Spark SQL优化器框架

    我们把基于成本的优化器框架贡献给社区版本Spark 2.2。...这个基于成本的优化器框架对Spark SQL查询的性能有很好的提升 。在这次演讲中,我们将展示Spark SQL的新的基于成本的优化器框架及其对TPC-DS查询的性能影响。

Global site tag (gtag.js) - Google Analytics