Spark Streaming揭秘 Day32 WAL框架及实现
Spark Streaming揭秘 Day32
WAL框架及实现
今天会聚焦于SparkStreaming中非常重要的数据安全机制WAL(预写日志)。
设计要点
从本质点说,WAL框架是一个存储系统,可以简单的认为是一个文件系统,其作用类似于BlockManager,
我们首先看一下官方的说明:

这里有三个要点:
- 总体上,sparksteaming是用WAL去保存接收到的数据,并且在写入数据后,要把元数据汇报给Driver,这样失败了才能恢复起来。
- 每当写入一个log,就返回一个handle,handle包含所有的从写入后的记录中恢复回原来数据的所有信息,和blockManager是一样的,使用时间来索引record,所以在sparkstreaming,WAL是顺序读写的。这个时间也方便我们进行清理(会有一个自己的超时时间)。具体的子类,必须确保数据是可持久化和可读取的。
- 为什么选择顺序写,是因为在数据备份的时候,效率会比较高。当读的时候,采用一块一块的读,而不是一条一条的读,找数据的时候,需要找到起始点,并结合数据长度来批量读取,而不是读一条,找一条。可以极大的节省读取的时间。
总体结构
WriteAheadLog作为一个抽象类,主要提供一些操作的方法,并没有说明如何对数据本身如何进行操作。因为具体的操作往往会涉及底层的存储系统。这种写法,可以使客户端依赖于抽象,而不是依赖于具体,既方便使用者,也方便开发者。最为关键的是下面三个方法:

- write方法,输入一个ByteBuffer,ByteBuffer只是个很简单的java类,里面封装了一个字节数组。
- read方法,基于handle,读取我们要读取的记录。
- clean方法,threshTime是一个阀值,在之前的数据会被清理掉。
那handle里是啥呢,其实非常简单,WriteAheadLogRecordHandle也是抽象的。具体实现在FileBasedWriteAheadLogSegment:

这是个case class,只是保存了三个信息,数据文件路径、位置以及数据长度。
WriteAheadLog实现
FileBasedWriteAheadLog是WriteAheadLog一般情况下的实现。
让我们看下说明,在管理WAL文件时,会把数据周期性的写入日志文件中。当失败时,会从文件中恢复数据。
这里的关键是rolling的管理方式,这是写数据的一种特征,写log的时候,每隔一段时间,就把已经在写的文件关闭掉,再产生新的文件保存新的数据。这种方式的好处是:
- 写的文件,单个文件不会太大。
- 删除数据比较方便。

currentLogWriter是WAL中的关键,专门来写数据到log file中,一个文件会对应一个writer,产生新的文件就会有新的writer。实际存数据时是放在checkpoint Directory下的。

write方法,是写入数据到hadoop支持的文件系统中,并且会确保数据已经到了文件系统中。其中会根据时间获取writer来写入数据。

其中,getLogWriter放大,会根据时间,生成writer,从代码看,会按照时间分段来生成新文件。这是实现rolling方式的关键。

read方法,根据file segment来读数据,所以实际读数据时是一批一批读的。

intitializeOrRecover方法也是关键,在启动时调用,会根据文件信息恢复pastLogs,也就是说在记录log文件时,文件是自解释的,包含开始时间、结束时间和路径。

Writer和Reader实现
FileBasedWriteAheadLogWriter负责将数据写入日志文件中。

每次把数据写完的时候,都会记录offset和length。flush会调用文件系统的方法,优先使用hflush方法,否则使用sync方法。
FileBasedWriteAheadLogRandomReader是reader的默认实现,会根据给定handle返回block。

首先会使用seek方法跳到索引位置,此后采用原生字节操作进行读取,同时会加锁,返回时用HeapByteBuffer封装起来。
除了random的方式,还有一种顺序读的方式FileBasedWriteAheadLogReader,采用了迭代器来封装,数据在hasNext中产生,next方法只是读取结果。
WAL触发机制
那么,WAL机制在SparkStreaming框架中是如何触发的呢?
首先,在接收数据后,会判断是不是要进行WAL操作。

在构造时,createLog方法默认情况,就是创建了FileBasedWriteAheadLog,需要注意的是在WAL方式下数据副本只能有一个。

storeBlock方法中实际触发操作,这里构建了一个future(和blockManager是并行执行),将数据写入WAL,在执行后会返回了handle并进行登记。

