1. 程式人生 > >Elasticsearch+Kettle spoon:實現索引自動按月建立,資料插入到指定路由

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