Trino源码学习-基础框架Airlift
Trino源码学习-基础框架Airlift
Airlift是Trino的系统基础,是一个用Java构建REST服务的轻量级框架。Airlift并不是像Spring一样的重量级框架,相反,它像是由一组开源工具组成的工具包,将来自 Java 生态系统的稳定、成熟的库汇集到一个简单、轻量级的包中,让您专注于完成工作,并包括对配置、指标、日志记录、依赖注入等的内置支持,使开发者能够在最短的时间内交付生产质量的 Web 服务。
Airlift包含以下标准开源库:
Library | Domain |
---|---|
Jetty | Industry standard HTTP server and client |
JAX-RS/Jersey | The Java standard for REST servers |
Jackson | Industry standard JSON serialization |
Guava | Swiss army knife for Java |
Guice | The best dependency injection framework for Java |
jmxutils | Simple library for exposing JMX endpoints |
TopicGC: How LinkedIn cleans up unused metadata for its Kafka clusters
TopicGC: How LinkedIn cleans up unused metadata for its Kafka clusters
Apache Kafka 是一个开源的事件流平台,用户可以在其中创建 Kafka 主题作为数据传输单元,然后与生产者和消费者一起发布或订阅该主题。虽然大多数 Kafka 主题都在积极使用,但由于业务需求发生变化或主题本身是短暂的,因此不再需要一些主题。Kafka 本身没有自动检测未使用主题并删除它们的机制。这通常不是一个大问题,因为 Kafka 集群可以容纳相当多的主题,数百到数千个。但是,如果主题数量持续增长,最终会遇到一些瓶颈,并对整个 Kafka 集群产生破坏性影响。TopicGC服务的诞生就是为了解决这个确切的问题。事实证明,它通过删除~20%的主题来减轻Kafka的压力,并将Kafka的生产和消费性能提高了至少30%。
JAVA and SIMD
Trino源码学习-架构Overview
Trino源码学习-架构Overview
Trino 是一种旨在使用分布式查询高效查询大量数据的工具。通常用在数据仓储、数据分析、海量数据聚合和报表生成等任务上,这些任务通常被归类为联机分析处理(online analytical processing,OLAP)。
- 数据孤岛: 随着大数据的不断增多,和数据存储机制的日益多样: 关系数据库、NoSQL 数据库、文档数据库、键值存储和对象存储系统等。数据分散在各个孤岛上。
- 查询能力: 其中有些系统甚至不能提供满足分析所需的查询性能
- 横向扩展: 其他一些系统则将数据存储在单一庞大的系统上。因而不能像现代的云应用程序一样横向扩展。
通过支持不同系统上的联邦查询、并行查询和横向集群扩展等功能,Trino解决了上述问题。
- 联邦查询: Trino的设计初衷是用来查询 HDFS 上的数据,也可以从对象存储系统、关系数据库管理系统(RDBMS)、NoSQL 数据库和其他系统中查询数据(只要提供了对应系统的Connector)。
- 并行查询: Trino使用了很多技术来执行分布式查询,这些技术包括内存并行处理、跨集群节点管线执行、多线程执行模型(以充分利用所有 CPU 核心)、高效的扁平内存数据结构(以最小化 Java 的垃圾回收)和 Java 字节码生成等。借助上述技术,可以更快地获得查询结果。
- 横向集群扩展: Trino存算分离的,可以各自独立地扩展。Trino代表计算层,底层的数据源代表存储层。Trino 可以通过动态扩展计算集群的规模来扩展查询能力,并可以在数据源中数据所在的位置查询数据。借助这一特性,你可以极大地优化硬件资源需求并降低成本。
Trino源码学习-准备工作
Trino源码学习-准备工作
本文是学习Trino源码前的准备工作。在开始之前,先做好准备工作:
- 编译环境 Mac OS X or Linux
- 安装Java 17.0.4+, Trino 依赖 Java 17.0.4 或更新的版本来进行构建(本文基于 https://gitee.com/chutian0610/trino/tree/code-study/)。
- 安装 Maven, Maven的版本不重要,Trino编译时会使用mvnw指定mvn版本
- 安装 Docker
Parser解析重写SQL
Parser解析重写SQL
最近在做文本解析的工作,主要是SQL语法解析和改写。因此打算记录下解析的技术&工具。
文本解析一般首推使用正则表达式。对于大多数的文本,正则都可以很好的解析。以ELK套件中的Logstash为例,其内置的Grok插件支持了120+种常用Pattern,可以很好的用于解析多种形式的文本。但是。正则不是文本解析的万能钥匙,由于正则表达式的自身实现约束,大多数正则表达式引擎不能较好的处理嵌套结构的数据。此外,对于脚本语言或编程语言,正则表达式也是无能为力。
举个例子,如果想替换SQL中的某个字段名,如果只是简单的使用正则替换,那么很可能会错误修改其他位置的文本。例如想修改下面SQL中的order_cnt别名时,就很有可能错误修改其他位置的order_cnt,要避免这类问题需要对正则添加很多断言和约束,由于实际场景中可能会对SQL的列名,表名,条件等各个位置进行改写,场景十分复杂。所以正则这种方式不能从根本上解决问题。由此,引出了接下来要介绍的技术–语法解析器(Parser)。
1 | select |