总结的来说,WAL比普通的文件操作,增加了时间的维度和索引位置两个因素,两个加起来形成了WAL框架。
欲知后事如何,且听下回分解!
DT大数据每天晚上20:00YY频道现场授课频道68917580
Spark Streaming揭秘 Day32 WAL框架及实现的更多相关文章
- Spark Streaming揭秘 Day9 从Receiver的设计到Spark框架的扩展
Spark Streaming揭秘 Day9 从Receiver的设计到Spark框架的扩展 Receiver是SparkStreaming的输入数据来源,从对Receiver整个生命周期的设计,我们 ...
- Spark Streaming揭秘 Day3-运行基石(JobScheduler)大揭秘
Spark Streaming揭秘 Day3 运行基石(JobScheduler)大揭秘 引子 作为一个非常强大框架,Spark Streaming兼具了流处理和批处理的特点.还记得第一天的谜团么,众 ...
- Spark Streaming揭秘 Day35 Spark core思考
Spark Streaming揭秘 Day35 Spark core思考 Spark上的子框架,都是后来加上去的.都是在Spark core上完成的,所有框架一切的实现最终还是由Spark core来 ...
- Spark Streaming揭秘 Day33 checkpoint的使用
Spark Streaming揭秘 Day33 checkpoint的使用 今天谈下sparkstreaming中,另外一个至关重要的内容Checkpoint. 首先,我们会看下checkpoint的 ...
- Spark Streaming揭秘 Day31 集群模式下SparkStreaming日志分析(续)
Spark Streaming揭秘 Day31 集群模式下SparkStreaming日志分析(续) 今天延续昨天的内容,主要对为什么一个处理会分解成多个Job执行进行解析. 让我们跟踪下Job调用过 ...
- Spark Streaming揭秘 Day30 集群模式下SparkStreaming日志分析
Spark Streaming揭秘 Day30 集群模式下SparkStreaming日志分析 今天通过集群运行模式观察.研究和透彻的刨析SparkStreaming的日志和web监控台. Day28 ...
- Spark Streaming揭秘 Day20 动态Batch size实现初探(上)
Spark Streaming揭秘 Day20 动态Batch size实现初探(上) 今天开始,主要是通过对动态Batch size调整的论文的解析,来进一步了解SparkStreaming的处理机 ...
- Spark Streaming揭秘 Day13 数据安全容错(Driver篇)
Spark Streaming揭秘 Day13 数据安全容错(Driver篇) 书接上回,首先我们要考虑的是在Driver层面,有哪些东西需要维持状态,只有在需要维持状态的情况下才需要容错,总的来说, ...
- Spark Streaming揭秘 Day12 数据安全容错(Executor篇)
Spark Streaming揭秘 Day12 数据安全容错(Executor篇) 今天,让我们研究下SparkStreaming在Executor端的数据安全及容错机制. 在SparkStreami ...
随机推荐
- 深入理解windows
阿猫翻译的,用作备忘 深入理解windows——session.window stations.desktops 翻译自:http://www.brianbondy.com/blog/id/100/ ...
- Android进阶笔记12:Manymo(在线安卓系统模拟器工具)
Manymo: 在线安卓系统模拟器工具是一款启动速度快,且在浏览器中就能运行流畅.你可以使用它来测试你的安卓应用,他最多能支持42种屏幕尺寸和系统版本. 长久以来,Android开发者面临的困境之一就 ...
- JavaScript实现复选框的全选,反选,不选
<script> window.onload=function(){ var CheckAll=document.getElementById('All'); var UnCheck=do ...
- C#当前应用程序路径及环境变量
一.获取当前文件的路径 1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName 获取模块的完整路径.可获得当前执行的 ...
- c编写程序完成m名旅客和n辆汽车的同步程序代写
jurassic公园有一个恐龙博物馆和一个公园,有m名旅客和n辆汽车,每辆汽车仅能允许承载一名旅客.旅客在博物馆参观一阵,然后排队乘坐旅行车.当一辆车可用时,他载入一名旅客,再绕花园行驶任意长的时间. ...
- HTML+CSS实例——漂亮的查询部件(一)
一.参考网址:www.kuhnsjewelers.com 二.效果: 三.HTML <div id="search-box"> <asp:TextBox ID=& ...
- Android 自学之对话框
Android为我们提供了丰富的对话框支持,提供了四种常用的对话框: AlertDialog:功能丰富.实际应用最广泛的对话框. ProgressDialog:进度对话框,该对话框只用于简单的进度条封 ...
- 给jdk写注释系列之jdk1.6容器(5)-LinkedHashMap源码解析
前面分析了HashMap的实现,我们知道其底层数据存储是一个hash表(数组+单向链表).接下来我们看一下另一个LinkedHashMap,它是HashMap的一个子类,他在HashMap的基础上维持 ...
- poj 3678 2-SAT问题
思路:将每个点拆分为两个点 a与a' ,a表示为1,a'表示为0.那么条件给的每个边自然就会存在矛盾,然后根据2-SAT建边就行了. #include<iostream> #include ...
- 解决python 提示 SyntaxError: Missing parentheses in call to 'print'
刚刚学习python,练习他的输出,发现输出一个常量时报错了,如下: 发现是因为python2.X版本与python3.X版本输出方式不同造成的在python3.X的,输入内容时都要带上括号pytho ...