1、vmwareSPRING&CLOUD FOUNDRY 开发青大会基于Spring Batch的大数据量并行处理 池建强,70后程序员,98年毕业,先后就职于洪恩软件、RocketSofeware和用友集团.瑞友科技,现任瑞友科技IT应用研究院 副院长 先后从事互联网和企业应用开发,目前致力于基础应用平台的研究 热爱技术和编码工作,坚持年轻时的理想,倒霉的乐观者 技术领域:Java、Pythons Ruby、C/Objective-Cx DDD、OSGix App Platform Blog:/|7七。:池建强http:12年12月6日星期四大数据量胜于优秀算法卜如果数据足够多,可能产生出意想之
2、外的应用无论算法好坏,更多的数据总能带了来更好的效果12年12月6日星期四处理海量数据的利器Concurrency&Parallelism12年12月6日星期四Java6:ExecutorService Java7:Forl accentureHigh performance.Delivered.SpringSource与Accenture合作开发了Spring BatchAccenture在批处理架构上有着丰富的工业级别的经验,SpringSource贝ij 有着深刻的技术认知和Spring框架编程模型Accenture贡献了之前专用的批处理体系框架,这些框架历经数十年研发 和使用,为Spr
3、ing Batch提供了大量的参考经验Spring Batch借鉴了JCL(Job Control Language)和COBOL的语言特性12年12月6日星期四Spring Batch一款优秀的、开源的大数据量并行处理框架。通 过Spring Batch可以构建出轻量级的健壮的并行处理应用,支 持事务、并发、流程、监控、纵向和横向扩展,提供统一的接 口管理和任务管理。12年12月6日星期四12年12月6日星期四Spring Batch的技术特点 传统并发编程:线程和资源锁?复杂,容易出错,无法横向扩展 Spring Batch Domain:job,step,chunk,reader,pro
4、cessor,writer,trans,admin,scaling.开发者无需创建和管理线程,只需要把要处理的数据任务分解为job,并 为其定义属性和基础设施 通过reader,processor和writer来实现业务逻辑 面向过程,基于PQJO的开发方式12年12月6日星期四领域问题 Batch Data能够处理大批量数据的导入、导出和业务逻辑计算 Automation无需人工干预,能够自动化执行批量任务 Robustness不会因为无效数据或错误数据导致程序崩溃b Reliability通过跟踪、监控、日志及相关的处理策略(retry、skip、restart)Scaling通过并发和并
5、行技术实现应用的纵向和横向扩展,满足数据处 理的性能需求12年12月6日星期四Why Not Hadoop?Spring BatchHadoop框架运行时环境嵌入现有应用MapReduce/HBase/HDFS本地/远程分布式轻量级重量级中小数据巨量数据复用现有的Java库提供多种语言接口Spring Batch与Hadoop结合使用(定期推送日志到HDFS)12年12月6日星期四分层架构、领域、元素12年12月6日星期四业务逻辑T提供Batch执行环境 API级别的支持处理Batch的领域对象 job chunk step.策略管理Repeat,Retry,Transaction,Input
6、/Output12年12月6日星期四Spring Batch components and process12年12月6日星期四领域对象领域对象 描述Job repository基础组件,用来持久化Job的兀数据,默认使用内存Job launcher基础组件,用来启动JobJob应用组件,是Batch操作的基础执行单元StepJob的一个阶段,Job由一组Step构成laskletStep的个事务过程,包含重复执行、同步、异步等策略Item从数据源读出或写入的一条数据记录Chunk给定数量的Item的集合Item Reader从给定的数据源读取Item集合Item Processor在Item
7、写入数据源之前进行数据清洗(转换校验过滤)Item Writer把Chunk中包含的Item写入数据源12年12月6日星期四Job Job由一组Step构成,完成Batch数据操作的整个过程 Job instance特定的运行时Job实例,由Job launcher运行 Job execution某个Job实例的执行信息,包括执行时间、状态、退出 代码等等 Job实例和执行数据、参数等元数据信息都由Job repository进行持久化 启动Job:jobLauricher.run(demojob,jobParameterBulider.toJobParametersO);12年12月6日星期
8、四Job的运行时12年12月6日星期四Step Step是Job的一个执行阶段 Step 通过 tasklet 和 chunk 元素 控制数据的处理策略卜一组Step可以顺序执行,也可 以根据条件分支执行 Step的执行数据同样由Job repository进行持久化12年12月6日星期四DataSource:Flat File,XML,Database,Message(JMS、AMQP)ItemReader:FlatFileltemReader MultiResourceltemReader HibernatePagingltemReader HibernateCursorltemReade
9、r JdbcPagingltemReader JdbcCursorltemReader AmqpItemReadenjavaItemWriter:FlatFileltemWriter MultiResourceltemWriter HibernateltemWriter JdbcBatchltemWriter SimpleMailMessageltemWriter AmqpItemWriter.java12年12月6日星期四/ledgerjob/demojob/!-100条提交一次12年12月6日星期四/ledgerjob/demojob/batch:Step id=stepbatch:tas
10、klet task-executor=HtaskExecutorn12年12月6日星期四八|importProductsJo垃Gl decompressreadWriteskipped Decisionskipped Decisionnext on=SKIPPEDnext on=*generate Report丁/importProductsJoF)obk/decision .J12年12月6日星期四Triggering system(e.gM scheduler)External eventTriggersSpring Batch_AJob launcherJobJob repository
11、Reads and writesReads and writesData sources上下文环境12年12月6日星期四执行过程12年12月6日星期四回顾领域对象领域又幡描述Job repository基础组件,用来持久化Job的兀数据,默认使用内存Job launcher基础组件,用来启动JobJob应用组件,是Batch操作的基础执行单元StepJob的一个阶段,Job由一组Step构成laskletStep的个事务过程,包含重复执行、同步、异步等策略Item从数据源读出或写入的一条数据记录Chunk给定数量的Item的集合Item Reader从给定的数据源读取Item集合Item Pr
12、ocessor在Item写入数据源之前进行数据清洗(转换校验过滤)Item Writer把Chunk中包含的Item写入数据源12年12月6日星期四事务bSpringBatch默认采用Spring提供的声明式事务管理模式 Chunk支持事务管理,通过commit-interval设置每次提交的记录数 n支持对每个Tasklet设置细粒度的事物配置:隔离界别、传播行为、超时支持rollback和no rollback skippable-exception-classes no-rollback-exception-classes支持JMS Queue的事务级别配置12年12月6日星期四事务三步
13、曲12年12月6日星期四策略一bulletproof job12年12月6日星期四,健壮性:应对一切非致命的异常,我们只,可跟踪:根据需求设计忽略和重试策略,要记录的数据 I,可重启:对于已经执行或执行失败的Job,提供重启策略Spring Batch对此提供了丰富的支持12年12月6日星期四Bulletproof-WeaponWhen?What?Where?Skip发生非致命异常出现异常的情况下保证主体程 序正常运行面向Chunk的StepRetry发生瞬态异常当发生瞬态失败的时候进行重 试(例如遇到记录锁的情况)面向Chunk的Step和应用 程序代码中Restart发生异常失败之后在最后
14、执行失败的地方重启Job 实例启动Job的配置12年12月6日星期四Skip!-自定义忽略策略 一12年12月6日星期四Retry 12年12月6日星期四Restart 不仅仅是restart,Job失败了才会执行restart策略,如果你不想让这个任务restart,需要显式设置 restart的job会从失败的地方开始执行 可以设置restart的次数限制,不能无休止的restart restart指的是相同job参数的launchDecompress-L Read-write_x_CleanupOr?DecompressVRead-writeCleanup12年12月6日星期四Resta
15、rt 参数b restartable:job参数,是否可以重启,默认为true allow-start-if-complete:tasklet参数,执彳亍成功的 tasklet是否再restart时重新执行,默认为falseb start-limit:tasklet参数,重启step的次数,默认值是 lnteger.MAX_VALUE12年12月6日星期四流程 Spring Batch通过流程编排的方式实现顺序Step和分支条件Step 在Step中使用next属性指定下一步执行的Step 在Step中增加next元素进行分支跳转 多数情况下Step的结束状态并不能够满足复杂的条件流程,这时
16、就需要使用流程决策器,在Step中增加decision元素12年12月6日星期四skipped Decision八|importProductsJo垃decompressreadWriteskipped Decisionnext on=SKIPPED/importProductsJoF)_ _._ _ _ _f skippedDecision decider=skippedDeciderk/decision _.12年12月6日星期四Demo Idb2dbjob fle2dbjob skipjob12年12月6日星期四监控一Monitor12年12月6日星期四有人说:一个没有监控和跟踪的框架是
17、不完整滴Spring Batch提供了4种监控方式:直接查看Job repository的数据库信息,所有的Batch元数据都会持久化 到数据库中 使用Spring Batch提供的自且构建典g数据使用Spring Batch Admin,通过web控制台监控和操作Job)使用JMX12年12月6日星期四 Spring Batch Admin是Spring Source开源的基于Web方式 监控Batch Job的应用框架,既可以独立运行,也可以非常方便的集成到现有应用中,可以启动和监控Job的执行情况,提供Json数据,前端基于FreeMarker模板引擎,非常易与定制开发卜当前版本:1.2
18、.112年12月6日星期四安装步骤 TSitspring-batch-ad min-1.2.l.RELEASE.zip 解压缩进入spring-batch-admin-1.2.LRELEASE 的 sample目录 cd spring-batch-admin-parent/mvn install cd spring-batch-admin-sample/mvn install mvn会在 spring-batch&6101一5311|0八3901:下构ttj spring-batch-ad min-sample-1.2.1.RELEASE.war,根据该 war包可以容易搭建出batch ad
19、min的web应用 xdoc/xhtml/sample/spring-batch-admin-parent/pom.xml spring-batch-admin-sample/src/target/classes/,config/maven-archiver/spring-batch-admin-sample-1.2.1.RELEASE/surefire-reports/test-classes/war/J spring-batch-admin-sample-1.2.1.RELEASE.warhsql-manager.launch hsql-server.launch pom.xml serv
20、er.properties license.txt notice.txt12年12月6日星期四Batch Admin的配置 Batch Admin的配置文件和资源文件默认都打包到了jar中 定义dataSource、transactionManagerM ETA-INF/spring/batch/bootstrap/manager/data-source-context.xml 定义jobRepository、jobExplorer、jobLauncherM ETA-INF/spring/batch/bootstrap/manager/execution-context.xml 定义配置文件加
21、载路径/o rg/springframe wo rk/batch/admin/web/re sources/webapp-config.xml 支持多种数据库,启动Server时增加虚拟机参数识别数据库类型-DENVIRONMENT=mysql 是否需要初始化数据batch.data.source,in it=false 新增的job配置文件放置到META-INF/spring/batch/jobs/下,自动识别12年12月6日星期四Home Jobs Executions FilesStep Execution ProgressThis execution is estimated to b
22、e 100%complete after 10000 ms IHistory of Step Execution for Step-step1Summary after total of 3 executions:Batch Admin Dem。Details for Step ExecutionPropertyMinMaxMeanSigmaDuration per Read0000Duration10,00011,00010,666.667471.405Commits2121210Rollbacks0000Reads196,560196,560196,5600Writes196,560196
23、,560196,5600Filters0000Read Skips0000Write Skips0000Process Skips0000Property ValueIDJob ExecutionJob Name Step Name Start Date3513 paralleljob stepl 2012-12-0112年12月6日星期四扩展一Scaling12年12月6日星期四纵向扩展bigger;better;faster12年12月6日星期四Machine(Node)ApplicationLoad balancingReplicationMachine(Node)Machine(Nod
24、e)Machine(Node)ApplicationApplicationApplication、横向扩展(远程扩展),扩展更多的计算节点12年12月6日星期四Spring Batch的扩展类型名称.类型描述Multithreaded Step本地夕线程执仃iSl叩Parallel step本地通过多线程并行执行多个StepRemote chunking远程在远端节点上执行分布式Chunk操作Partitioning step本地/远程对数据进行分区,并分开执行12年12月6日星期四Multithreaded Step12年12月6日星期四Parallel step12年12月6日星期四Par
25、allel stepbatch:flow/batch:flowbatch:flow/batch:flow12年12月6日星期四Remote chunking Spring Batch 可以基于Spring Integration和JMS/AMQP实现 Remote chunking的扩展模式 Remote chunking把数据读取和数据处理分离在一台Master和 多台Slave上 Master负责读取并分发数据到多个Slave节点上进行数据处理b因为所有的数据读取都在Master进行,请确保Master的 Reader不是瓶颈12年12月6日星期四RemotechunkingSlaveMa
26、sterA ChunkProcessor WriterReadera)p 一 od x u n u。Slave12年12月6日星期四Partitioning step Spring Batch使用分区实现更细力度的扩展。使用分区的同时,我们 依然可以用到多线程和远程调用的技术 第一种Multithreaded模式没法指定哪个线程处理哪个数据,但是基 于Partition的多线程可以做到 Partitioning理论上比Remote Chunk更有扩展性,因为分区并不存 在从一个地方读取所有输入数据并进行序列化的瓶颈12年12月6日星期四Partitioning step12年12月6日星期四扩
27、展模式比较名称.类型比较Multithreaded Step本地由一组线程处理一个Step,所有的资源必须是线程 安全的,需要考虑并发的相关问题Parallel step本地使用多线程以并行的方式执行多个Step,并行的Step 都是相互独立的,所以没有并发问题Remote chunking远程通过SI、JMS、Httplnvoke等技术执行远程Chunk,Master发送Chunk到Slave进行计算处理,适用于 Master读数据不是瓶颈的场景Partitioning step本地/远程定义数据集然后并行执行,使用ExecutionContext的 方式对分区数据进行控制,可以使用本地或远程 Chunk12年12月6日星期四Demo3paralleljob partitionjob12年12月6日星期四Questions?aliad中因北京 2。12年12月7日8日,3,12年12月6日星期四vmwareSPRING&CLOUD FOUNDRY I开发看大会Thank You!12年12月6日星期四