【问题标题】:Loading Elasticsearch via Logstash on large dataset runs very slowly通过 Logstash 在大型数据集上加载 Elasticsearch 运行非常缓慢
【发布时间】:2018-05-18 23:33:55
【问题描述】:

我在 MySql 中有一个大型数据集(大约 220 万行),我通过 Logstash 导入到 Elasticsearch 的工作正常,但现在进展非常缓慢

在我的本地计算机上,每个具有 4GB RAM 的 vagrant 实例运行速度相对较快(需要 3 天),而服务器到服务器的传输估计需要 80 多天。

查询相当复杂(使用子查询等)。

我将 mysql 服务器从使用 /tmp 目录切换到使用 /data/tmp_mysql 目录,但即便如此,我偶尔也会用完临时空间。当我切换到 /data/tmp_mysql 目录来保存 /tmp 文件而不是 /tmp 目录时。

例如:我收到了错误:

message=>"执行 JDBC 查询时出现异常, 异常 Sequel::DatabaseError: Java::JavaSql::SQLException 写入文件'/data/tmp_mysql/MYHPf8X5'时出错(错误代码:28)

我将查询更新为具有此限制 (200): UPDATE p_results set computed_at="0000-00-00 00:00:00" WHERE computed_at IS NULL LIMIT 200;

我的配置文件如下所示:(注意我使用的是页面大小为 10000 的分页)。

    input {
    jdbc {
        jdbc_connection_string => "jdbc:mysql://xxx.xxx.xxx.xxx:3306/xxx_production"
        jdbc_user => "xxx"
        jdbc_password => "xxx"
        jdbc_driver_library => "/usr/share/java/mysql.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        statement_filepath => "./sql/req.sql"
        jdbc_paging_enabled => "true"
        jdbc_page_size => 10000
    }
}
    output {
        elasticsearch {
            index => "xxx_resultats_preprod2"
            document_type => "resultats"
            hosts => ["localhost:9200"]
            codec => "plain"
            template => "./resultats_template.json"
            template_name => "xxx_resultats"
            template_overwrite => true
            document_id => "%{result_id}"
        }
    }

我查看了一些文档here

在我的 logstash/elasticsearch 服务器上运行 free -m,我看到了:

 total   used   free shared  buffers  cached

电话号码:3951 2507 1444 0 148 724

-/+ 缓冲区/缓存:1634 2316

交换:4093 173 3920

所以总 RAM = 4GB,使用了 2.5GB 或 63.4%。所以 Elasticsearch 服务器上的 Ram 似乎不是问题。

在我的 MySql 服务器上运行 free -m 我看到了这个:

         total       used       free     shared    buffers     cached

电话号码:3951 3836 115 0 2 1154

-/+ 缓存:2679 1271

交换:4093 813 3280

所以总 RAM = 4GB 和 ~3,8GB 或 97% 被使用。这看起来像个问题。

我的理论是我偶尔会交换到磁盘,这也是它速度慢的部分原因。或者我可能同时使用分页和限制,这会减慢速度?

目前Mysql服务器的平均负载比较低。

top

平均负载:1,00, 1,00, 1,00

在我看到的 /data 下:

sudo du -h -d 1

13G ./tmp_mysql

4,5G ./生产

使用df-h 我明白了: 总使用率% /dev/sdb1 32G 6,2G 24G 21% /数据

如果有人可以帮助我加快查询的执行速度,我将不胜感激!

编辑: 感谢大家提供有用的反馈。事实证明我的logstash导入已经崩溃(由于Mysql中用于子查询的/tmp空间不足),我认为我可以继续运行相同的导入作业。好吧,我可以运行它,它会加载到弹性中,但是非常非常慢。当我完全重新实现索引的加载并开始在新索引上运行它时,加载时间变得与过去相当。我估计加载数据需要 55 个小时——虽然时间很长,但至少现在可以正常工作了。

我对我的 Mysql 子查询进行了 EXPLAIN,发现了一些我也可以解决/改进的索引问题。

【问题讨论】:

    标签: elasticsearch logstash


    【解决方案1】:

    您在此处指出 2 个潜在问题:

    • mysql读取慢
    • elasticsearch 写入慢

    你必须消灭一个!尝试在 stdout 上输出,看看 elasticsearch 是否是瓶颈。

    如果是,您可以使用一些 ES 设置来改进摄取:

    • refresh_interval => -1(禁用刷新)
    • 在导入时移除副本 (number_of_replicas:0)
    • 使用更多分片和更多节点

    (更多信息请访问https://www.elastic.co/guide/en/elasticsearch/reference/master/tune-for-indexing-speed.html

    【讨论】:

    • 我正在跟踪 logstash 日志,它的工作速度非常慢,以至于我没有得到任何输出——即使一次只运行 200 行也是如此。我会尝试你的建议。与 refresh_interval 等。谢谢!
    • 我不确定更多节点是否会加速,除非您说的是添加带有 ES 节点的物理机。
    • 当然可以! elasticsearch 水平扩展非常好,这是最大的优势。最好的配置是每个节点有 1 个分片,以便快速索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2013-06-26
    • 2012-03-31
    相关资源
    最近更新 更多