1

我们目前正在评估 Elasticsearch 作为我们的分析解决方案。主要驱动因素是,一旦将数据填充到 Elasticsearch 中,Kibana 就会免费提供报告。

在采用它之前,我的任务是对该工具进行性能分析。

主要要求是支持 500 evt/sec 的 PUT 速率。

我目前从一个小的设置开始,只是为了在我将它上传到更严肃的实验室之前了解 API。

我的策略基本上是,检查与我需要的格式相对应的分析 CSV,并将它们放入弹性搜索中。我没有使用批量 API,因为实际上事件不会以批量方式到达。

以下是执行此操作的主要代码:

        // Created once, used for creating a JSON from a bean
        ObjectMapper mapper = new ObjectMapper();

        // Creating a measurement for checking the count of sent events vs
        // ES stored events
        AnalyticsMetrics metrics = new AnalyticsMetrics();
        metrics.startRecording();

        File dir = new File(mFolder);
        for (File file : dir.listFiles()) {

            CSVReader reader = new CSVReader(new FileReader(file.getAbsolutePath()), '|');
            String [] nextLine;
            while ((nextLine = reader.readNext()) != null) {
                AnalyticRecord record = new AnalyticRecord();
                record.serializeLine(nextLine);

                // Generate json
                String json = mapper.writeValueAsString(record);

                IndexResponse response = mClient.getClient().prepareIndex("sdk_sync_log", "sdk_sync")
                        .setSource(json)
                        .execute()
                        .actionGet();

                // Recording Metrics
                metrics.sent();

            }
        }

        metrics.stopRecording();

        return metrics;

我有以下问题:

  1. 我如何通过 API 知道所有请求何时完成并将数据保存到 Elasticsearch 中?我可以在 Elasticsearch 中查询我的特定索引中的对象计数,但这样做本身就是一个新的性能因素,因此我取消了这个选项。
  2. 以上是将对象插入 Elasticsearch 的最快方法还是我可以做的其他优化。请记住,批量 API 目前不是一个选项。

提前谢谢。

PS:我在客户端和服务器上使用的 Elasticsearch 版本是 1.0.0。

4

1 回答 1

1
  1. Elasticsearch 索引响应具有isCreated()返回true文档是新文档还是false已更新的方法,可用于查看文档是否已成功插入/更新。

  2. 如果批量索引不是一个选项,则可以调整其他领域以提高性能,例如

    • 使用增加索引刷新间隔index.refresh_interval
    • index.number_of_replicas通过设置为 0禁用副本
    • 如果不需要,禁用_source_all字段。
于 2016-06-27T18:29:25.677 回答