Spark Streaming揭秘 Day12
数据安全容错(Executor篇)
今天,让我们研究下SparkStreaming在Executor端的数据安全及容错机制。
在SparkStreaming中一共使用了两种容错方式:
- 存储数据副本
- 支持数据重放
副本机制
这是默认的处理方式,先让我们进入数据存储代码:
我们发现,SparkStreaming中存储是直接调用了blockManager中进行,blockManager本身就支持数据副本,是通过stoageLevel字段的定义。
一直往代码源头寻找,我们发现了storageLevel的定义:MEMORY_AND_DISK_SER_2,也就是说,其两副本的处理方式。
进入BlockManager,下面就是数据执行副本的代码,可以看到,为了提高效率,采用了线程池实现。
预写日志WAL
SparkStreaming中WAL机制和HBase比较接近,主要在如下代码中实现:
从代码中,我们可以看出几个特点:
- 必须要定义checkpoint目录(一般是放在hdfs上)
- 和副本方式相比,需要传递stream_id,也就是说WAL是按照receiver来管理的
让我们进入ReceivedBlockHandler中的实际处理部分:
我们发现在WAL模式中,其实数据是通过通过BlockManager和WAL中存放,也就WAL就是直接替代了原有BlockManager中的副本。
下面这段判断也能说明这点,一旦开启WAL后,其实会禁止副本数设置。
从WAL的运行看,我们发现,也是采用了线程池的方式,多线程处理在SparkStreaming中真是无处不在啊。
最后,对于WAL方式来说,因为写数据是顺序写,不会修改数据,用指针遍历即可,速度还是比较快的;但是WAL主要还是定位于高安全性,还是会对性能有一定影响,适合允许一定延时的场景。对支持数据重放这个方案来说,最佳的方案是引入Kafka,这样天然就有容错和副本!!!
欲知后事如何,且听下回分解
DT大数据每天晚上20:00YY频道现场授课频道68917580