寫入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> 解決了此問題