擴展:事件流上的實時SQL(Real-Time SQL On Event Streams)

這個新版本最令人興奮的特性之一就是QueryRecord處理器和Record Reader和Record Writer組件。如果你不熟悉這些組件,那麼有一篇博客文章解釋了這些組件的工作原理。
這個由Apache Calcite支持的新處理器允許用戶編寫SQL SELECT語句,以在數據流經系統時運行數據。 NiFi中的每個FlowFile都可以視爲一個名爲FLOWFILE的數據庫表。這些SQL查詢可用於過濾數據中的特定列或字段,重命名這些列/字段,過濾行,對數據執行計算和聚合,路由數據,或者任何您可能希望使用的SQL。所有這一切都來自最廣爲人知和使用的領域特定語言的舒適範圍。

  • 總體流程:

  • csv內容:
purchase_no, customer_id, item_id, item_name, price, quantity
10280, 40070, 1028, Box of pencils, 6.99, 2
10280, 40070, 4402, Stapler, 12.99, 1
12440, 28302, 1029, Box of ink pens, 8.99, 1
28340, 41028, 1028, Box of pencils, 6.99, 18
28340, 41028, 1029, Box of ink pens, 8.99, 18
28340, 41028, 2038, Printer paper, 14.99, 10
28340, 41028, 4018, Clear tape, 2.99, 10
28340, 41028, 3329, Tape dispenser, 14.99, 10
28340, 41028, 5192, Envelopes, 4.99, 45
28340, 41028, 3203, Laptop Computer, 978.88, 2
28340, 41028, 2937, 24\" Monitor, 329.98, 2
49102, 47208, 3204, Powerful Laptop Computer, 1680.99, 1

CSV Reader:
爲了開始讀取和寫入數據,如上所述,我們將需要一個Record Reader service。 我們想分析CSV數據並將其轉換成JSON數據。 所以要做到這一點,我們需要一個 CSV Reader 和一個 JSON Writer

幸運的是,大多數這些屬性的默認值對大多數情況都很有用,但是如果不是逗號,您可以選擇要使用的分隔符。您可以選擇是否跳過第一行,將其視爲標題等。對於我的情況,我將設置“Treat First Line as Header”屬性爲“true”,因爲我的數據包含一個標題行,我不想要作爲記錄處理。第一個屬性是非常重要的。 “Schema Access Strategy”用於指導讀者如何獲取模式。默認情況下,它被設置爲“Use String Fields From Header”。既然我們也要寫數據,不過,我們還是必須配置一個模式。所以對於這個演示,我們將把這個策略改爲“Use 'Schema Name' Property。這意味着我們要從Schema Registry中查找模式。因此,我們現在將不得不創建我們的Schema Registry。如果我們點擊“Schema Registry”屬性,我們可以選擇“Create new service ...”:

JsonRecordSetWriter
現在我們可以添加我們的JsonRecordSetWriter控制器服務。當我們配置這個服務時,我們看到了一些熟悉的選項來指示如何確定模式。對於“Schema Access Strategy”,我們將再次使用默認的“Use 'Schema Name' Property”。另請注意,“Schema Name”屬性的默認值使用表達式語言來引用名爲“schema.name”的屬性。這提供了一個非常好的靈活性,因爲現在我們可以重新使用我們的record read和record write,並通過使用UpdateAttribute處理器來指定模式名稱來傳遞模式。我們將“Schema Registry”屬性設置爲我們剛纔創建和配置的AvroSchemaRegistry。
因爲這是一個Record Writer而不是一個Record Reader,所以我們還有另一個有趣的屬性:“Schema Write Strategy”。現在我們已經配置瞭如何確定數據的模式,我們需要告訴writer 如何將該模式傳達給下一個數據使用者。默認選項是Set 'schema.name' Attribute。我們將接受默認。但是我們也可以將整個模式寫成FlowFile屬性,或者使用一些對Hortonworks模式註冊表進行交互的策略。

