# Storm SQL 內部實現
本頁描述了 Storm SQL 的設計和實現.
## 概覽
SQL是一個很好使用但又復雜的標準. 包括 Drill,Hive,Phoenix 和 Spark 在內的幾個項目都在其 SQL 層面上投入了大量資金. StormSQL 的主要設計目標之一是利用這些項目的現有資源. StormSQL 利用[Apache Calcite](///calcite.apache.org) 來實現 SQL 標準. StormSQL 專注于將 SQL 語句編譯成Storm / Trident 拓撲,以便它們可以在 Storm 集群中執行.
圖1描述了在 StormSQL 中執行 SQL 查詢的工作流程. 首先,用戶提供了一系列 SQL 語句. StormSQL 解析 SQL 語句并將其轉換為 Calcite 邏輯計劃. 邏輯計劃由一系列 SQL 邏輯運算符組成,描述如何執行查詢而不考慮底層執行引擎. 邏輯運算符的一些示例包括 `TableScan`, `Filter`, `Projection` 和`GroupBy`.

圖 1: StormSQL 工作流.
下一步是將邏輯執行計劃編譯為物理執行計劃. 物理計劃由物理運算符組成,描述如何在 _StormSQL_ 中執行 SQL 查詢. 物理運算符如`Filter`, `Projection`, 和 `GroupBy` 直接映射到 Trident 拓撲中的操作. StormSQL 還將 SQL 語句中的表達式編譯為 Java 代碼塊, 并將它們插入 Trident 函數, 這些函數將在運行時被編譯一次并執行.
最后,StormSQL 將創建的 Trident 拓撲與空的打包 JAR 提交到 Storm 集群. Storm 計劃并以與執行其他 Storm 拓撲相同的方式執行 Trident 拓撲.
以下代碼塊顯示了一個示例查詢,用于過濾和投影來自 Kafka 流的結果.
```
CREATE EXTERNAL TABLE ORDERS (ID INT PRIMARY KEY, UNIT_PRICE INT, QUANTITY INT) LOCATION 'kafka://localhost:2181/brokers?topic=orders' ...
CREATE EXTERNAL TABLE LARGE_ORDERS (ID INT PRIMARY KEY, TOTAL INT) LOCATION 'kafka://localhost:2181/brokers?topic=large_orders' ...
INSERT INTO LARGE_ORDERS SELECT ID, UNIT_PRICE * QUANTITY AS TOTAL FROM ORDERS WHERE UNIT_PRICE * QUANTITY > 50
```
前兩個 SQL 語句定義外部數據的輸入和輸出. 圖2描述了StormSQL 如何獲取最后一個 `SELECT` 查詢并將其編譯為 Trident 拓撲的過程.

圖 2: 將示例查詢編譯為 Trident 拓撲.
## 查詢 streaming tables 的限制
查詢代表實時數據流的表時有幾個局限:
* `ORDER BY` 子句不能應用于流
* `GROUP BY` 子句中至少有一個單調字段允許 StormSQL 限制緩沖區的大小
更多細節請參考 [http://calcite.apache.org/docs/stream.html](http://calcite.apache.org/docs/stream.html).
## 依賴
Storm 除了 `EXTERNAL TABLE` 使用的數據源 JAR 外,還要注意 Storm SQL 的必須的依賴. 您可以使用 `storm sql` 的 `--jars` 或 `--artifacts`,以便數據源 JAR 可以包含在 Storm SQL Runner 中,也可以包含在 Trident 拓撲運行時 classpath 中. (如果您的數據源 JAR 在 Maven 存儲庫中可用,則使用 `--artifacts`,因為它處理傳遞依賴關系)
請參考 [Storm SQL集成](storm-sql.html).
- Storm 基礎
- 概念
- Scheduler(調度器)
- Configuration
- Guaranteeing Message Processing
- 守護進程容錯
- 命令行客戶端
- Storm UI REST API
- 理解 Storm Topology 的 Parallelism(并行度)
- FAQ
- Layers on Top of Storm
- Storm Trident
- Trident 教程
- Trident API 綜述
- Trident State
- Trident Spouts
- Trident RAS API
- Storm SQL
- Storm SQL 集成
- Storm SQL 示例
- Storm SQL 語言參考
- Storm SQL 內部實現
- Flux
- Storm 安裝和部署
- 設置Storm集群
- 本地模式
- 疑難解答
- 在生產集群上運行 Topology
- Maven
- 安全地運行 Apache Storm
- CGroup Enforcement
- Pacemaker
- 資源感知調度器 (Resource Aware Scheduler)
- 用于分析 Storm 的各種內部行為的 Metrics
- Windows 用戶指南
- Storm 中級
- 序列化
- 常見 Topology 模式
- Clojure DSL
- 使用沒有jvm的語言編輯storm
- Distributed RPC
- Transactional Topologies
- Hooks
- Storm Metrics
- Storm 狀態管理
- Windowing Support in Core Storm
- Joining Streams in Storm Core
- Storm Distributed Cache API
- Storm 調試
- 動態日志級別設置
- Storm Logs
- 動態員工分析
- 拓撲事件檢查器
- Storm 與外部系統, 以及其它庫的集成
- Storm Kafka Integration
- Storm Kafka 集成(0.10.x+)
- Storm HBase Integration
- Storm HDFS Integration
- Storm Hive 集成
- Storm Solr 集成
- Storm Cassandra 集成
- Storm JDBC 集成
- Storm JMS 集成
- Storm Redis 集成
- Azue Event Hubs 集成
- Storm Elasticsearch 集成
- Storm MQTT(Message Queuing Telemetry Transport, 消息隊列遙測傳輸) 集成
- Storm MongoDB 集成
- Storm OpenTSDB 集成
- Storm Kinesis 集成
- Storm Druid 集成
- Storm and Kestrel
- Container, Resource Management System Integration
- Storm 高級
- 針對 Storm 定義一個不是 JVM 的 DSL
- 多語言協議
- Storm 內部實現
- 翻譯進度