

# openLooKeng概念


## 服务器类型

openLooKeng服务器有两种类型：协调节点和工作节点。下一节将解释这两者的区别。

### 协调节点

openLooKeng协调节点是负责解析语句、规划查询和管理openLooKeng工作节点的服务器。它是openLooKeng安装的“大脑”，也是客户端连接以提交语句执行的节点。每个openLooKeng安装必须有一个openLooKeng协调节点，以及一个或多个openLooKeng工作节点。对于开发或测试目的，可以配置openLooKeng的单个实例来执行这两个角色。

协调节点跟踪每个工作节点上的活动，并协调查询的执行。协调节点创建了一个查询的逻辑模型，其中包含一系列阶段，然后将其转换为在openLooKeng工作节点集群上运行的一系列相互连接的任务。

协调节点使用REST API与工作节点和客户端进行通信。

### 工作节点

openLooKeng工作节点是openLooKeng安装中的服务器，负责执行任务和处理数据。工作节点从连接器获取数据，并相互交换中间数据。协调节点负责从工作节点获取结果，并将最终结果返回给客户端。

当openLooKeng工作节点进程启动时，它会将自己通告给协调节点中的发现服务器，这样openLooKeng协调节点就可以使用它来执行任务。

工作节点使用REST API与其他工作节点和openLooKeng协调节点进行通信。

## 数据来源

在本文档中，你将阅读例如连接器、目录、模式和表之类的术语。这些基本概念涵盖了openLooKeng特定数据源的模型，将在下一节中介绍。

### 连接器

连接器将openLooKeng适配到如Hive或关系型数据库的数据源。你可以像理解数据库的驱动一样来理解连接器。它是openLooKeng的[SPI](../develop/spi-overview.md)的一个实现，它允许openLooKeng使用标准API与资源交互。

openLooKeng包含若干内置连接器：[JMX连接器](../connector/jmx.md)、提供对内置系统表访问的[系统连接器](../connector/system.md)、[Hive连接器](../connector/hive.md)以及为TPC-H基准数据服务的[TPCH连接器](../connector/tpch.md)。许多第三方开发人员对连接器做出了贡献，以便openLooKeng可以访问各种数据源中的数据。

每个目录都与一个特定的连接器相关联。如果检查目录配置文件，你将看到每个文件都包含一个强制属性`connector.name`，目录管理器使用该属性为给定的目录创建连接器。多个目录可以使用同一个连接器来访问类似数据库的两个不同实例。例如，如果有两个Hive集群，你可以在一个openLooKeng集群中配置两个都使用Hive连接器的目录，使你可以从两个Hive集群（甚至在同一个SQL查询中）查询数据。

### 目录

openLooKeng目录包含模式并通过连接器引用数据源。例如，可以配置一个JMX目录，以便通过JMX连接器访问JMX信息。在openLooKeng中运行SQL语句时，将针对一个或多个目录运行该语句。目录的其他示例包括连接Hive数据源的Hive目录。

在openLooKeng中寻址表时，完全限定的表名称总是以目录作为根。例如，一个完全限定的表名`hive.test_data.test`将引用`hive`目录中`test_data`模式中的`test`表。

目录定义在openLooKeng配置目录的属性文件中。

### 模式

模式是组织表的一种形式。目录和模式一起定义了一组可以查询的表。当使用openLooKeng访问Hive或例如MySQL等关系数据库时，模式会在目标数据库中转换为相同的概念。其他类型的连接器可以选择以对基础数据源有意义的方式将表组织到模式中。

### 表

表是一组无序行，这些行被组织成具有类型的命名列。这与任何关系数据库中的情况相同。源数据到表的映射由连接器定义。

## 查询执行模型

openLooKeng执行SQL语句，并将这些语句转换为跨协调节点和工作节点分布式集群执行的查询。

### 语句

openLooKeng执行ANSI兼容的SQL语句。当openLooKeng文档引用一个语句时，既引用ANSI SQL标准中定义的语句。ANSI SQL标准由子句、表达式和谓词组成。

一些读者可能会好奇，为什么本节为语句和查询列出单独的概念。这是必要的，因为在openLooKeng中，语句只是引用SQL语句的文本表示形式。当执行一条语句时，openLooKeng将创建一个查询和一个查询计划，然后该查询计划将分布在一系列openLooKeng工作节点上。

### 查询

当openLooKeng解析一个语句时，将其转换为一个查询，并创建一个分布式查询计划，该计划随后实现为openLooKeng工作节点上运行的一系列相互连接的阶段。在openLooKeng中检索有关查询的信息时，会收到响应语句生成结果集所涉及的每个组件的快照。

语句和查询之间的区别很简单。可以将语句视为传递给openLooKeng的SQL文本，而查询则是指执行该语句而实例化的配置和组件。查询包含阶段、任务、分片、连接器和其他组件以及协同工作以生成结果的数据源。

### 阶段

当openLooKeng执行查询时，它将执行分解为多个阶段。例如，如果openLooKeng需要聚合存储在Hive中的10亿行数据，它通过创建一个根阶段来聚合其他几个阶段的输出，这些阶段都设计用于实现分布式查询计划的不同部分。

包含查询的阶段层次结构类似于树。每个查询都有一个根阶段，它负责汇总其他阶段的输出。阶段是协调节点用来为分布式查询计划建模的，但是阶段本身并不在openLooKeng工作节点上运行。

### 任务

如前一节所述，阶段为分布式查询计划的特定部分建模，但是阶段本身并不在openLooKeng工作节点上执行。要理解一个阶段是如何执行的，需要理解一个阶段是实现为一系列任务，这些任务分布在openLooKeng工作节点的网络上。

在openLooKeng体系结构中，任务是“工作马”，因为分布式查询计划被分解为一系列阶段，这些阶段然后被转换为任务，然后对这些任务作用或处理分片。openLooKeng任务具有输入和输出，就像一个阶段可以由一系列任务并行执行一样，一个任务与一系列驱动并行执行。

### 分片

分片是一个较大数据集的一部分，任务在分片上执行。分布式查询计划最低级别的阶段通过分片来从连接器检索数据，分布式查询计划较高级别的中间阶段从其他阶段检索数据。

当openLooKeng调度查询时，协调节点将查询连接器，以获得可用于表的所有分片的列表。协调节点跟踪哪些机器正在运行哪些任务，以及由哪些任务处理哪些分片。

### 驱动

任务包含一个或多个并行驱动。驱动根据数据并结合运算符生成输出，然后输出由一个任务聚合，然后在另一个阶段传递给另一个任务。驱动是一系列操作符实例，或者可以将驱动视为内存中操作符的物理集合。它的并行度在openLooKeng架构中是最低级别。驱动有一个输入和一个输出。

### 运算符

运算符消费、转换和生产数据。例如，表扫描从连接器获取数据并生成其他运算符可以使用的数据，而过滤运算符通过在输入数据上应用谓词来使用数据并生成子集。

### 交换

交换在openLooKeng节点之间为查询的不同阶段传递数据。任务将数据生成到输出缓冲区中，并使用交换客户端使用来自其他任务的数据。