什么时候需要使用批处理
有界:批处理数据集代表数据的有限集合
持久:数据通常始终存储在某种类型的持久存储位置中
大量:批处理操作通常是处理极为海量数据集的唯一方法
批处理一般需要有以下特点
1、并行批处理:并行处理任务
2、按顺序处理依赖的任务
3、批量的每个单元都需要错误处理和回退;
4、完整的批处理事务
5、 每个单元需要监控和获取单元处理日志;
6、 提供多种触发规则,按日期,日历,周期触发
常说的批处理技术有哪些
技术 | 特点 | 实现 |
java6的executorservice | 建立一个线程池,每次需要线程的时候来池中获取 a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。 | 一 Java通过Executors提供四种线程池,分别为: 二、 ExecutorService 的submit() 与execute()区别 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本质上就是协程。但有两点不同: | 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才算完成。 没有buff的channel只能容纳一个元素,而带有buff的channel则可以非阻塞容纳N个元素。发送数据到buffed channel不会被阻塞,除非channel已满;同样的,从buffed channel取数据也不会被阻塞,除非channel空了。这有点像java的ConcurrentLinkedQueue |
批处理框架优缺点
技术 | 优势 | 缺点 |
hadoop | Hadoop自己参考谷歌有关海量数据处理所发表的多篇论文与经验,实现了相关算法和组件堆栈,使得大规模批处理技术变得更易用。 | 这种方法严重依赖持久存储,每个任务需要多次执行读取和写入操作,因此速度相对较慢 |
storm | Storm可能是近实时处理领域的最佳解决方案。该技术可以用极低延迟处理数据,可用于希望获得最低延迟的工作负载。如果处理速度直接影响用户体验,例如需要将处理结果直接提供给访客打开的网站页面,此时Storm将会是一个很好的选择 | Core Storm无法保证消息的处理顺序。Core Storm为消息提供了“至少一次”的处理保证,这意味着可以保证每条消息都能被处理,但也可能发生重复 |
spark | 使用Spark而非Hadoop MapReduce的主要原因是速度。在内存计算策略和先进的DAG调度等机制的帮助下,Spark可以用更快速度处理相同的数据集 | 1、为流处理系统采用批处理的方法,需要对进入系统的数据进行缓冲。缓冲机制使得该技术可以处理非常大量的传入数据,提高整体吞吐率,但等待缓冲区清空也会导致延迟增高。这意味着Spark Streaming可能不适合处理对延迟有较高要求的工作 |
Spring Batch | 通过Spring Batch框架可以构建出轻量级的健壮的并行处理应用,支持事务、并发、流程、监控、纵向和横向扩展,提供统一的接口管理和任务管理 | 提供批处理框架仅能满足批处理作业的快速开发、执行能力。 |