LargeDataBatch
Introduction
LargeDataBatch是一个轻量级大数据处理工具,提供简单易用的API。
Overview
在项目开发过程中,经常会遇到大数据问题处理问题,比如上G的数据需要入库,同时对数据的处理 通常会有内存限制和处理时间要求。基于此,开发此代码,可通过调整参数达到要求。
Features
1、通过调整线程数和批次数,可调节数据库CPU的高低,充分压榨数据库
2、默认提供对Mybatis的支持
3、提供定时读取和处理功能,适合比如读取MQ等不确定信息,但需要轮训并及时处理的情况
4、自动对数据进行分片
5、充分利用线程池,避免空闲线程
6、数据处理完毕后,可继续执行同步交易
Getting Started
Maven dependency
<dependency>
<groupId>cn.ymotel</groupId>
<artifactId>largedatabtach</artifactId>
<version>1.0.2</version>
</dependency>
Gradle dependency
compile group: 'cn.ymotel', name: 'largedatabtach', version:'1.0.2'
MybatisBatchDataConsumer mybatisbatch=new MybatisBatchDataConsumer();
mybatisbatch.setSqlSessionFactory(sqlSession);
LargeDataBatch batchhelp=new ThreadSafeLargeDataBatchHelp();
batchhelp.init(100,10,mybatisbatch);
MybatisResultHandler result=new MybatisResultHandler();
result.setSql("xx");
result.setDatabatch(batchhelp)
sqlSession.select("xxx",result);
batchhelp.end();
代码调用逻辑:
- 1、 batchhelp.init(100,10,mybatisbatch) 初始化批次数,线程数和数据处理类.
- 2、使用sqlSession.select()方法,调用MybatisResultHandler,将取得的数据放入batchhelp的队列中,
- 3、在batchhelp中的数据达到一个批次后,将数据和数据处理类推送给消费者(MybatisBatchDataConsumer)进行处理
- 4、 最后调用end方法,将队列中不够一个批次的数据推送给消费者类(MybatisBatchDataConsumer)进行处理
## Principle
在数据提供者提供数据后,将数据放入队列,如果队列达到批次数,将数据提交给线程池。
线程池有空闲队列,消费数据。线程池无空闲队列,阻塞主线程,防止过量获取数据。
线程池有空闲线程后,将队列数据再此提交给线程,同时唤醒主线程,使得主线程可继续提供数据
## Usage
数据提供者可以是数据库,也可以是文件或者其他类型,多种多样,只要能调用addData或者addSql方法即可。
数据提供者和消费者可自由组合
BatchDataConsumer接口介绍
消费者可通过spring配置或者通过new方法实例化进行定义。
程序得到消费者对象后,会生成多个副本,以提高性能
消费者类需要实现BatchDataConsumer接口,程序中因为将会生成多个副本,程序在调用end方法后
,会销毁程序中的副本,为了避免内存泄漏,请注意在close方法中关闭相应对象
程序会调用Runnable的run方法进行数据处理
ThreadSafeLargeDataBatchHelp 方法介绍:
LargeDataBatch 目前有LargeDataBatchHelp和ThreadSafeLargeDataBatchHelp两个实现类
,推荐使用ThreadSafeLargeDataBatchHelp
ThreadSafeLargeDataBatchHelp可在spring 中进行配置,供其他类引用。
/**
* 设置在一个jvm内的总的最高可并行的线程数,
* 在一个jvm中可能会多个地方调用ThreadSafeLargeDataBatchHelp类。
* 如果不加控制,可能导致应用服务器在同一时间线程数过大,应用服务器处理异常情况发生,
* 如果消费者同时超过数据库也可能导致数据库超过阈值情况发生
*不设置,则不会对线程池中的线程数进行总体控制
* @param totalThreadCount
*/
public void setTotalThread(int totalThreadCount) {
init方法中参数介绍:
beanName是spring中配置的beanName,需配置为singleton="false",需要实现BatchDataInterface 接口
使用此参数需要ThreadSafeLargeDataBatchHelp可得到ApplicationContext对象,
推荐在spring中进行自动注入,
batchsize在达到批次数后,会将一批数据整体提交到线程池进行处理,
在数据库中为了提高性能,对大数据的处理一般都是批次提交,
通过开启此batchsize后,可将数据自动分组
threadsize线程数,开启多少个线程同时处理此数据,
如果是数据处理结果是数据库入库操作,通过调整此大小,可提高或者降低数据库的CPU
timeout 超过时间,线程会将未达阀值数据自动提交,如果不设置超时时间
,则默认不开启。
需要定时轮训读取流信息,无法调用end方法的场景可通过增加此参数,实现自动提交
BatchDataInterface t 是通过new 方法实例化的bean
/**
* @param batchsize 在thread中的每次执行条数
* @param threadsize 同时并发的线程数
* @param beanName 在配置文件中改Aciton 需配置为singleton="false"
*/
public void init(int batchsize, int threadsize, String beanName)
/**
* @param batchsize 在thread中的每次执行条数
* @param threadsize 同时并发的线程数
* @param beanName 需配置为singleton="false"
* @param timeout 超过时间,线程会将未达阀值数据,自动提交
*/
public void init(int batchsize, int threadsize, String beanName, long timeout)
/**
* @param batchsize 在thread中的每次执行条数
* @param threadsize 同时并发的线程数
* @param t 实现 BatchDataInterface 的对象
*/
public void init(int batchsize, int threadsize, BatchDataInterface t)
/**
* @param batchsize 在thread中的每次执行条数
* @param threadsize 同时并发的线程数
* @param t 实现 BatchDataInterface 的对象
* @param timeout 超过时间,线程会将未达阀值数据,自动提交
*/
public void init(int batchsize, int threadsize, BatchDataInterface t, long timeout) {
addSql方法介绍:
程序会将sql和obj数据组成一个数组,放入队列中,在达到阈值将数据放入List中供消费者调用
/**
* 程序会将sql和数据组成一个数组,放入队列中,供消费者调用
* @param sql
* @param obj
*/
public void addSql(String sql, Object obj) {
/**
* 程序会将obj,放入队列中,在达到阈值将数据放入List中供消费者调用
* @param obj
*/
public void addData(Object obj){
/**
* 数据处理结尾一般会剩余一些未达到batchsize的数据未处理,通过调用此方法
*,可将未达到阈值的数据提交到线程池中进行处理
*/
public void end() {
网址:https://github.com/allon2/lightLargeDataBatch
分享到:
相关推荐
在大数据时代背景下,科研人员在进行数据分析和处理时,常用的桌面级数据处理软件如Excel和SPSS已经无法满足对大数据集的处理需求。这是因为这些软件在单机性能上存在限制,而大数据的处理和可视化往往需要依赖于...
这款工具的核心特点是其数据库采用桌面版SQLite,这是一种轻量级的关系型数据库管理系统,无需专门的服务器支持,直接在本地进行数据存储,非常适合小规模项目或个人开发使用。 SQLite作为数据库引擎,具有高度便携...
2. **数据处理速度快:** 通过采用分布式并行处理技术,轻量级大数据分析工具能够实现对大规模数据集的快速处理。 3. **易于使用:** 这类工具通常设计得易于使用,提供用户友好的界面和直观的操作流程,降低了使用...
总的来说,Rope轻量级ETL工具 v1.1.0不仅是一个功能完备的数据处理工具,也是学习和研究ETL流程、数据处理技术的理想平台。无论是学生进行毕业设计,还是专业开发者解决实际问题,都能从中受益。通过深入源码,我们...
《Python-小明NLP轻量级中文自然语言处理工具详解》 在信息化时代,自然语言处理(Natural Language Processing, NLP)技术已经成为人工智能领域的重要组成部分。尤其在中文环境中,由于其独特的语法结构和词汇特性...
Rufus是一款广受欢迎的轻量级U盘制作工具,它以其高效、便捷和无广告的特点在IT领域中受到用户喜爱。作为一个免安装的应用程序,Rufus能够在无需复杂配置的情况下快速启动并执行其主要功能——将USB驱动器格式化为可...
2. **性能卓越**:由于其轻量级的特性,CI在处理请求时的性能表现优秀,启动速度快,内存占用低。 3. **低学习曲线**:对于初学者,CI的结构清晰,代码规范,是学习PHP框架的理想选择。 4. **安全防护**:内置了防止...
在Java Web开发领域,"轻量级"一词通常指的是不依赖大型、重量级的服务器端框架,而是采用更加灵活、高效和小巧的工具集来构建应用程序。这样的开发方式有助于提高开发效率,减少资源消耗,并易于维护。本主题聚焦于...
- 枚举和结构:枚举用于定义一组相关的命名常量,结构是值类型的轻量级对象,适合表示小数据结构。 2. **.NET Framework** - CLR(Common Language Runtime):它是.NET框架的核心,负责代码的执行、内存管理、...
在iOS开发中,高效、轻量级的工具库对于提升项目的开发速度和代码质量至关重要。"iOS轻量级高效率工具库,都是项目中常用的工具分类.zip" 是一个开源项目,其中包含了一系列实用的工具类,旨在帮助开发者更加便捷地...
《轻量级分布式计算平台及其数据处理方法》 在当今数字化时代,数据的爆发式增长对计算能力提出了更高要求,轻量级分布式计算平台作为应对这一挑战的重要工具,正在各个行业中发挥着关键作用。该主题主要围绕轻量级...
总的来说,Apache JMeter 2.8作为一个轻量级的性能测试工具,不仅适用于开发人员进行性能调优,也适用于测试团队进行功能和压力测试。它的开源性质和丰富的社区支持使得用户可以充分利用其功能,以适应不断变化的...
《Python轻量级数据处理库DaPy:开启高效数据分析之旅》 在当今的数据科学领域,Python语言凭借其易学易用、丰富的库支持以及强大的计算能力,已经成为了数据分析的首选工具。而在这个领域中,有一个新兴的开源项目...
轻量级XML解析器是针对小型应用或资源有限的环境设计的,它通常不包含完整的DOM(Document Object Model)构建功能,而是采用更高效、更节省内存的方式处理XML文档。 在C语言中实现XML解析,往往需要关注以下几个...
它以其轻量级、模块化的设计理念,极大地简化了Java应用程序的构建,尤其在Web应用开发领域中,Spring扮演着至关重要的角色。 Spring框架的核心特性包括依赖注入(Dependency Injection,DI)和面向切面编程...
"Android-轻量级android工具类辅助类通用类"这个项目提供了一套简洁而实用的工具集合,适合各种Android应用开发场景。 首先,我们来详细了解一下工具类(Utils)在Android开发中的作用。工具类通常包含一组静态方法...
《轻量级Java EE企业应用实战 第3版》是一本深入浅出地讲解如何构建高效、灵活的企业级应用的书籍。源代码作为辅助学习的重要部分,可以帮助读者更好地理解和实践书中介绍的技术和概念。在这个压缩包中,我们主要...
标题中的“基于SpringBoot的轻量级物联网综合业务支撑平台源码”表明这是一个使用SpringBoot框架构建的项目,主要用于物联网(IoT)领域的业务支持。SpringBoot是Java生态系统中的一个热门框架,它简化了创建独立的、...
标题中的“轻量级SQL库,一键链接数据库”指的是那些设计简洁、资源占用少、易于使用的数据库管理工具,它们能够快速地与各种数据库系统建立连接,便于用户进行数据查询、管理、备份等操作。这样的工具通常对初学者...
总的来说,"Java Web轻量级开发全体验12-13"涵盖了从Spring MVC的使用,到依赖注入和面向切面编程的理解,再到ORM工具和测试实践的全方位知识。通过学习这些内容,开发者能够熟练地运用轻量级框架构建高效、可维护的...