首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

Apache Drill HTTP Storage Plugin 開發全攻略:從架構到源碼實現

     編輯:DB2 教學

Drill 架構回顧:為什麼需要 Storage Plugin

Apache Drill 受 Google Dremel 啟發,定位於**大數據集的交互式實時分析**。它不替代 Hadoop MapReduce 或 Storm/S4 等批處理/流處理框架,而是填補「秒級 SQL 查詢海量數據」的空白。Drill 的靈活性體現在:

  • 前端:支持 SQL、NoSQL API、BI 工具(通過 JDBC/ODBC)
  • 後端:通過 Storage Plugin 接入 HDFS、MongoDB、HBase、Hive、Kafka 等任意數據源
  • 執行:分布式並行執行引擎,基於 Apache Calcite(原 OptiQ)進行查詢優化

HTTP Storage Plugin 設計目標

實現一個可查詢 **HTTP GET + JSON API** 的存儲插件,支持如下查詢語法:

-- 動態參數構建查詢(where 條件轉為 URL 參數)
SELECT name, length FROM http.`/e/api:search` WHERE $p=2 AND $q='avi';

-- 靜態完整 URL 查詢
SELECT name, length FROM http.`/e/api:search?q=avi&p=2` WHERE length > 0;

核心類實現架構

開發一個 Storage Plugin 需實現以下核心接口(掃描機制基於 Calcite 的 Plan 轉換):

類/接口核心職責
StoragePluginConfig配置類,JSON 可序列化,如 {type:"http", connection:"https://host:8000", resultKey:"results", enabled:true}
AbstractStoragePlugin插件主類,構造函數固定簽名 (Config, DrillbitContext, String),實現 getPhysicalScan、registerSchemas、getOptimizerRules
SchemaFactory / AbstractSchema動態註冊 Schema/Table,HTTP 場景下 Table 對應 API Endpoint
AbstractGroupScan / SubScan查詢規劃階段傳遞掃描規格(如 HTTP 路徑、參數)
BatchCreator / AbstractRecordReader執行階段:創建 RecordReader,實際發起 HTTP 請求、解析 JSON、轉換為 Drill 內部 Vector 列式格式

關鍵實現細節

1. 配置持久化與啟動掃描

Drill 啟動時掃描 classpath 下 AbstractStoragePlugin 實現類,讀取 /tmp/drill/sys.storage_plugins(Windows 為 D:\tmp\drill\sys.storage_plugins)加載配置。

2. 動態 Table 映射

public Table getTable(String tableName) {
    // tableName 即 HTTP API 路徑,如 "/e/api:search?q=avi&p=2"
    HttpScanSpec spec = new HttpScanSpec(tableName);
    return new DynamicDrillTable(plugin, schemaName, null, spec);
}

3. 查詢參數傳遞鏈路

HttpScanSpec → AbstractStoragePlugin.getPhysicalScan() → HttpGroupScan → HttpSubScan → HttpScanBatchCreator → HttpRecordReader

4. RecordReader 核心邏輯

  • setup():發起 HTTP GET 請求,獲取 JSON 響應
  • next():使用 JsonReader 解析 JSON,寫入 VectorContainerWriter(Drill 列式內存格式)

5. 優化規則(可選)

實現 StoragePluginOptimizerRule 可將 Drill 的 WHERE 過濾條件下推為 HTTP 參數(如 MongoDB Plugin 將 WHERE a > 1 轉為 {$gt: 1}),減少數據傳輸。本 Demo 暫未完善,Drill 會在內存中過濾。

Calcite 與 Plan 轉換機制

Drill 依賴 Apache Calcite 進行 SQL 解析 → Logical Plan → Physical Plan(Execution Plan)優化。Plan 結構類似語法樹,StoragePluginOptimizerRule 本質是重寫語法樹節點。文檔匱乏、代碼複雜是擴展難點。

總結與避坑指南

  • 優勢: 實現 HTTP/REST API 的 SQL 化查詢,支持動態參數綁定,極大擴展 Drill 數據源邊界
  • 難點: 文檔極少,需閱讀 drill-mongo-storage 等官方插件源碼逆向工程
  • 限制: 僅支持 GET + JSON;POST、認證、分頁、Schema 推斷需二次開發
  • 部署: 打包 JAR 放入 jars/ 目錄,重啟 Drillbit,Web UI 配置啟用

源碼參考:drill-storage-http (GitHub)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved