Spark Streaming揭秘 Day32

WAL框架及实现

今天会聚焦于SparkStreaming中非常重要的数据安全机制WAL(预写日志)。

设计要点

从本质点说,WAL框架是一个存储系统,可以简单的认为是一个文件系统,其作用类似于BlockManager,
我们首先看一下官方的说明:

这里有三个要点:

  1. 总体上,sparksteaming是用WAL去保存接收到的数据,并且在写入数据后,要把元数据汇报给Driver,这样失败了才能恢复起来。
  2. 每当写入一个log,就返回一个handle,handle包含所有的从写入后的记录中恢复回原来数据的所有信息,和blockManager是一样的,使用时间来索引record,所以在sparkstreaming,WAL是顺序读写的。这个时间也方便我们进行清理(会有一个自己的超时时间)。具体的子类,必须确保数据是可持久化和可读取的。
  3. 为什么选择顺序写,是因为在数据备份的时候,效率会比较高。当读的时候,采用一块一块的读,而不是一条一条的读,找数据的时候,需要找到起始点,并结合数据长度来批量读取,而不是读一条,找一条。可以极大的节省读取的时间。

总体结构

WriteAheadLog作为一个抽象类,主要提供一些操作的方法,并没有说明如何对数据本身如何进行操作。因为具体的操作往往会涉及底层的存储系统。这种写法,可以使客户端依赖于抽象,而不是依赖于具体,既方便使用者,也方便开发者。最为关键的是下面三个方法:

  1. write方法,输入一个ByteBuffer,ByteBuffer只是个很简单的java类,里面封装了一个字节数组。
  2. read方法,基于handle,读取我们要读取的记录。
  3. clean方法,threshTime是一个阀值,在之前的数据会被清理掉。

那handle里是啥呢,其实非常简单,WriteAheadLogRecordHandle也是抽象的。具体实现在FileBasedWriteAheadLogSegment:

这是个case class,只是保存了三个信息,数据文件路径、位置以及数据长度。

WriteAheadLog实现

FileBasedWriteAheadLog是WriteAheadLog一般情况下的实现。

让我们看下说明,在管理WAL文件时,会把数据周期性的写入日志文件中。当失败时,会从文件中恢复数据。
这里的关键是rolling的管理方式,这是写数据的一种特征,写log的时候,每隔一段时间,就把已经在写的文件关闭掉,再产生新的文件保存新的数据。这种方式的好处是:

  1. 写的文件,单个文件不会太大。
  2. 删除数据比较方便。

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框架及实现的更多相关文章

  1. Spark Streaming揭秘 Day9 从Receiver的设计到Spark框架的扩展

    Spark Streaming揭秘 Day9 从Receiver的设计到Spark框架的扩展 Receiver是SparkStreaming的输入数据来源,从对Receiver整个生命周期的设计,我们 ...

  2. Spark Streaming揭秘 Day3-运行基石(JobScheduler)大揭秘

    Spark Streaming揭秘 Day3 运行基石(JobScheduler)大揭秘 引子 作为一个非常强大框架,Spark Streaming兼具了流处理和批处理的特点.还记得第一天的谜团么,众 ...

  3. Spark Streaming揭秘 Day35 Spark core思考

    Spark Streaming揭秘 Day35 Spark core思考 Spark上的子框架,都是后来加上去的.都是在Spark core上完成的,所有框架一切的实现最终还是由Spark core来 ...

  4. Spark Streaming揭秘 Day33 checkpoint的使用

    Spark Streaming揭秘 Day33 checkpoint的使用 今天谈下sparkstreaming中,另外一个至关重要的内容Checkpoint. 首先,我们会看下checkpoint的 ...

  5. Spark Streaming揭秘 Day31 集群模式下SparkStreaming日志分析(续)

    Spark Streaming揭秘 Day31 集群模式下SparkStreaming日志分析(续) 今天延续昨天的内容,主要对为什么一个处理会分解成多个Job执行进行解析. 让我们跟踪下Job调用过 ...

  6. Spark Streaming揭秘 Day30 集群模式下SparkStreaming日志分析

    Spark Streaming揭秘 Day30 集群模式下SparkStreaming日志分析 今天通过集群运行模式观察.研究和透彻的刨析SparkStreaming的日志和web监控台. Day28 ...

  7. Spark Streaming揭秘 Day20 动态Batch size实现初探(上)

    Spark Streaming揭秘 Day20 动态Batch size实现初探(上) 今天开始,主要是通过对动态Batch size调整的论文的解析,来进一步了解SparkStreaming的处理机 ...

  8. Spark Streaming揭秘 Day13 数据安全容错(Driver篇)

    Spark Streaming揭秘 Day13 数据安全容错(Driver篇) 书接上回,首先我们要考虑的是在Driver层面,有哪些东西需要维持状态,只有在需要维持状态的情况下才需要容错,总的来说, ...

  9. Spark Streaming揭秘 Day12 数据安全容错(Executor篇)

    Spark Streaming揭秘 Day12 数据安全容错(Executor篇) 今天,让我们研究下SparkStreaming在Executor端的数据安全及容错机制. 在SparkStreami ...

随机推荐

  1. Debian下MySQL配置

    1 安装 $ apt-get install mysql-server $ apt-get install mysql-client 2 修改MySQL的口令 一般上一步会让你输入root密码,如果没 ...

  2. 实验教学管理系统 c语言程序代写源码下载

    问题描述:实验室基本业务活动包括:实验室.班级信息录入.查询与删除:实验室预定等.试设计一个实验教学管理系统,将上述业务活动借助计算机系统完成. 基本要求: 1.必须存储的信息 (1)实验室信息:编号 ...

  3. c#导出Excel 使用EXCEL进程

    private void exportExcel(string filename, string path,string title, List<ArchivedWcsTask> wcst ...

  4. 使用CSS实现一个简单的幻灯片效果

    方法一: 简单的CSS代码实现幻灯片效果 方法二: 使用CSS3 Animation来制作幻灯片 方法一: 简单的CSS代码实现幻灯片效果 话不多说,直接上代码 <!DOCTYPE html&g ...

  5. 从零单排Linux – 3 – 目录结构

    从零单排Linux – 3 – 目录结构 1.FHS标准(filesystem hierarchy standard) why? –> 为了规范,还有为了linux的发展 重点 –> 规范 ...

  6. Nginx - Events Module

    The Events module comes with directives that allow you to configure network mechanisms. Some of the ...

  7. 备忘====[HttpPost]和[AcceptVerbs(HttpVerbs.Post)]区别

    1.共同点:[HttpPost]和[AcceptVerbs(HttpVerbs.Post)]都是只接受POST请求过来的数据. 2.不同点:在MVC中如果想一个action既可以回应POST请求也可以 ...

  8. Cocos2d-x开发实例介绍特效演示

    下面我们通过一个实例介绍几个特效的使用,这个实例下图所示,下图是一个操作菜单场景,选择菜单可以进入到下图动作场景,在下图动作场景中点击Go按钮可以执行我们选择的特性动作,点击Back按钮可以返回到菜单 ...

  9. iOS中的动画

    iOS中的动画 Core Animation Core Animation是一组非常强大的动画处理API,使用它能做出非常绚丽的动画效果,而且往往是事半功倍,使用它需要添加QuartzCore .fr ...

  10. js 获取 当前时间 时间差 时间戳 倒计时

    开发web一段时间后发现经常使用时间进行一些操作,比较多的就是获取当前时间.对时间进行比较.时间倒计时.时间戳这些部分,每次去用经常忘总是需要去查询,还是自己总结一下比较靠谱. 获取时间戳的方法: 第 ...