AvroSchemaRegistry
爲了理解數據,record reader和record writer需要知道與數據關聯的模式。一些record reader(例如,Avro Reader)允許從數據本身讀取模式。該模式也可以作爲FlowFile屬性包含在內。但大多數情況下,它都將通過Schema Registry中的名稱查詢。在這個版本的NiFi中,存在兩個Schema Registry實現:基於Avro的Schema Registry服務和用於外部Hortonworks Schema Registry的客戶端。

我們將選擇創建一個AvroSchemaRegistry。 這裏需要注意的是,我們正在讀取CSV數據並編寫JSON數據 - 那麼爲什麼我們要使用AvroSchemaRegistry? 因爲這個Schema Registry允許我們使用Apache Avro Schema格式來傳遞模式,但是這並不意味着正在讀取的數據的格式。 使用Avro格式是因爲它已經是一種衆所周知的存儲數據模式的方式。
一旦我們添加了AvroSchemaRegistry,我們就可以對其進行配置,並在Properties選項卡中看到它根本沒有屬性。 我們可以通過添加一個新的用戶定義屬性來添加一個模式(點擊右上角的“添加”/“加號”按鈕)。 我們將使用這個作爲屬性的名稱給我們的模式名稱“hello-word”。 然後我們可以在我們的模式中輸入或粘貼。 對於那些不熟悉Avro模式的人來說,它是一種JSON格式的表示,其語法如下:

  • 詳細過程:
1.GenerateFlowFile 
 對於這個演示,我們將簡單地使用GenerateFlowFile來爲其提供數據。 我們將“Custom Text”屬性設置爲上面顯示的CSV。 在“Scheduling”選項卡中,我將配置處理器每10秒運行一次,這樣我就不會將數據氾濫到系統中。
2.UpdateAttribute
我們需要添加一個“schema.name”屬性,所以我們將GenerateFlowFile的“success”關係路由到UpdateAttribute處理器。 在這個處理器中,我們將添加一個名爲“schema.name”的新屬性,其值爲“hello-world”(以匹配我們添加到AvroSchemaRegistry服務的模式的名稱).因爲這是我們在Schema Registry中配置的模式的名稱。 我們將“success”關係路由到QueryRecord。
3.QueryRecord
在我們的Properties選項卡中,我們可以點擊“Add Property”按鈕添加一個新的屬性。 因爲我們可以在單個處理器中添加多個SQL查詢,所以我們需要一種方法來區分每個查詢的結果並適當地路由數據。 因此,屬性的名稱是匹配查詢的數據應該被路由到的關係的名稱。 我們將創建兩個查詢。 第一個將被命名爲“over.1000”,並且將包括花費超過$ 1,000.00的任何購買的purchase_no和customer_id字段,並且還將包括名爲total_price的新字段,該字段是整個購買的美元金額。 請注意,在NiFi中輸入屬性的值時,可以使用Shift + Enter在您的值中插入換行符:

voer.1000屬性的內容:
SELECT purchase_no, customer_id, SUM(price * quantity) AS total_price
FROM FLOWFILE
GROUP BY purchase_no, customer_id
HAVING SUM(price * quantity) > 1000

largest.order屬性的內容:
SELECT purchase_no, customer_id, SUM(price * quantity) AS total_price
FROM FLOWFILE
GROUP BY purchase_no, customer_id
ORDER BY total_price DESC
LIMIT 1


4.兩個UpdateAttribute
接下來,我們將創建兩個UpdateAttribute處理器,並將“over.1000”關係連接到第一個UpdateAttribute處理器,“largest.order”關係連接到第二個UpdateAttribute處理器。 這只是給我們一個簡單的地方來保存數據,以便我們可以查看它。 我將“fail”關係循環返回到QueryRecord處理器,以便如果評估SQL時出現問題,數據將保留在我的流程中。 我也會自動終止“原始”關係,因爲一旦我評估了SQL,我不再關心原始數據。 我也會自動終止每個終端UpdateAttribute處理器的“成功”關係。


發佈了32 篇原創文章 · 獲贊 16 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章