elasticsearch - 通过Logstash在大型数据集上加载Elasticsearch运行非常缓慢

标签 elasticsearch logstash

我在MySql中有一个大数据集(大约220万行),并且可以通过Logstash导入Elasticsearch,但是现在的运行速度非常慢

在我的本地计算机上,每个实例都有4GB RAM,运行起来比较快(花了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设置了computed_at =“0000-00-00 00:00:00”,而calculated_at是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

Mem: 3951 2507 1444 0 148 724

-/+ buffers/cache: 1634 2316

Swap: 4093 173 3920



因此,总内存= 4GB,并使用了2.5GB或的63.4%。因此,Elasticsearch服务器上的Ram似乎不是问题。

在MySql服务器上运行free -m,我看到以下内容:

         total       used       free     shared    buffers     cached

Mem: 3951 3836 115 0 2 1154

-/+ cache: 2679 1271

swap: 4093 813 3280



因此,总共使用了Ram = 4GB和〜3,8GB或 97%。这看起来像个问题。

我的理论是,我偶尔会交换到磁盘,这是它运行缓慢的部分原因。或者,也许我正在同时使用分页和限制,这使事情变慢了?

目前,Mysql服务器上的平均负载相对较低。
top

load average: 1,00, 1,00, 1,00



在/ data下,我看到:
sudo du -h -d 1

13G ./tmp_mysql

4,5G ./production



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

如果有人可以帮助我更快地执行查询,我将不胜感激!

编辑:
谢谢大家的有益反馈。事实证明,我的logstash导入已崩溃(由于在Mysql中/ tmp空间用完了子查询),并且我假设我可以继续运行相同的导入作业。好吧,我可以运行它,并将它加载到 flex 中,但是非常非常缓慢。当我完全重新实现索引的加载并开始在新索引上运行时,加载时间变得与过去相当。我估计将需要55个小时来加载数据-这是很长的时间,但至少现在可以正常工作了。

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

最佳答案

您在此处指出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)

    关于elasticsearch - 通过Logstash在大型数据集上加载Elasticsearch运行非常缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50295162/

    相关文章:

    linux - ssh 的记录

    python - 在elasticsearch-py中搜索多个索引产生0个文档

    angularjs - Jasmine 无法模拟 Elasticsearch 对象

    logging - ElasticSearch服务拥有日志

    windows - 适用于 Windows 的 Logstash 和 Kibana 安装程序

    logging - 使用Logstash解析日志时如何添加序列ID

    Eclipse 不更新我的 Play 框架应用程序的引用库

    elasticsearch - elasticsearch-head在浏览器中看不到

    elasticsearch - 如何通过Elasticsearch减少高CPU使用率

    elasticsearch - 删除事件字段并在 Logstash 中引用它