flink寫入es版本控制問題

寫入es有兩種,一種是create請求,覆蓋操作。一種update局部更新操作。本次討論各種情況es寫入的版本控制問題,以及flink1.6.x與es6.x的小插曲

1:測試不控制版本號的create覆蓋操作

Requests.indexRequest()
        .index("test")
        .type("_doc")
        .id(inputjson.getString("serialid"))
        .source(JsonUtil.convert2Map(inputjson.toString().trim()));

es上數據

改變數據再寫一次

可見不控制時每次寫入操作都會是version自動加1: 此時與——score 裏 version字段大小無關

2:對version進行指定寫入該條version=2  的數據

寫入

jsons.put("serialid","testcreate") ;
jsons.put("value1","1") ;
jsons.put("version","3") ;
Requests.indexRequest()
        .index("test")
        .type("version")
        .id(inputjson.getString("serialid"))
        .versionType(VersionType.EXTERNAL_GTE)
        .version(Long.valueOf(inputjson.getString("")))
        .source(JsonUtil.convert2Map(inputjson.toString().trim()));

es數據

 當我們指定的version比此時version3 要小時

 version conflict, current version [3] is higher than the one provided [2]]] 會直接拋出version異常

(VersionType.EXTERNAL_GTE允許寫入相等的數據,VersionType.EXTERNAL 對相等的verison也會拋出version異常不允許寫入),

但是當我們指定的version 爲null 

經測試該條數據會被過過濾,不寫入也不會拋異常,

當只指定versiontype 不指定version 時 異常不能正常寫入illegal version value [-3] for version type [EXTERNAL_GTE];

注:若之前寫入指定了version,後續又不指定versiontype與version 能正常寫入,version仍在原基礎上加1;

3:測試update操作

UpdateRequest updateRequest = new UpdateRequest()
.index("assemble_train_grab_order").type("_doc").id(inputjson.getString("serialid"))
       .doc(JsonUtil.convert2Map(inputjson.toString().trim())).upsert(JsonUtil.convert2Map(inputjson.toString().trim()))
       .retryOnConflict(5);

能正常update但是verion也自動加1

指定version時

.versionType(VersionType.EXTERNAL_GTE)
.version(Long.valueOf(inputjson.getString("version")))

直接拋異常

version type [EXTERNAL_GTE] is not supported by the update API;

可見局部更新不支持版本控制操作。

(不同版本類型控制)

inernal:若給定的版本與存儲文檔版本相同,則僅索引文檔。

external or external_gt:若給定版本嚴格高於存儲文檔版本或沒有現有文檔,則僅索引文檔。給定版本用作新版本,並與新文檔一起存儲,提供的版本必須是非負長號。

external_gte:僅在給定版本等於或高於存儲文檔的版本時索引文檔。若沒有現有文檔,操作也將成功。給定版本將用作新版本,並將與新文檔一起存儲。提供版本必須是非負長號。

注:external_gte版本類型適用於特殊用例,使用不當會導致數據丟失。還有另一個選項,force已被棄用,因爲它可能導致主分片和副本分片發散。

 

flink1.6.0寫入es6.x時update詭異問題

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-connector-elasticsearch6_${scala.binary.version}</artifactId>
    <version>1.6.0</version>
    <scope>compile</scope>
</dependency>

此時進行update操作時有異常

Exception in thread "main" org.apache.flink.runtime.client.JobExecutionException: Job execution failed.
    at org.apache.flink.runtime.jobmaster.JobResult.toJobExecutionResult(JobResult.java:146)
    at org.apache.flink.runtime.minicluster.MiniCluster.executeJobBlocking(MiniCluster.java:630)
    at org.apache.flink.streaming.api.environment.LocalStreamEnvironment.execute(LocalStreamEnvironment.java:123)
    at TestJob2Es6.main(TestJob2Es6.java:104)
Caused by: java.lang.NoSuchMethodError: org.elasticsearch.action.bulk.BulkProcessor.add(Lorg/elasticsearch/action/ActionRequest;)Lorg/elasticsearch/action/bulk/BulkProcessor;
    at org.apache.flink.streaming.connectors.elasticsearch.BulkProcessorIndexer.add(BulkProcessorIndexer.java:76)

查看異常BulkProcessor 沒有接受ActionRequest類型的add方法

查看發現

確實沒有,但是add方法接收的是DocWriteRequest   ,並非ActionRequest 但是

是由UpdateRequest調用的。

UpdateRequest 同時繼承了DocWriteRequest   ,並非ActionRequest  ,有點疑惑爲何 只認ActionRequest  ,報錯找不到方法。

<dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-elasticsearch6_${scala.binary.version}</artifactId> <version>1.6.3</version> <scope>compile</scope>
</dependency> 解決了此問題

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章