Flink SQL Client 是 Flink 自帶的一個命令行工具,允許用户以交互的方式編寫和提交 SQL 任務。
以下是進入該界面的步驟以及在面試中需要注意的細節:
1. 進入 Flink SQL Client 的步驟
要啓動 SQL Client,你首先需要有一個正在運行的 Flink 集羣(本地或遠程)。
- 啓動集羣(以本地為例): 在 Flink 安裝目錄下執行:
./bin/start-cluster.sh
- 啓動 SQL 客户端: 執行以下命令進入交互界面:
./bin/sql-client.sh
成功進入後,你會看到一個非常經典的 ASCII 藝術風格的松鼠(Flink Logo)。
2. 兩種執行模式
“SQL Client 提交的任務是怎麼運行的?”
兩種模式:
- 嵌入式模式 (Embedded Mode): 默認模式。SQL Client 進程本身就是一個簡易的驅動程序,直接與集羣通信。
- 網關模式 (Gateway Mode): 通過
flink-sql-gateway
3. 進入界面後的常用指令
進入界面後,你可以執行以下命令來檢查環境:
|
指令
|
用途
|
|
|
查看所有支持的 SQL 語法和命令
|
|
|
查看當前配置的元數據目錄
|
|
|
將查詢結果以表格形式直接打印在控制枱
|
|
|
設置為流處理模式(默認)或 |
4. 另一種“界面”:Flink Web UI
如果你的意思是可視化查看 SQL 任務的運行狀態,那麼應該進入 Flink Web UI:
- 默認地址通常是:
http://localhost:8081。 - 在 Web UI 中,你不能直接編寫 SQL,但可以查看 SQL 任務轉換後的 拓撲圖 (Plan)、反壓 (Backpressure) 情況和 Checkpoint 狀態。
5. 進階:如何集成 Hive 或 Kafka?
如何通過配置文件進入 SQL 界面並加載持久化元數據?
- SQL Client 配置文件: 在新版本中,可以通過
sql-gateway-defaults.yaml或直接在啓動時指定-i - Catalog 配置: 只有配置了 Hive Catalog,你進入 SQL 界面後才能看到以前創建過的表,否則 SQL Client 重啓後表信息會丟失。
我在 SQL Client 裏執行了一個 SELECT 查詢,為什麼控制枱一直轉圈不出結果?
- 檢查數據源: 是否有數據實時流入?
- 檢查結果模式: 默認模式可能是
changelog
- ,建議切換為
tableau
- 檢查資源: 檢查 Web UI,看 TaskManager 是否有足夠的 Slot 來運行這個 Query 任務。
你想了解如何通過 Flink SQL Gateway 在 Web 端(如 Zeppelin)通過圖形化界面寫 SQL 嗎?這在企業級開發中更常用。
想。
在企業級開發中,直接用命令行(SQL Client)的情況其實不多,更多是使用 Apache Zeppelin 或 Flink SQL Gateway 這種圖形化或服務化的方式。
1. 為什麼企業更傾向於可視化 SQL 界面?
- 多用户協作: 命令行不支持多人同時在線開發。
- 結果持久化: 命令行關掉,查詢出的結果就沒了;Zeppelin 可以保存查詢歷史。
- 可視化圖表: Flink SQL 查出的流數據,在 Zeppelin 裏可以直接轉成實時的折線圖或柱狀圖。
2. 通過 Zeppelin 連接 Flink SQL
Zeppelin 是目前 Flink 官方最推薦的可視化筆記本工具。
如何配置進入:
- 安裝配置: 在
zeppelin-site.xml
- 中配置
flink.interpreter
- ,指向你的 Flink 安裝目錄。
- 創建 Note: 進入 Zeppelin 網頁(默認
8080
- 編寫 SQL: 使用
%flink.ssql
- (Streaming SQL) 或
%flink.bsql
3. 通過 Flink SQL Gateway (中台化方案)
如果你的公司在做“實時計算平台”,那麼 SQL Gateway 就是核心。
- 它的角色: 它像是一個“翻譯官”。它暴露 REST API,接收來自 Web 端的 SQL 代碼,然後把它提交給遠端的 Flink 集羣。
- 優勢: 它可以管理 Session(會話)。這意味着你在這個界面定義的視圖(View)或臨時表,在另一個界面也能訪問到。
4. Flink SQL 執行流程
當你點擊界面上的“運行”按鈕時,底層發生了什麼?面試時按這個順序説:
- SQL 解析 (Parser): 將 SQL 文本解析為 SqlNode(抽象語法樹 AST)。
- 校驗 (Validator): 結合 Catalog(元數據)檢查表名、列名、數據類型是否存在。
- 優化 (Optimizer): Flink 使用 Apache Calcite 將 SqlNode 轉換成 RelNode,進行邏輯優化(如謂詞下推、剪枝)。
- 物理計劃生成: 將邏輯計劃轉換為 ExecNode。
- 轉換 (Translate): 將 ExecNode 轉換成 Flink 底層的 Transformation(即 Java 代碼層次的算子)。
- 提交: 封裝成 JobGraph 發送到 JobManager。
5. Flink SQL相關問題
- Flink SQL 如何做維表關聯(Lookup Join)?
- 通常使用
FOR SYSTEM_TIME AS OF
- 語法,這需要維表實現
LookupTableSource
- Flink SQL 如何保證 Exactly-once?
- 主要是通過開啓 Checkpoint。在 SQL 界面中,你可以通過
SET 'execution.checkpointing.interval' = '10s';
(airflow-venv) frank@ZZHPC:~$ sql-client.sh
▒▓██▓██▒
▓████▒▒█▓▒▓███▓▒
▓███▓░░ ▒▒▒▓██▒ ▒
░██▒ ▒▒▓▓█▓▓▒░ ▒████
██▒ ░▒▓███▒ ▒█▒█▒
░▓█ ███ ▓░▒██
▓█ ▒▒▒▒▒▓██▓░▒░▓▓█
█░ █ ▒▒░ ███▓▓█ ▒█▒▒▒
████░ ▒▓█▓ ██▒▒▒ ▓███▒
░▒█▓▓██ ▓█▒ ▓█▒▓██▓ ░█░
▓░▒▓████▒ ██ ▒█ █▓░▒█▒░▒█▒
███▓░██▓ ▓█ █ █▓ ▒▓█▓▓█▒
░██▓ ░█░ █ █▒ ▒█████▓▒ ██▓░▒
███░ ░ █░ ▓ ░█ █████▒░░ ░█░▓ ▓░
██▓█ ▒▒▓▒ ▓███████▓░ ▒█▒ ▒▓ ▓██▓
▒██▓ ▓█ █▓█ ░▒█████▓▓▒░ ██▒▒ █ ▒ ▓█▒
▓█▓ ▓█ ██▓ ░▓▓▓▓▓▓▓▒ ▒██▓ ░█▒
▓█ █ ▓███▓▒░ ░▓▓▓███▓ ░▒░ ▓█
██▓ ██▒ ░▒▓▓███▓▓▓▓▓██████▓▒ ▓███ █
▓███▒ ███ ░▓▓▒░░ ░▓████▓░ ░▒▓▒ █▓
█▓▒▒▓▓██ ░▒▒░░░▒▒▒▒▓██▓░ █▓
██ ▓░▒█ ▓▓▓▓▒░░ ▒█▓ ▒▓▓██▓ ▓▒ ▒▒▓
▓█▓ ▓▒█ █▓░ ░▒▓▓██▒ ░▓█▒ ▒▒▒░▒▒▓█████▒
██░ ▓█▒█▒ ▒▓▓▒ ▓█ █░ ░░░░ ░█▒
▓█ ▒█▓ ░ █░ ▒█ █▓
█▓ ██ █░ ▓▓ ▒█▓▓▓▒█░
█▓ ░▓██░ ▓▒ ▓█▓▒░░░▒▓█░ ▒█
██ ▓█▓░ ▒ ░▒█▒██▒ ▓▓
▓█▒ ▒█▓▒░ ▒▒ █▒█▓▒▒░░▒██
░██▒ ▒▓▓▒ ▓██▓▒█▒ ░▓▓▓▓▒█▓
░▓██▒ ▓░ ▒█▓█ ░░▒▒▒
▒▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░▓▓ ▓░▒█░
______ _ _ _ _____ ____ _ _____ _ _ _ BETA
| ____| (_) | | / ____|/ __ \| | / ____| (_) | |
| |__ | |_ _ __ | | __ | (___ | | | | | | | | |_ ___ _ __ | |_
| __| | | | '_ \| |/ / \___ \| | | | | | | | | |/ _ \ '_ \| __|
| | | | | | | | < ____) | |__| | |____ | |____| | | __/ | | | |_
|_| |_|_|_| |_|_|\_\ |_____/ \___\_\______| \_____|_|_|\___|_| |_|\__|
Welcome! Enter 'HELP;' to list all available commands. 'QUIT;' to exit.
Command history file path: /home/frank/.flink-sql-history
Flink SQL> SHOW CATALOGS;
+-----------------+
| catalog name |
+-----------------+
| default_catalog |
+-----------------+
1 row in set
Flink SQL>
(airflow-venv) frank@ZZHPC:~$ sql-gateway.sh
Starting sql-gateway daemon on host ZZHPC.