Victor's Code Journey
Victor's Code Journey

Apache Calcite: SQL验证

本文主要介绍Calcite 中的SQL Validator。Calcite 通过 SQL 校验器实现 SQL 绑定,SQL 校验器所需的 Catalog 信息,在深入理解 Apache Calcite Catalog 中已经做了详细的介绍。

SQL 绑定主要的作用是将 SQL 解析生成的 AST 和数据库的元数据进行绑定,从而生成具有语义的 AST。SQL 绑定会通过自底向上的方式遍历 AST,对抽象语法树中的节点进行绑定分析,绑定的过程中会将表、列等元数据附在语法树上,最后生成具有语义的语法树 Bounded AST。

JavaCC:Token Manager

JavaCC的词法解析被转化为一组词法状态,每个状态都有一个唯一的标识符用于命名。Token Manager(生成的代码)在运行时总是处于状态之一,默认的一个词法状态是DEFAULT。当Token Manager初始化时,默认情况下是以DEFAULT状态开始。也可以在Token Manager 构造时,指定起始词法状态1。

JavaCC 简介

JavaCC 是 java 生态中常用的Parser Generator。特征如下:

  • JavaCC 生成的解析器是基于LL 的,默认是LL(1),通过配置可以支持 LL(K)。
  • 由于是LL 方式,需要用户自己书写递归下降的语法规则来避免出现左递归问题。
  • JavaCC 支持 EBNF 语法范式。

JavaCC的工作流程如下:

  • 令牌管理器读入一个字符序列并生成一个称为令牌的对象序列。用于将字符序列分解为标记序列的规则取决于语言-它们由用户作为正则表达式的集合提供。
  • 解析器使用一个令牌序列,分析它的结构,并产生一个由用户定义的输出。

Apache Livy 简介

当你把一个 Spark 应用交给数据平台服务化时,很快会遇到三个现实问题:客户端机器不一定能直连集群;spark-submit 不适合由 Web 后端反复执行;多个用户的长任务、权限、日志和资源也不能只靠脚本管理。Apache Livy 要解决的就是这一层问题:它把 Spark 集群包装成可远程访问、可管理、可多租户使用的 REST 服务。

这篇文章面向已经了解 Spark Driver、Executor 和 Cluster Manager 的读者。读完你可以理解 Livy Server 的职责边界、Interactive Session 与 Batch Session 的差异、RSC 的连接建立过程、Executor 资源如何分配和扩缩容、Session 状态恢复机制,以及 Livy 与 Spark Connect 的适用边界。

Spark 简介

当数据量超过单机内存和 CPU 的处理能力时,很多熟悉的批处理程序会遇到同一个问题:逻辑不难,但很难高效地拆到多台机器上运行。Spark 要解决的正是这件事。它把分布式存储上的数据抽象成可并行操作的数据集,把用户代码转换成可以在集群中调度的任务,同时提供 SQL、流处理、机器学习等统一 API。

Rust Future 实现原理

Rust 既支持了基于系统线程的多线程编程模型,也支持了基于async/await的异步编程模型。Rust 的async编程有有以下特性:

  • Future 在 Rust 中是惰性的
  • Async 在 Rust 中使用开销是零
  • Rust 没有内置异步调用所必需的运行时,但是社区生态中已经提供了非常优异的运行时实现,例如 tokio和async-std
  • 运行时同时支持单线程和多线程