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 条评论
 下一页
  
  
  
  
  
  
  
  
  
  
  
 