Spark Streaming处于Spark生态技术栈中,能够和Spark Core和Spark SQL无缝整合;而Storm相对来讲比较单一;git
(一)概述github
Spark Streaming是Spark的核心API的一个扩展,能够实现高吞吐量、具备容错机制的实时流数据的处理。支持从多种数据源获取数据,包括kafka、Flume、Twitter、ZeroMQ以及TCP等,从数据获取以后,可使用诸如map、reduce、join、window等高级函数进行复杂算法处理。最后还能够将处理结果存储到文件系统,数据库;还可使用Spark的其余子框架,如图计算等,对流数据进行处理。算法
Spark Streaming在内部的处理机制是,就收实时流的数据,并根据必定的时间间隔拆分红一批批的数据,而后处理这些批数据,最终获得处理后的一批结果数据。对应的批数据(batch data),在Spark内核对应一个RDD实例,所以,对流数据DStream能够当作是一组RDDs。数据库
执行流程(Receiver模式):框架
提升并行度:receiver task会每隔200ms block.interval将接受来的数据分装到block中,调整block.interval的值;函数
启用多个receiver进程来并行接受数据;源码分析
对于Direct模式提升并行度的方式只需增长kafka partition的数量;Director模式,消费者偏移量由spark本身管理,存在checkpoint目录中spa
storm采用Master/Slave体系结构线程
nimbus:该进程运行在集群的主节点上,负责任务的指派和分发3d
supervisor:运行在集群的从节点上,负责执行任务的具体部分
zookeeper:帮助主从作到解耦,存储集群资源元数据,当storm把元数据信息都存到zk中后,那storm本身就作到了无状态,提交Topology应用的时候才会用到nimbus;
worker:运行处理具体组件逻辑进程,worker之间经过netty传送数据
task:worker中每一个spout/bolt的线程称为一个task,同一个spout/bolt的task可能会共享一个物理进程,该线程为executor
以上由spout和bolt组成的图叫作topologies,上层的spout或者bolt向下层的Bolt来发射数据的时候,默认状况下都是default stream
storm经常使用的分发策略一共有5种,最经常使用的是Shuffle grouping和Fields grouping
storm中的ack机制:说白了就是storm经过Acker组件去数数,数Tuple tree里面的Tuple是否都已经确认过,每一个Tuple Tree对应一个msgId
提升并行度:
增长worker数量;增长Executor数量;设置task数量,默认一个线程里面跑一个task
Storm实现可靠的消息保障机制:
Tuple 的彻底处理须要 Spout、Bolt 以及 Acker(Storm 中用来记录某棵 Tuple 树是否被彻底处理的节点)协同完成,如上图所示。从 Spout 发送 Tuple 到下游,并把相应信息通知给 Acker,整棵 Tuple 树中某个 Tuple 被成功处理了都会通知 Acker,待整棵 Tuple 树都被处理完成以后,Acker 将成功处理信息返回给 Spout;若是某个 Tuple 处理失败,或者超时,Acker 将会给 Spout 发送一个处理失败的消息,Spout 根据 Acker 的返回信息以及用户对消息保证机制的选择判断是否须要进行消息重传。