我们要提高批量装载的速度。

现在我们使用JAVA将文档批量加载到Elasticsearch。我们计划导入1000万个文档,每个文档大小几乎为8M。现在,我们每天只能导入40万个文档/每秒导入5个文档。
我们的ES基础架构是3个主节点和4G ES_JAVA_OPTS(堆大小),2个数据节点和2个具有2G内存的客户端节点。当我想提高批量加载的速度时,我们将解决堆大小问题。我们在Kubernetes上建立了es集群。
I / O在下面。

dd if=/dev/zero of=/data/tmp/test1.img bs=1G count=10 oflag=dsync
10737418240 bytes (11 GB) copied, 50.7528 s, 212 MB/s

dd if=/dev/zero of=/data/tmp/test2.img bs=512 count=100000 oflag=dsync
51200000 bytes (51 MB) copied, 336.107 s, 152 kB/s

有什么建议可以改善吗?
    for (int x =0; x<200000;x++) {
        BulkRequest bulkRequest = new BulkRequest();
        for (int k = 0; k < 50; k++) {
            Order order = generateOrder();
            IndexRequest indexRequest = new IndexRequest("orderpot", "orderpot");
            Object esDataMap = objectToMap(order);
            String source = JSONObject.valueToString(esDataMap);
            indexRequest.source(source, XContentType.JSON);
            bulkRequest.add(indexRequest);
        }
        rhlclient.bulk(bulkRequest, RequestOptions.DEFAULT);

超过堆大小

最佳答案

似乎数据节点需要更多内存.10m文档(每个8m)将花费大量内存,并且可以减少主节点的内存并添加数据节点,主节点比数据节点需要更少的内存,如果没有更多的节点,您可以将客户端节点与数据节点组合在一起,更多的数据节点则分担压力。
其他一些建议:
1.编制索引时,通过将index.refresh_interval设置为-1并将index.number_of_replicas设置为0来禁用刷新。
2.为您的索引设置一个映射,不要使用默认映射,例如:有些字段可以是整数,不需要使用long,有些字段可以是文本,但永远不会使用关键字,有些字段仅用作文本。

[官方给出的分度索引速度] [1] https://www.elastic.co/guide/en/elasticsearch/reference/master/tune-for-indexing-speed.html

关于elasticsearch - elasticsearch bulkload性能问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57536485/

10-16 11:33
查看更多