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