July 25, 2021
操作系统层面的多路复用 IO 实现主要包括四种:select、poll、epoll、kqueue。
1. 常见类 # java.nio.ByteBuffer java.nio.channels.Selector java.nio.channels.SelectableChannel java.nio.channels.ServerSocketChannel 2. 网络模型 # 2.1 Reactor 模型 # Reactor 是非阻塞同步网络模型,Java 可以借用 NIO 接口实现各种 Reactor 模型,比如 单Reactor单线程、单Reactor多线程、主从Reactor多线程
2.2 Proactor 模型 # Proactor 是异步网络模型,需要 OS 的支持才能实现,所以 Java 借用 NIO 接口不一定能实现。
3. Selector # 不同的 SelectorProvider 实现对应了不同的 Selector,由具体的 SelectorProvider(根据不同的 OS 确定)实现进行创建。
4. 零拷贝 # 条目 说明 MappedByteBuffer 基于内存映射(mmap) DirectByteBuffer JVM 可以对 DirectByteBuffer 的对象进行 JVM 堆外内存分配和回收管理 FileChannel 用于文件读写、映射和操作的通道;定义了 transferFrom() 和 transferTo() 两个抽象方法,它通过在通道和通道之间建立连接实现数据传输 5. 参考文献 # Java NIO - IO 多路复用详解
July 20, 2021
1. 常见类 # java.net.ServerSocket; java.net.Socket; 2. BIO 模型 # 一个服务端可以连接多个客户端,但是接入一个客户端,服务端都需要用一个线程维持着客户端与服务端的连接。如果客户端数量很多,那么服务端也需要对应的线程数量与之连接。
3. 参考文献 # Java IO - BIO 详解
July 15, 2021
1. Java IO 概览 # 2. 阻塞/非阻塞 VS 同步/非同步 # 2.1 阻塞 IO 和 非阻塞 IO # 这两个概念是程序级别的。主要描述的是程序请求操作系统 IO 操作后,如果 IO 资源没有准备好,那么程序该如何处理的问题:前者等待;后者继续执行 (并且使用线程一直轮询,直到有 IO 资源准备好了)
2.2 同步 IO 和 非同步 IO # 这两个概念是操作系统级别的。主要描述的是操作系统在收到程序请求 IO 操作后,如果 IO 资源没有准备好,该如何响应程序的问题:前者不响应,直到 IO 资源准备好以后;后者返回一个标记 (好让程序和自己知道以后的数据往哪里通知),当 IO 资源准备好以后,再用事件机制返回给程序。
3. OS IO 多路复用 # IO 模型 相对性能 关键思路 操作系统 JAVA 支持情况 select 较高 Reactor windows/Linux 支持 poll 较高 Reactor Linux 支持 epoll 高 Reactor/Proactor Linux 支持 kqueue 高 Proactor Linux 不支持
July 10, 2021
Kylin 部分细节
...
July 4, 2021
distinct count
...
June 29, 2021
Kylin 剪枝优化
...
June 19, 2021
Kylin Cube 构建算法
...
June 17, 2021
Kylin Cube 执行流程
...
June 12, 2021
query 的整体执行流程如下图所示。可以看到整个 query 的逻辑实际上是由 QueryService 处理的,这里会做重要的路由处理,是执行 cube 的查询,还是下推到其他查询引擎,还是下推到 hive。这个路由逻辑简单来说,如下图所示:
完整的处理逻辑如下图所示:
query 和 update 的逻辑如下所示:
1. Query # 在上图的 query 流程中,其实可以看到所有的处理过程最后会交给 calcite,而 calcite 的实现类 OLAPTableScan 会将 OLAPToEnumerableConverter 注册进来,最终在implement方法中完成 RelNode 到 Cube 处理逻辑的转换。
1.1 Cube 选取流程 # 整个过程封装在 RealizationChooser#selectRealization 中,大体上可以分为两步,第一部分是makeOrderedModelMap(),这一步会选出所有满足的 cuboid,第二步是selectRealization(),这一步骤会选出唯一一适合的 cuboid(如果所有的都合适的话,就选 set 里面遍历到的第一个)。详细可以分成下述几步来讲
1.1.1 对 model 及对应的 realizations 进行过滤及排序 # 获取属于该 project 下 factTableName 与查询中事实表相等的所有 realizations,factTableName 即 context.firstTableScan.getTableName 对 realizations 执行过滤,得到 filteredRealizations NOT READY cube 会被过滤 黑名单中的 cube 会被过滤 cube.allColumns 必须与 OLAPContext.
...
June 7, 2021
Apache Calcite 是一种提供了标准的 SQL 语言、多种查询优化和连接各种数据源基础框架,可以让用户轻松的接入各种数据,并实现使用 SQL 查询。此外,Calcite 还提供了 OLAP 和流处理的查询引擎。
...