分享

大数据多线程高效批量处理

 aaie_ 2017-01-03

工作中遇到的场景,这里写个例子出来,实际应用比此处更为健壮和完善

应用场景:

对一张表10万条数据(或100万或1亿+)进行更新操作或写入操作;

菜鸟是一条一条的执行吧,这显然不行啊

我在实际项目中是这样应用的, 批量更新!当然这显然是不够的 要线程批量更新才对吧!

怎么做呢?

举例1:10万条数据 ,我1000条1000条的处理 就是,10万/1000 = 100  ,

这里我就用100个线程同时处理,每个线程负责1000条数据,这里有个关键点,处理的数据不能重复!

给个代码示例吧:

线程池中线程数量可以根据 数据量/单个线程处理数量 来计算


public class DySchedule {
    private static AtomicInteger line = new AtomicInteger(0);
    static ExecutorService pool = Executors.newFixedThreadPool(100);

    public static int getLine(){
        return line.addAndGet(1000);
    }
    public static void doJob(){
        for (int i = 0;i<100;i++){
            Thread thread = new MyThread();
            pool.execute(thread);
        }
        pool.shutdown();

    }
    public static void main(String[] args) {
        DySchedule.doJob();
    }
}



以下是每个线程要执行的内容



public class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("线程:" + Thread.currentThread().getName());
        Integer num = DySchedule.getLine();
        System.out.println("startline = " +(num-1000)+",endline = " + num);
    }
}



程序运行结果:



线程:pool-1-thread-1
startline = 0,endline = 1000
线程:pool-1-thread-2
startline = 1000,endline = 2000
线程:pool-1-thread-5
线程:pool-1-thread-3
startline = 2000,endline = 3000
startline = 3000,endline = 4000
线程:pool-1-thread-4
startline = 4000,endline = 5000
线程:pool-1-thread-6
线程:pool-1-thread-7
startline = 6000,endline = 7000
startline = 5000,endline = 6000
线程:pool-1-thread-9
startline = 7000,endline = 8000
线程:pool-1-thread-8
startline = 8000,endline = 9000
线程:pool-1-thread-10
startline = 9000,endline = 10000
线程:pool-1-thread-12
startline = 10000,endline = 11000
线程:pool-1-thread-11
startline = 11000,endline = 12000
线程:pool-1-thread-16
startline = 12000,endline = 13000
线程:pool-1-thread-15
线程:pool-1-thread-19
startline = 14000,endline = 15000
startline = 13000,endline = 14000
线程:pool-1-thread-20
startline = 15000,endline = 16000
....
....



这里只把每个线程要处理的数据行数或分割号列举处理了,


比如以上

线程:pool-1-thread-1
startline = 0,endline = 1000 处理数据库0-1000行的数据

线程:pool-1-thread-2
startline = 1000,endline = 2000  处理1000-2000行的数据

接下来的批量任务内容是不是简单多了,不多少了,记住这里关键点就是保证数据不重复!,不遗漏!

这样子的思路几百万或者几千万级别的批量处理是没有什么问题的,

但是 你有几个亿或者几百亿的数据需要批量处理怎么办呢?  小伙子 别急,作为一名资深程序员当然还是有办法的

需要吧以上思路或方案设计成分布式,多任务,多线程的schedule 就可以了,

累了,点到为止吧..草草记下,不足之处可以留言

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多