如何从用于弹性插入的python代码中改善parallel_bulk?

时间:2019-03-02 20:28:14

标签: python performance elasticsearch

我有一些文档(大小约为 if ($(window).scrollTop() > 50) { $('.bg').addClass('show'); $('nav li a').css('color', '#FFCF01'); $('nav li a').css('text-decoration', 'underline'); } else { $('.bg').removeClass('show'); $('nav li a').css('color', '#00529C'); $('nav li a').css('text-decoration', 'none'); }; ),我想使用python lib插入我的ES索引中,代码和使用300o/doc之间存在巨大的时差,很明显,是正常的,但我想知道时间是否可以改善(与时间比例相比)

  1. curl选项大约需要插入 20秒,整个时间需要 10秒(用于打印ES结果,但要插入20秒数据)

    curl
  2. 使用curl -H "Content-Type: application/json" -XPOST "localhost:9200/contentindex/doc/_bulk?" --data-binary @superfile.bulk.json 选项,我使用设置python10000/16/16)达到了至少 1min20

    chunk/thread/queue

事实

  • 我有一台装有 2个处理器xeon 8核 64GB内存
  • 的计算机
  • 我为每个import codecs from collections import deque from elasticsearch import Elasticsearch from elasticsearch.helpers import parallel_bulk es = Elasticsearch() def insert_data(filename, indexname): with codecs.open(filename, "r", encoding="utf-8", errors="ignore") as fic: for line in fic: json_line = {} json_line["data1"] = "random_foo_bar1" json_line["data2"] = "random_foo_bar2" # more fields ... yield { "_index": indexname, "_type": "doc", "_source": json_line } if __name__ == '__main__': pb = parallel_bulk(es, insert_data("superfile.bulk.json", "contentindex"), chunk_size=10000, thread_count=16, queue_size=16) deque(pb, maxlen=0) 尝试了多个值

问题

  • 我还能改善时间吗?

  • 如果没有,我应该考虑一种将数据写入文件然后对[100-50000]/[2-24]/[2-24]命令使用进程的方法吗?

——————————

如果我只尝试解析部分,则需要15秒:

curl

1 个答案:

答案 0 :(得分:0)

经过我的测试:

  1. curl比python客户端运行更快,显然curl实现得更好。

  2. 经过更多测试和使用参数后,我可以得出结论:

    1. Elasticsearch索引的性能取决于索引和整个集群的配置。通过将字段正确映射到索引中,可以提高性能。
    2. 我最好的方法是使用8个线程和10000个项目块。这取决于默认情况下 index.index_concurrency 的配置为8。

    3. 我认为将多节点群集与单独的主节点一起使用应该可以提高性能。

    4. 有关更多信息,您可以阅读我发现的精彩的两部分文章:herehere