MySQL抽取数据至es
2022-04-06 17:01:17 16 举报
AI智能生成
数据抽取思维导图
作者其他创作
大纲/内容
业务场景:
接口代理平台的接口调用日志数据量过大,
mysql查询压力太大,所以需要引入ES。
引入之后需要将mysql中的全部数据迁移至ES
接口代理平台的接口调用日志数据量过大,
mysql查询压力太大,所以需要引入ES。
引入之后需要将mysql中的全部数据迁移至ES
自研程序抽取
数据的处理
问题
在原有数据的基础上增加字段,
数据量过大导致多表联合查询速度过慢
数据量过大导致多表联合查询速度过慢
将主表需要关联查询的表单独关联查询
通过程序进行匹配
通过程序进行匹配
修改表结构,优化索引
遍历查询结果进行匹配
将查询结果放入Map集合中,通过.get方法直接获取对象
(HashMap的最大的优点就是get非常快,因为他对每一个key都做了哈希算法)
(HashMap的最大的优点就是get非常快,因为他对每一个key都做了哈希算法)
问题
因为es中是按照时间创建的索引,mysql的数据怎么按照时间分组查询,增加where条件会使查询效率比较慢
解决
es提供的API中的bulk,可以根据索引信息插入到指定索引中
数据的查询
问题
数据量太大,全部查询效率太低(4亿数据,每次循环10000条,循环次数40000次;若改为20个线程,则每个线程循环2000次)
解决
数据表是按照用hash根据自增ID做的分区,一共20个分区,起20个线程分区查询
问题
随着偏移量的增发查询效率会降低,不采用偏移量。因为ID是自增主键,所以根据ID增序排序并且增加where条件不会对效率造成太大影响
SQL语句
解决
批量推送分页问题,limit 0,10000,使用偏移量进行分页,随着偏移量的增大查询效率有明显的降低
数据的插入
问题
查询出的数据循环单条插入至es,单条发送效率太慢;每条数据一个请求,请求过多导致es内存溢出报错
对于es插入失败未处理,导致数据丢失
发送过程中,程序停止后怎么重启接着进行,而不是从头再来,之前的程序每次抽取速度大约4天的时间,每次重来的代价太大
解决
将单条发送请求改为_bulk批量发送新增数据,对于内存溢出问题,降低请求频率,增大es的内存限制(8G,建议最大设置为物理内存的一半)
es的返回结果有好几种,具体的报错返回信息不同,需要做特殊处理
批量数据全部推送成功的返回结果:
批量推送数据,部分数据推送错误的返回结果:
请求发送失败
每次抽取的数据是根据ID自增的,将每个线程的每次循环的最大ID记录在文件,每次循环完修改文件值
数据抽取结果
438658256条数据,成功438658255条,失败1条,失败数据已记录文件
总花费时间15510秒(4.3h),平均速率28282条/秒
数据抽取过程中的其他问题
select count(*)查询数据量出现不准确的情况,可能原因:mysql5.6及以上,官方对count(*)进行了优化,通过优化器分析,使用了辅助索引,而不是聚簇索引或全盘扫描,但是可能数据表的索引破坏导致查询的数据量不准确
解决方法,因为是自增主键,所以添加where ID > 0的条件,变向的进行了全表扫描
收藏
0 条评论
下一页