本期概览:

1 Executor WAL

2 消息重放

3 其他

Executor 的数据安全容错非常重要(计算容错主要借助Spark Core的容错机制容错,天然就是容错的),这里的容错是数据的安全容错。

最天然的容错方式是弄一份副本,当前数据有错误的时候用副本数据,另外一种方式是支持数据重放,就是比如说当前10秒内数据错误,那么可以恢复到前10秒的数据。也就是基于WAL的容错的机制。

 

通过指定存储级别为MEMORY_AND_DISK_SER2存储副本

在这里可以指定备份的数量。非常的方便

 

存储block并将存储的信息报告给driver

这里一共有俩种方式来写数据,一种是WriteAheadLogBasedBlockHandler,一种是BlockManagerBasedBlockHandler.这俩种方式保证了数据可以回放。并且在这个过程中,如果没有指定checkpoint的目录的话,会抛出异常。

这里的好多的相关的配置是和WAL相关的,通过WriteAheadLogUtils来进行调配。

接下来,我们再来谈谈内存中做备份的容错方式吧。

StorageLevel是main方法中构造出来的receiver的传入的参数。

存储的级别默认情况下是MEMORY_AND_DISK_SER_2的方式。

进入 BlockManagerBasedBlockHandler的源码类中

具体是通过blockManager的putIterator方法传入blockId,countIterator,storageLevel三个参数进行存储管理的。

再看putIterator方法的具体实现。实质上调用了doPut的方法,并且过程中默认将tellMaster设置为true.


紧接着再看doPut方法。doPut内部调用了requre的方法,如果blockID,level,level的数据出现问题,都将有默认值....is null 或者无效。

doPut方法中,还创建了BlockInfo,用于记录 block的信息。

replicationFuture 对象发送消息,开始备份数据。

// If we're storing bytes, then initiate the replication before storing them locally.

重要的是终于开始备份鸟。

  /**

   * Replicate block to another node. Not that this is a blocking call that returns after

   * the block has been replicated.

   */

此时,blockManager做备份的方式就完了。接下来我们再次分享WAL的方式,在写数据之前,先通过日志记录数据。然后开始写入数据。其实Hbase写入数据的时候也是WAL的方式。

  /**

   * Create a WriteAheadLog for the receiver. If configured with custom WAL class, it will try

   * to create instance of that class, otherwise it will create the default FileBasedWriteAheadLog.

   */

如果没有CustomWAL(sparkConf)的话,默认是FileBasedWriteAheadLog,

用来同时处理futrues的block manager 和WAL,所以开启俩个线程,以便这俩个任务可以同时进行。


这个storeBlock方法在存储block到blcok manager过程中,和WAL过程中都要调用执行。很重要。

子类具体实现WriteAheadLogRecordHandle,这个抽象类代表一个指向record数据记录的句柄,它包含了读取数据record必要的信息,通过一个实现了WriteAheadLog的类返回可以得到。

根据以下的图中的数据,可以准确的读取对应的数据record 

根据时间,清除掉所有过时的数据(比threshold time)更过时的数据。

WriteAheadLog有俩个子类,一个是BatchedWriteAheadLog,一个是FileBasedWriteAheadLog


三:支持数据重放

谈到数据重放,我们可能立刻想到kafka,kafka可以重新进行读取,一旦数据处理崩溃了或者没出理完,kafka也不会进行ack确认,kafka还是认为没有处理数据,数据可以重放。kafka天然就是有容错和副本,本身就可以做为文件系统了。有Receiver的方式和DirectApi的方式。但是,如果数据消费了,但是突然崩溃了。可能造成数据重复消费的问题。


注意:kafka的所在的包是kafka.consumer包。、

不过,话说回来,容错也是要代价的,容错要备份数据,备份数据需要耗较长的时间。有些数据可以在时间和空间以及安全性之间做平衡考量。
thart is all,thank you .

 

posted on 2016-05-22 17:35  lilingui  阅读(159)  评论(0)    收藏  举报