Elasticsearch+Kettle spoon:實現索引自動按月建立,資料插入到指定路由
背景
隨著時間的推進,es裡面的索引檔案越來越大。要想保住系統的效率,就必須要分索引、分路由。那麼問題來了,目前專案上採用的是Spoon7.1進行資料更新,這樣就存在以下問題:
1、利用spoon連es時,索引的名稱不支援動態變數?
2、抽取資料時,對es裡不存在的索引,spoon會自動生成,但不能生成我想要的mapping?
3、抽取到es,spoon不能指定文件插入的路由?
分析
針對第二點:可以利用es的template功能,設定模板,利用spoon往es裡抽取時,不存在的索引會自動生成。生成索引的時候會按照我們設定的模板進行生成,包括mapping。
針對第一點:利用現有的功能,沒有找到怎麼實現。
針對第三點:對於es2.0之前的版本,可以設定按照文件的某個欄位進行自動路由,但之後的版本不支援。
結論:要麼不用工具,要麼改造工具。比較了以下,後者工作量較小一點,確定這個為最終目標。
外掛改造
1、kettle spoon整個專案都是開源的,可以去github上下載你想改造的版本。然後就是漫長的本地部署,一定要注意下載的原始碼版本號要和安裝版的版本號一致。這個過程可以參考:https://blog.csdn.net/tj_java/article/details/78765158
2、分析plugins/elasticsearch-bulk-insert-plugin下的原始碼,如果改造的話,這裡會涉及到改造
ElasticSearchBulkDialog.java和ElasticSearchBulk.java檔案。具體細節就不詳述了。
3、修改後編譯整個目錄,然後將這兩個檔案的編譯檔案替換到elasticsearch-bulk-insert-plugin-7.0.0.0-25.jar下
4、改造的結果如下:
工程實施(簡單示例)
1、建立索引模板template_user,建立userindex開頭的索引都會採取以下配置。
請求地址:localhost:9200/_template/template_user 請求型別:put 請求引數: { "template" : "userindex*", "settings" : { "number_of_shards" : 1, "number_of_replicas": 0 }, "mappings" : { "usertype": { "properties": { "date": { "format": "strict_date_optional_time||epoch_millis", "type": "date" }, "sfzh": { "index": "not_analyzed", "type": "string" }, "ryxm": { "index": "not_analyzed", "type": "string" }, "type": { "type": "string" } } } } }
2、建立spoon轉換,每個月的資料都存放在“userindex+年月”索引,user路由下。
3、建立job,每隔10s抽取一次資料
4、點選執行。修改計算機的時間,調整月份,會發現會自動建立索引,資料也全部在user路由下面。如圖:
備註
1、es版本:2.3.2 spoon版本:7.1 ,下載地址請點選此處。
2、es外掛改造後的jar包下載地址。連結:https://pan.baidu.com/s/1Sgiue867Rxro1cFAdMWEtQ 密碼:ejnj