前言
近期接到一个任务,需要改造现有从mysql往Elasticsearch导入数据MTE(mysqlToEs)小工具,由于之前采用单线程导入,千亿数据需要两周左右的时间才能导入完成,导入效率非常低。所以楼主花了3天的时间,利用java线程池框架Executors中的FixedThreadPool线程池重写了MTE导入工具,单台服务器导入效率提高十几倍(合理调整线程数据,效率更高)。
关键技术栈
Elasticsearch
jdbc
ExecutorService\Thread
sql
工具说明
maven依赖
mysql
mysql-connector-java
${mysql.version}
org.elasticsearch
elasticsearch
${elasticsearch.version}
org.elasticsearch.client
transport
${elasticsearch.version}
org.projectlombok
lombok
${lombok.version}
com.alibaba
fastjson
${fastjson.version}
java线程池设置
默认线程池大小为21个,可调整。其中POR为处理流程已办数据线程池,ROR为处理流程已阅数据线程池。
privatestaticintTHREADS =21;
publicstaticExecutorService POR = Executors.newFixedThreadPool(THREADS);
publicstaticExecutorService ROR = Executors.newFixedThreadPool(THREADS);
定义已办生产者线程/已阅生产者线程:ZlPendProducer/ZlReadProducer
publicclassZlPendProducerimplementsRunnable {
...
@Override
publicvoidrun