【问题标题】:Elasticsearch Indexing by BulkRequestBuilder getting slow downBulkRequestBuilder 的 Elasticsearch 索引速度变慢
【发布时间】:2014-05-21 23:03:47
【问题描述】:

大家好,弹性搜索大师。

我有数百万数据要被 elasticsearch Java API 索引。 elasticsearch集群节点数为3(1为主+2节点)。

下面是我的代码sn-p。

Settings settings = ImmutableSettings.settingsBuilder()
     .put("cluster.name", "MyClusterName").build();

TransportClient client = new TransportClient(settings);
String hostname = "myhost ip";
int port = 9300; 
client.addTransportAddress(new InetSocketTransportAddress(hostname, port));

BulkRequestBuilder bulkBuilder = client.prepareBulk();
BufferedReader br = new BufferedReader(new InputStreamReader(new DataInputStream(new FileInputStream("my_file_path"))));
long bulkBuilderLength = 0;
String readLine = "";
String index = "my_index_name";
String type = "my_type_name";
String id = "";

while((readLine = br.readLine()) != null){

    id = somefunction(readLine);
    String json = new ObjectMapper().writeValueAsString(readLine);
    bulkBuilder.add(client.prepareIndex(index, type, id)
        .setSource(json));
    bulkBuilderLength++;
    if(bulkBuilderLength % 1000== 0){
        logger.info("##### " + bulkBuilderLength + " data indexed.");
        BulkResponse bulkRes = bulkBuilder.execute().actionGet();
        if(bulkRes.hasFailures()){
            logger.error("##### Bulk Request failure with error: " + bulkRes.buildFailureMessage());
        }
    }
}

br.close();

if(bulkBuilder.numberOfActions() > 0){
    logger.info("##### " + bulkBuilderLength + " data indexed.");
    BulkResponse bulkRes = bulkBuilder.execute().actionGet();
    if(bulkRes.hasFailures()){
        logger.error("##### Bulk Request failure with error: " + bulkRes.buildFailureMessage());
    }
    bulkBuilder = client.prepareBulk();
}

它工作正常,但是在数千个文档之后性能变得迅速下降

我已经尝试将“refresh_interval”的设置值更改为-1,将“number_of_replicas”的设置值更改为0。 但是,性能下降的情况是一样的。

如果我使用 bigdesk 监控集群的状态,GC 值每秒达到 1,如下图所示。

谁能帮帮我?

提前致谢。

====================更新======================== ===

终于,我解决了这个问题。 (见答案)。

问题的原因是我错过了重新创建新的 BulkRequestBuilder。 在我像下面这样更改我的代码 sn-p 后,性能永远不会下降。

非常感谢。

Settings settings = ImmutableSettings.settingsBuilder()
     .put("cluster.name", "MyClusterName").build();

TransportClient client = new TransportClient(settings);
String hostname = "myhost ip";
int port = 9300; 
client.addTransportAddress(new InetSocketTransportAddress(hostname, port));

BulkRequestBuilder bulkBuilder = client.prepareBulk();
BufferedReader br = new BufferedReader(new InputStreamReader(new DataInputStream(new FileInputStream("my_file_path"))));
long bulkBuilderLength = 0;
String readLine = "";
String index = "my_index_name";
String type = "my_type_name";
String id = "";

while((readLine = br.readLine()) != null){

    id = somefunction(readLine);
    String json = new ObjectMapper().writeValueAsString(readLine);
    bulkBuilder.add(client.prepareIndex(index, type, id)
        .setSource(json));
    bulkBuilderLength++;
    if(bulkBuilderLength % 1000== 0){
        logger.info("##### " + bulkBuilderLength + " data indexed.");
        BulkResponse bulkRes = bulkBuilder.execute().actionGet();
        if(bulkRes.hasFailures()){
            logger.error("##### Bulk Request failure with error: " + bulkRes.buildFailureMessage());
        }
        bulkBuilder = client.prepareBulk();  // This line is my mistake and the solution !!!
    }
}

br.close();

if(bulkBuilder.numberOfActions() > 0){
    logger.info("##### " + bulkBuilderLength + " data indexed.");
    BulkResponse bulkRes = bulkBuilder.execute().actionGet();
    if(bulkRes.hasFailures()){
        logger.error("##### Bulk Request failure with error: " + bulkRes.buildFailureMessage());
    }
    bulkBuilder = client.prepareBulk();
}

【问题讨论】:

标签: performance indexing elasticsearch


【解决方案1】:

这里的问题是在 Bulk 执行后你不会重新创建一个新的 Bulk。

这意味着您一次又一次地重新索引相同的第一个数据。

顺便说一句,看看 BulkProcessor 类。绝对更好用。

【讨论】:

  • 能否请您添加一些词来解释为什么 BulkProcessor 肯定更好用?
  • 基本上是因为它会为您自动执行所有操作。作为开发人员编写的代码更少。
  • 谢谢。如果一个执行得比另一个快,你有任何线索吗?
  • BulkProcessor 是 Bulk API 之上的一层。所以同样的吞吐量。
猜你喜欢
  • 2016-03-01
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 2016-12-10
  • 2016-08-28
  • 1970-01-01
  • 1970-01-01
  • 2016-11-10
相关资源
最近更新 更多