热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Catalyst揭秘Day1Catalyst本地解析

Catalyst本地解析今天开始讲下Catalyst,这是我们必须精通的内容之一:基本概念catalyst是一种解析器引擎,而不仅是sql解析引擎。如果研究下catalyst,可以

Catalyst本地解析

今天开始讲下Catalyst,这是我们必须精通的内容之一:

  1. 在Spark2.x中,主要会以Dataframe和DataSet为api,无论是Dataframe和DataSet,底层都依赖Catalyst和Tungsten。
  2. 根据官方的披露,后续所有的框架都会依赖Catalyst和Tungsten。
    从定位上看,catalyst是在SparkSql上先做实验,后面是机器学习,现在要推到各个子框架。

基本概念

catalyst是一种解析器引擎,而不仅是sql解析引擎。如果研究下catalyst,可以在当中非常方便的添加你想做的任意新的优化技术,在优化技巧方面可以随意的扩展。也很少有解析器像catalyst这样可以方便的增加新的数据类型。

catalyst的数据结构是棵树状结构,并有一系列的rules的解析规则。我们以前在很多语言开发的时候,都会解析成一颗语法树,catalyst是把sql和dataframe的内容用tree来存储。第二个层面,Catalyst中有一套解析规则,怎么对树进行解析和优化。

从jvm对内存的管理来说,内存中的所有object也是树状结构的,那catalyst用一棵树在存储的话,每个节点都是类的实例,都有0个或多个子节点,并且节点是不可变,只能把一棵树从一种状态transform到另一种状态。

Tree结构解析

Catalyst主要包含两点:

  1. Tree数据结构;
  2. Rules解析规则;
  3. 优化方式;

如何理解Tree数据结构:
比如表达式 x + (5 + 10),当中包含:
Literal:5 10
Attribute:x
Action:Add

可以用下图表示:

技术分享

Catalyst中使用一系列的Rules来解析和优化Tree数据结构,对于上述的树状数据结构,优化过程可以如下,把常量合并在一起。由于表达式是一个对象,对象有类型,所以可以使用模式匹配,对于不认识的类型可以忽略,并且添加新的类型会很容易,导致了我们的扩展和操作非常的方便,只要不断执行匹配规则就行。当我们写优化规则的时候,只需要考虑不同的算子,根本就不用这棵树有多大。因为catalyst会循环运用我们的规则,只到这棵树不可以被解析和优化,这让我们会很方便改变规则,也会很方便优化引擎。

tree.tranform{
        case Add(Literal(x),Literal(y)) => Literal(x+y)
        case
        ...
    }

执行过程

一般来说分为六步:

技术分享

  1. SQL、Dataframe、DataSet都会变成Unrecognized Logic Plan未识别的逻辑计划,这是一棵抽象语法树,数据表和列名等都还未被识别。
  2. 用catalog来识别表和列名等东西,并且会对值进行一些简单的计算,建立Logic Plan。
  3. 运用rules对上一阶段成果进行优化,比如谓词下推,形成Optimized Logic Plan优化后的逻辑计划。
  4. 根据基于成本的考量,比如将小表进行broadcast,形成pyshical plan物理计划。 在做sparksql时,其实做不了啥太多的优化。物理计划已经是基于rdd角度的考虑了。

技术分享

  1. 会根据评估模型,在很多个物理计划的选项中,选中最快的物理计划。由于有这个环节,dataframe一般情况下比直接写rdd运行快。
  2. 借助scala语言的高级特性quasiquotes,将物理计划,直接变成jvm的字节码。基于rdd进行编程。

从整个过程,我们可以看到在框架抽象的时候,并不是越底层越高效,因为如果能加入优化层次,会对开发者有很大的助力。

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

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

Catalyst揭秘 Day1 Catalyst本地解析


推荐阅读
  • 本文探讨了在一个物理隔离的环境中构建数据交换平台所面临的挑战,包括但不限于数据加密、传输监控及确保文件交换的安全性和可靠性。同时,作者结合自身项目经验,分享了项目规划、实施过程中的关键决策及其背后的思考。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 如何在PHP中安装Xdebug扩展
    本文介绍了如何从PECL下载并编译安装Xdebug扩展,以及如何配置PHP和PHPStorm以启用调试功能。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 在日常生活中,支付宝已成为不可或缺的支付工具之一。本文将详细介绍如何通过支付宝实现免费提现,帮助用户更好地管理个人财务,避免不必要的手续费支出。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 深入探讨前端代码优化策略
    本文深入讨论了前端开发中代码优化的关键技术,包括JavaScript、HTML和CSS的优化方法,旨在提升网页加载速度和用户体验。 ... [详细]
  • 项目风险管理策略与实践
    本文探讨了项目风险管理的关键环节,包括风险管理规划、风险识别、风险分析(定性和定量)、风险应对策略规划及风险控制。旨在通过系统的方法提升项目成功率,减少不确定因素对项目的影响。 ... [详细]
  • 心理学经典:《思考致富》
    《思考致富》是由美国著名成功学大师拿破仑·希尔撰写的一部重要著作,该书基于希尔长达20年的深入研究和访谈,探讨了个人成功的核心要素。书中不仅揭示了成功的关键,还提供了一系列实用的方法和策略。 ... [详细]
  • 本文将详细介绍如何在二进制和十六进制之间进行准确的转换,并提供实际的代码示例来帮助理解这一过程。 ... [详细]
  • empty,isset首先都会检查变量是否存在,然后对变量值进行检测。而is_null只是直接检查变量值,是否为null,因此如果变量未定义就会出现错误!检测一个变量是否是null ... [详细]
  • 在处理大数据量的SQL分页查询时,通常需要执行两次查询来分别获取数据和总记录数。本文介绍了一种优化方法,通过单次查询同时返回分页数据和总记录数,从而提高查询效率。 ... [详细]
  • 本文通过一个具体的实例,介绍如何利用TensorFlow框架来计算神经网络模型在多分类任务中的Top-K准确率。代码中包含了随机种子设置、模拟预测结果生成、真实标签生成以及准确率计算等步骤。 ... [详细]
  • 嵌套列表的扁平化处理
    本文介绍了一种方法,用于遍历嵌套列表中的每个元素。如果元素是整数,则将其添加到结果数组中;如果元素是一个列表,则递归地遍历这个列表。此方法特别适用于处理复杂数据结构中的嵌套列表。 ... [详细]
author-avatar
值兰修女_662
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有