這次有機會可以測試Nifi,是因為公司想要將用了多年的ETL工具替換掉,因此找了Nifi來做測試。測試的案例,先選擇最簡單的方式:
這看起來簡單的流程,其實對第一次玩Nifi的我,已經是很大的挑戰了。這過程中,遇到最大的問題就在於,Oracle的SQL並不會區分大小寫,但Nifi在判別SQL時,是會有大小寫之分的,因此無論我如何檢查DB或SQL,最後都還是會出現”Table not found, ensure the Catalog…..”的錯誤,最後請專業DBA的幫忙,才查出這個小細節。
Nifi 的設計如下:
1. QueryDatabaseTable
主要就是用SQL將資料從DB拉出來,可以利用原始的欄位填寫,Nifi會自動組成SQL,抑或自己寫SQL去抓。
QueryDatabaseTable Setting
2. ConvertAvroToJSON
將資料型態從Apache專屬的Avro轉變成JSON。什麼原因需要這個Process呢,主要是因為下面"ConvertJSONToSQL",因此才需要將資料留做轉換。其中的JSON container options設定上選擇"array"和"none"在我的測試案例中,會產生不一樣的結果:
- array:會將資料拆分為多筆。
- none:僅會留存一筆。(哪一筆還需要進一步測試。)
3. ConvertJSONToSQL
將JSON的資料轉換成SQL,SQL可以選擇Insert、Update、Delete。這邊的Table Name以Oracle為例,需填寫大寫,如填寫小寫會出現找不到Table的錯誤訊息。處理SQL的模式是依照?的概念處理的,例如Insert into (Column1,Column2) value (?,?),將?的值放在Attribute裡。
4. 就來到最後的PutSQL,來執行從前一關組成的SQL。設定上沒有特別研究。
做完第一個流程後,心中還有幾個想要加入流程中:
- 在Insert前多加Delete。
- 能控制執行的次數,列如多加GenerateFlowFile的Process。
結論: 這個流程上,都沒有用到"Record Reader"和"Record Writer",設定上比較簡單。