Apache Spark是当今最流行的开源大数据处理框架。和Hadoop生态圈中的MapReduce一样,Spark用于进行分布式,大规模的数据处理,但Spark作为MapReduce的接任者,提供了更高级的编程接口,更高的性能。除此之外,Spark不仅能进行常规的批处理计算,还提供了流式计算支持。
MapReduce的问题
MapReduce是Hadoop生态系统中负责进行分布式计算的组件,MapReduce模型的诞生是大数据处理从无到有的飞跃。但随着技术的进步,对大数据的需求也变得越来越复杂,MapReduce的问题也日益凸显。通常,我们将MapReduce的输入和输出数据保留在HDFS上,很多时候复杂的ETL,数据清洗等工作无法用一次MapReduce完成,所以需要将多个MapReduce过程连接起来:
上图中只有两个MapReduce进行串联,但实际上可能有几十个甚至更多,依赖关系也更加复杂
这样的串联下,每次中间结果都要写入HDFS落盘保存,代价很大(HDFS的你每份数据都需要冗余若干份拷贝)。并且由于本质上是多次MapReduce任务,调度也比较麻烦,实时性更无从谈起。
流式计算框架:Spark Streaming
以往,批处理和流计算被看作大数据系统的两个方面。我们常常能看到这样的架构----以Kafka,Storm为代表的流计算框架用于实时计算,而Spark和MapReduce则负责每天,每个小时的数据批处理。在ETL等场合,这样的计算逻辑被实现两次,并且如何保证一致性也是个问题。
Spark Streaming正式诞生于此类需求。传统的流计算框架大多注重于低延迟,采用持续的算子模型;而Spark Streaming基于Spark,另辟蹊径提出了DStream方案将流数据切成很小的批,用一系列的短暂,无状态,确定性的批处理实现流处理。
spark中有三个角色:Drive,Worker,和Cluster Manager。
驱动程序(Drive)即用户编写的程序,对应一个SparkContext,负责任务的构造,调度,故障恢复等。驱动程序可以直接运行在客户端,例如在用户的应用程序中,也可以托管在Master上,这被称为集群模式,通常用于流计算等长期任务。
Worker节点负责执行计算任务,上面保存了RDD等数据。
Ckuster Manager顾名思义负责集群的资源分配,Spark自带的Spark Master支持任务的资源配,并包含一个Web UI用来监控任务运行状况。多个Master可以构成一主多备,通过ZooKeeper进行协调和故障恢复。
Spark Streaming的做法在流计算框架中很有创新性,他虽然牺牲了低延迟(一般流计算能做到100ms级别,Spark Streaming延迟一般为1s左右),但是带来了三个诱人的优势:
1.更高的吞吐量(大约是Storm的2-5倍)
2.更快速地失败恢复(通常只要1-2s),因此对于straggler(性能拖后腿的节点)直接干掉即可
开发者只需要维护一套ETL逻辑即可同时用于批处理和流计算
领取专属 10元无门槛券
私享最新 技术干货