什么时候需要使用批处理

有界:批处理数据集代表数据的有限集合
持久:数据通常始终存储在某种类型的持久存储位置中
大量:批处理操作通常是处理极为海量数据集的唯一方法

批处理一般需要有以下特点

1、并行批处理:并行处理任务
2、按顺序处理依赖的任务
3、批量的每个单元都需要错误处理和回退;
4、完整的批处理事务
5、 每个单元需要监控和获取单元处理日志;
6、 提供多种触发规则,按日期,日历,周期触发

常说的批处理技术有哪些

技术 特点 实现
java6的executorservice

建立一个线程池,每次需要线程的时候来池中获取

a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。
b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
c. 提供定时执行、定期执行、单线程、并发数控制等功能。

一 Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

二、 ExecutorService 的submit() 与execute()区别
1、接收的参数不一样 submit()可以接受runnable和callable 有返回值
execute()接受runnable 无返回值

2、submit有返回值,而execute没有、submit方便Exception处理

 java7的forkjoinpool

 是ExecutorService的实现类,因此是一种特殊的线程池

 可以充分利用多cpu,多核cpu的优势,把一个任务拆分成多个“小任务”,把多个“小任务”放到多个处理器核心上并行执行;当多个“小任务”执行完成之后,再将这些执行结果合并起来即可

 创建了ForkJoinPool实例之后,就可以调用ForkJoinPool的submit(ForkJoinTask<T> task) 或invoke(ForkJoinTask<T> task)方法来执行指定任务了

其中ForkJoinTask代表一个可以并行、合并的任务。ForkJoinTask是一个抽象类,它还有两个抽象子类:RecusiveAction和RecusiveTask。其中RecusiveTask代表有返回值的任务,而RecusiveAction代表没有返回值的任务

 erlang-actor  在 Erlang 中,进程为最小的单位,也就是所谓的 Actor。注意 Erlang 的进程不是我们传统上的进程,它运行在 Erlang 虚拟机上,非常小,非常轻,可以瞬间创建上万,甚至几十万个,进程间完全是独立的,不共享内存。在进程运行时若出现错误,由于进程的轻量级,Erlang 采取的措施是“让其他进程修复”和“任其崩溃”。在 Erlang 上查看默认限制数量是26万多,可以进行修改。每个进程创建后都会有一个独一无二的 Pid,这些进程之间通过 Pid 来互相发送消息,进程的唯一交互方式也是消息传递,消息也许能被对方收到,也许不能,收到后可以处理该消息。如果想知道某个消息是否被进程收到,必须向该进程发送一个消息并等待回复  
go的goroutinue

首先看下进程和协程的定义和区别

进程是内存资源管理和cpu调度的执行单元。为了有效利用多核处理器的优势,将进程进一步细分,允许一个进程里存在多个线程,这多个线程还是共享同一片内存空间,但cpu调度的最小单元变成了线程

协程,可以看作是轻量级的线程。但与线程不同的是,线程的切换是由操作系统控制的,而协程的切换则是由用户控制的

 

goroutinue本质上就是协程。但有两点不同:
1. goroutinue可以实现并行,也就是说,多个协程可以在多个处理器同时跑。而协程同一时刻只能在一个处理器上跑(把宿主语言想象成单线程的就好了)。
2. goroutine之间的通信是通过channel,而协程的通信是通过yield和resume()操作

go的channel

在java的世界里,并发主要是靠锁住临界资源(共享内存)来保证同步的。而channel则是goroutinues之间进行通信的利器。

channel可以形象比喻为工厂里的传送带,一头的生产者goroutine往传输带放东西,另一头的消费者goroutinue则从输送带取东西。channel实际上是一个有类型的消息队列,遵循先进先出的特点。

1. channel的操作符号

ch <- ele 表示ele被发送给channel ch;

ele2 <- ch 表示从channel ch取一个值,然后赋给ele2

2. 阻塞式channel

channel默认是没有缓冲区的,也就是说,通信是阻塞的。send操作必须等到有消费者accept才算完成。
3 带有buff的channel

没有buff的channel只能容纳一个元素,而带有buff的channel则可以非阻塞容纳N个元素。发送数据到buffed channel不会被阻塞,除非channel已满;同样的,从buffed channel取数据也不会被阻塞,除非channel空了。这有点像java的ConcurrentLinkedQueue

 

批处理框架优缺点

技术 优势 缺点
hadoop

Hadoop自己参考谷歌有关海量数据处理所发表的多篇论文与经验,实现了相关算法和组件堆栈,使得大规模批处理技术变得更易用。
新版Hadoop包含多个组件,即多个层,通过配合使用可处理批数据

这种方法严重依赖持久存储,每个任务需要多次执行读取和写入操作,因此速度相对较慢
storm Storm可能是近实时处理领域的最佳解决方案。该技术可以用极低延迟处理数据,可用于希望获得最低延迟的工作负载。如果处理速度直接影响用户体验,例如需要将处理结果直接提供给访客打开的网站页面,此时Storm将会是一个很好的选择 Core Storm无法保证消息的处理顺序。Core Storm为消息提供了“至少一次”的处理保证,这意味着可以保证每条消息都能被处理,但也可能发生重复
spark

使用Spark而非Hadoop MapReduce的主要原因是速度。在内存计算策略和先进的DAG调度等机制的帮助下,Spark可以用更快速度处理相同的数据集
Spark的另一个重要优势在于多样性。该产品可作为独立集群部署,或与现有Hadoop集群集成。该产品可运行批处理和流处理,运行一个集群即可处理不同类型的任务

1、为流处理系统采用批处理的方法,需要对进入系统的数据进行缓冲。缓冲机制使得该技术可以处理非常大量的传入数据,提高整体吞吐率,但等待缓冲区清空也会导致延迟增高。这意味着Spark Streaming可能不适合处理对延迟有较高要求的工作
2、由于内存通常比磁盘空间更贵,因此相比基于磁盘的系统,Spark成本更高
3、相比Hadoop MapReduce,Spark的资源消耗更大,可能会对需要在同一时间使用集群的其他任务产生影响。从本质来看,Spark更不适合与Hadoop堆栈的其他组件共存一处

Spring Batch

通过Spring Batch框架可以构建出轻量级的健壮的并行处理应用,支持事务、并发、流程、监控、纵向和横向扩展,提供统一的接口管理和任务管理
框架提供了诸如以下的核心能力,让大家更关注在业务处理上。更是提供了如下的丰富能力:
健壮性:不会因为无效数据或错误数据导致程序崩溃;
可靠性:通过跟踪、监控、日志及相关的处理策略(重试、跳过、重启)实现批作业的可靠执行;
扩展性:通过并发或者并行技术实现应用的纵向和横向扩展,满足海量数据处理的性能需求

提供批处理框架仅能满足批处理作业的快速开发、执行能力。
批处理平台需要解决作业的统一调度、批处理作业的集中管理和管控、批处理作业的统一监控等能力