1 SQL 客户端
Flink 的 Table & SQL API 可以处理 SQL 语言编写的查询语句,但是这些查询需要嵌入用 Java 或 Scala 编写的表程序中。此外,这些程序在提交到集群前需要用构建工具打包。这或多或少限制了 Java/Scala 程序员对 Flink 的使用。
SQL 客户端 的目的是提供一种简单的方式来编写、调试和提交表程序到 Flink 集群上,而无需写一行 Java 或 Scala 代码。SQL 客户端命令行界面(CLI) 能够在命令行中检索和可视化分布式应用中实时产生的结果。
2 入门
本节介绍如何在命令行里启动(setup)和运行你的第一个 Flink SQL 程序。
SQL 客户端捆绑在常规 Flink 发行版中,因此可以直接运行。它仅需要一个正在运行的 Flink 集群就可以在其中执行表程序。有关设置 Flink 群集的更多信息,请参见集群和部署部分。如果仅想试用 SQL 客户端,也可以使用以下命令启动本地集群:
./bin/start-cluster.sh
2.1 启动 SQL 客户端命令行界面
SQL Client 脚本也位于 Flink 的 bin 目录中。将来,用户可以通过启动嵌入式 standalone 进程或通过连接到远程 SQL 客户端网关来启动 SQL 客户端命令行界面。目前仅支持 embedded
模式。可以通过以下方式启动 CLI:
./bin/sql-client.sh embedded
默认情况下,SQL 客户端将从 ./conf/sql-client-defaults.yaml
中读取配置。有关环境配置文件结构的更多信息,请参见配置部分。
2.2 执行 SQL 查询
命令行界面启动后,你可以使用 HELP
命令列出所有可用的 SQL 语句。输入第一条 SQL 查询语句并按 Enter
键执行,可以验证你的设置及集群连接是否正确:
SELECT 'Hello World';
该查询不需要 table source,并且只产生一行结果。CLI 将从集群中检索结果并将其可视化。按 Q
键退出结果视图。
CLI 为维护和可视化结果提供三种模式。
表格模式(table mode)在内存中实体化结果,并将结果用规则的分页表格可视化展示出来。执行如下命令启用:
SET execution.result-mode=table;变更日志模式(changelog mode)不会实体化和可视化结果,而是由插入(
+
)和撤销(-
)组成的持续查询产生结果流。SET execution.result-mode=changelog;Tableau模式(tableau mode)更接近传统的数据库,会将执行的结果以制表的形式直接打在屏幕之上。具体显示的内容会取决于作业 执行模式的不同(
execution.type
):SET execution.result-mode=tableau;
注意当你使用这个模式运行一个流式查询的时候,Flink 会将结果持续的打印在当前的屏幕之上。如果这个流式查询的输入是有限的数据集, 那么Flink在处理完所有的数据之后,会自动的停止作业,同时屏幕上的打印也会相应的停止。如果你想提前结束这个查询,那么可以直接使用 CTRL-C
按键,这个会停掉作业同时停止屏幕上的打印。
你可以用如下查询来查看三种结果模式的运行情况:
SELECT name, COUNT(*) AS cnt FROM (VALUES ('Bob'), ('Alice'), ('Greg'), ('Bob')) AS NameTable(name) GROUP BY name;
此查询执行一个有限字数示例:
变更日志模式 下,看到的结果应该类似于:
+ Bob, 1 + Alice, 1 + Greg, 1 - Bob, 1 + Bob, 2
表格模式 下,可视化结果表将不断更新,直到表程序以如下内容结束:
Bob, 2 Alice, 1 Greg, 1
Tableau模式 下,如果这个查询以流的方式执行,那么将显示以下内容:
+-----+----------------------+----------------------+ | +/- | name | cnt | +-----+----------------------+----------------------+ | + | Bob | 1 | | + | Alice | 1 | | + | Greg | 1 | | - | Bob | 1 | | + | Bob | 2 | +-----+----------------------+----------------------+ Received a total of 5 rows
如果这个查询以批的方式执行,显示的内容如下:
+-------+-----+ | name | cnt | +-------+-----+ | Alice | 1 | | Bob | 2 | | Greg | 1 | +-------+-----+ 3 rows in set
这几种结果模式在 SQL 查询的原型设计过程中都非常有用。这些模式的结果都存储在 SQL 客户端 的 Java 堆内存中。为了保持 CLI 界面及时响应,变更日志模式仅显示最近的 1000 个更改。表格模式支持浏览更大的结果,这些结果仅受可用主内存和配置的最大行数(max-table-result-rows
)的限制。
注意 在批处理环境下执行的查询只能用表格模式或者Tableau模式进行检索。
定义查询语句后,可以将其作为长时间运行的独立 Flink 作业提交给集群。为此,其目标系统需要使用 INSERT INTO 语句指定存储结果。配置部分解释如何声明读取数据的 table source,写入数据的 sink 以及配置其他表程序属性的方法。