栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

Logstash导入mysql数据到es慢的解决方法

Logstash导入mysql数据到es慢的解决方法

有一个千万级别的数据库存放在Mysql中,由于直接在Mysql中使用语句查询,一次的时间要十几分钟,无法满足应用的需求,因此考虑将其导入到elasticsearch中进行倒排索引查询。

使用的工具是Logstash,但是Logstash的导入速度随着导入数据量的增大变得越来越慢。查询后发现在数据量增大时变慢的原因是因为mysql的深度分页达到了瓶颈。因为logstash在我们自己写的的sql上又加了一层作为封装

在logstash的导入conf配置文件中的statement代码

SELECt * FROM xxx 

Logstash的实际执行代码(设置了jdbc的分页大小为10000)

SELECt * FROM (SELECt * FROM xxx) AS `t1` LIMIT 10000 OFFSET 510000

这样做造成的结果就是,从数据库中先取出510000条数据,再对这些数据进行分页,丢弃掉前500000条,保留最后10000条。因此随着OFFSET的增大,一次的查询时间也随着增大。在自己踩的坑中,当OFFSET达到300多W时一次查询的时间可能就需要半小时之久,一天才能入库几十万条,这明显达不到我们导入的要求。

其中也尝试了对logstash进行配置上的设置,比如调整pipeline.worker的数量、增大分配给Logstash的内存大小等,虽然有提高速度,但还是远远不够。 

因此最终的解决方案是:按照数据库中的id使用偏移量来进行全量入库,避免logstash自己进行分页

最终配置文件代码如下

input {
  jdbc {
     # 指明jdbc驱动包位置和要使用的驱动包类。
    jdbc_driver_library => "D:/tools/elasticsearch-7.6.2/logstash-7.6.2/mysql-connector-java-8.0.19.jar"
    jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
     # myqsl数据库的连接信息
    jdbc_connection_string => "jdbc:mysql://localhost:3306/xxxx?serverTimezone=UTC"
    jdbc_user => "user"
    jdbc_password => "password"
    # 设置分页的部分
	record_last_run => true
	use_column_value => true
    tracking_column => "id"
    #info.txt用于存放上次查询id的偏移量
	last_run_metadata_path => "D:toolselasticsearch-7.6.2logstash-7.6.2自己的info.txt的路径"
    #每分钟执行一次该语句
	schedule => "* * * * *"
    statement => "SELECt * from xxx where id > :sql_last_value limit 10000"
  }
}

output {
  # 将数据输出到ElasticSearch中
    elasticsearch {
    hosts => ["127.0.0.1:9200"]
    # es文档索引和文档数据的id
    index => "xxxx"
	document_id => "%{id}"
  }
}

最后的运行效果如图所示,基本上CPU的占用率是跑满了,600多W条数据只用了几个小时,相较于之前200多W条数据跑两天,速度得到了很大的提升。

Kibana上检测的数据变化情况

 参考内容

[elk]-logstash导入mysql越来越慢_爷来辣的博客-CSDN博客

logstash7.0.1将数据从mysql5.7同步至es7.0.1大数据量下同步慢的问题_java_xxxx的博客-CSDN博客

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/336096.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号