Java 如何从ES1.7中读取海量数据以索引到ES6.7
需要从ES 1.7读取数据,以索引到6.7。 因为没有可用的升级。需要索引2亿条记录中近5 TB的数据。我们正在使用ES_REST_high_level_客户端(6.7.2),使用搜索和滚动方法。但无法使用滚动id进行滚动。尝试的另一种方法是使用起始和批量大小。最初,由于from偏移量增加,读取速度加快,因此读取非常糟糕。最好的方法是什么 第一种方法是使用搜索和滚动Java 如何从ES1.7中读取海量数据以索引到ES6.7,java,
elasticsearch,elastic-stack,elasticsearch-jest,Java,
elasticsearch,Elastic Stack,Elasticsearch Jest,需要从ES 1.7读取数据,以索引到6.7。 因为没有可用的升级。需要索引2亿条记录中近5 TB的数据。我们正在使用ES_REST_high_level_客户端(6.7.2),使用搜索和滚动方法。但无法使用滚动id进行滚动。尝试的另一种方法是使用起始和批量大小。最初,由于from偏移量增加,读取速度加快,因此读取非常糟糕。最好的方法是什么 第一种方法是使用搜索和滚动 SearchSourceBuilder searchSourceBuilder = new SearchS
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.size(10);
searchRequest.source(searchSourceBuilder);
searchRequest.scroll(TimeValue.timeValueMinutes(2));
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
String scrollId = searchResponse.getScrollId();
while (run) {
SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
scrollRequest.scroll(TimeValue.timeValueSeconds(60));
SearchResponse searchScrollResponse = client.scroll(scrollRequest, RequestOptions.DEFAULT);
scrollId = searchScrollResponse.getScrollId();
hits = searchScrollResponse.getHits();
if (hits.getHits().length == 0) {
run = false;
}
}
例外情况
线程“main”中的异常ElasticsearchStatusException[Elasticsearch异常[type=Exception,reason=ElasticsearchIllegalArgumentException[未能解码scrollId];嵌套:IOException[数组位置0中的错误Base64输入字符十进制123];]]
在org.elasticsearch.rest.BytesRestResponse.errorFromXContent(BytesRestResponse.java:177)
位于org.elasticsearch.client.RestHighLevelClient.parseEntity(RestHighLevelClient.java:2050)
位于org.elasticsearch.client.RestHighLevelClient.parseResponseException(RestHighLevelClient.java:2026)
:
第二种方法:
int offset = 0;
boolean run = true;
while (run) {
SearchRequest searchRequest = new SearchRequest("indexname");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.from(offset);
searchSourceBuilder.size(500);
searchRequest.source(searchSourceBuilder);
long start = System.currentTimeMillis();
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
long end = System.currentTimeMillis();
SearchHits hits = searchResponse.getHits();
System.out.println(" Total hits : " + hits.totalHits + " time : " + (end - start));
offset += 500;
if(hits.getHits().length == 0) {
run = false;
}
}
任何其他读取数据的方法。通常最好的解决方案是远程重新索引: 我不确定REST客户端是否仍然与1.x兼容,而远程reindex应该支持它
深度分页非常昂贵,这就是应该避免的原因-您可以在示例中看到原因。通常最好的解决方案是远程重新索引: 我不确定REST客户端是否仍然与1.x兼容,而远程reindex应该支持它
深度分页非常昂贵,这就是为什么应该避免的原因-您可以在示例中看到原因。1)以逻辑方式对数据进行切片(例如按日期),然后2)使用带有elasticsearch输入和elasticsearch输出的logstash如何?读取成本仍然很高。。指数增长得很大。。现在分割索引有点困难。。由于我们使用的是1.7 ES版本。我关于切片的建议与该版本无关,您将执行多个并行查询,每个查询都有各自的日期范围。1)逻辑切片数据(例如按日期),然后2)使用日志存储(带有elasticsearch输入和elasticsearch输出)如何?读取成本仍然很高。。指数增长得很大。。现在分割索引有点困难。。由于我们使用的是1.7 ES版本。我关于切片的建议与版本无关,您将执行多个并行查询,每个查询都有自己的日期范围。它不工作,因为版本是旧索引:),我们希望在文档中进行筛选和更新。从1.7到6.x的远程重新索引应该仍然有效。这支持过滤,您可以使用脚本更新文档。将类型更改为_doc将是我现在要清理的事情,以使升级到7个simplerIts不起作用,因为版本是旧索引:),并且我们希望在doc.Remote reindex中进行筛选和更新,从1.7到6.x应该仍然有效。这支持过滤,您可以使用脚本更新文档。将类型更改为_doc将是我现在要做的事情,以简化升级到7的过程