阅读笔记
概述:
- 本文同样发表于2012年。提出了一种称为离散化数据流(Discretized Streams,D-Streams)的编程模型。
- 该模型提供了一种高级函数式API,具有高度的一致性和强大的容错能力。
- 基于Spark分布式计算框架,进行扩展实现了一个D-Stream的原型,称为Spark Streaming。
研究背景:
- 许多大数据应用要求实现实时响应。
- 社交网络应用需要在几分钟内分析出当前的热点话题。
- 广告提供商需要针对用户对广告的点击行为进行建模并训练。
- 服务器管理者需要在几秒内从海量日志信息中分析出服务器崩溃原因等。
- 当前多数分布式流处理系统,都采用"record-at-a-time"的方式,即接收一条记录->更新内部状态->返回新的记录。
- 这种方案在面临以下几方面的挑战:
- 容错:错误恢复涉及大量的复制操作,且占用硬件资源。
- 一致性:不同节点对数据的处理时间各不相同,需要保证计算结果的正确性
- 同批量计算系统的统一:流式计算系统是事件驱动的,同批量计算的API大不相同,难以整合。
主要工作:
- 提出了新的编程模型,离散化数据流(Discretized Streams, D-Streams)。
- 核心思想是将流式计算看做一系列很短时间间隔内的确定的批量计算的累积。
- 该模型的优点如下:
- 每个记录在它来临的时间间隔内都被系统原子处理,保证了一致性。
- 处理模型易于同批量计算系统统一起来。
- 采用批量计算的容错处理方法,降低数据恢复代价。
- 为了保证时间划分的粒度足够细,响应足够快,需要中间数据缓存在内存中。
- 为了保证容错恢复的高效,数据在内存中以RDD的形式存放。
- 在Spark系统的支持下,时间划分的粒度可以达到秒级别,这对于许多实际的大数据应用来说是足够的。
- 基于Spark分布式计算框架扩展得到了Spark Streaming,是D-Stream的原型实现。
关于D-Stream:
- 每个时间段内接收到的数据存储在集群上,构成了该时间段的输入数据集。
- 时间段结束时,数据集通过确定性的并行操作处理,如map,reduce,groupBy等,得到新的数据集或计算结果。
- D-Stream提供两种运算供用户构建流式计算程序。
- 转换操作: 由父数据流产生新的数据流,生成的数据可以对各个时间段独立,也可以为所有时间段共享。这里复用了Spark提供的算如map,reduce,join等。
- 输出操作: 将数据输出写到外部存储系统(如HDFS)中,如save,foreach。
- 另外,D-Stream还提供了一些跨越时间区间的算子:
- window:将过去一段时间间隔的数据汇总得到一个新的数据集
- Incremental agggation:将过去一段时间间隔的数据按照指定的方式累加
- Time-skewed join:对过去一段时间的数据集进行连接操作。
注意: D-Stream的容错机制基于RDD通过构造lineage图实现,在最初提出Spark的论文中有详细介绍,这里不再赘述。
实例:页面访问时间计数
实现:
pageViews = readStream("http://...", "1s")
ones = pageViews.map(event => (event.url, 1))
counts = ones.runningReduce((a, b) => a + b)
说明:
- 首先通过HTTP协议读取事件流,生成数据集pageView。
- 然后通过map操作将数据转换为键值对,生成ones,键为事件的url。
- 最后通过runningReduce操作进行计数。
关于Spark Streaming:
- 基于Spark运行时实现
- 能够从网络上或定期从HDFS中读取数据流
- 使用亚马逊EC2节点部署集群进行了简单的评测,每个节点4核15GB RAM。
- 扩展性:使用grep和wordCount两个实际应用测试,吞吐量随借点个数增加基本呈线性增长,可扩展性良好。
- 容错性:使用maxCount和wordCount两个应用测试,仅需几秒就能完成错误恢复。
知识补充
批量计算 vs. 流式计算:
- 大数据计算模式可分为批量计算和流式计算。
- 批量计算:批量计算首先进行数据的存储,然后再对存储的静态数据进行集中计算。Hadoop是典型的大数据批量计算架构,由HDFS分布式文件系统负责静态数据的存储,并通过MapReduce将计算逻辑分配到各数据节点进行数据计算和价值发现。
- 流式计算:流式计算中,无法确定数据的到来时刻和到来顺序,也无法将全部数据存储起来.因此,不再进行流式数据的存储,而是当流动的数据到来后在内存中直接进行数据的实时计算。
- 流式计算和批量计算分别适用于不同的大数据应用场景。
- 对于先存储后计算,实时性要求不高,同时,数据的准确性、全面性更为重要的应用场景,批量计算模式更合适;对于无需先存储,可以直接进行数据计算。
- 实时性要求很严格,但数据的精确度要求稍微宽松的应用场景,流式计算具有明显优势。