1.什么是事务?
例如像银行转账,A对B转账,B是否能收到多次转账,可能性不大;或者A转给B的时候,A同样费用被扣了多次,B只收到一次,这样也不可能。也就是说我们要做的事务级别的处理,简而言之这数据一定会被处理,且只被处理一次,能够输出且只能输出一次。
2.Spark Streaming整个运行角度的基本的情况
spark streaming写程序基于Driver和Executor两部分,Driver的核心是StreamingContext,Receiver接收到的数据汇报给Driver(把元数据给Driver,而且Driver生产的RDD只对元数据感兴趣),Driver为了数据安全进行checkpoint(从数据角度讲Block MeteData、DStreamGraph、Job),接下来在Executor上执行,当然也可能在多个Executor上执行。
3.接收数据的角度讲
数据不断流进Executor(InputStream的产生是在Driver上的,属于框架调度层面的,Executor中只有数据和RDD,实际上讲也没有所谓的RDD,只有怎么算这件事,InputStream:只是从逻辑层面上讲)。数据流进了receiver,不断接受这个数据,为了保证这个数据安全性,默认情况下把数据不断通过容错方式进行处理,容错方式进行处理:写进磁盘,内存同时有副本的形式,或者说wal。
WAL机制:写数据的时候,先通过WAL写入文件系统中,然后在存储到Executor,Executor存储到内存或磁盘中,这是storagelevel规定。假设前面没写成功,后面一定不会存储到Executor中,不存储到Executor中就不能汇报给Driver,这个数据不会被处理。
我们是否能一定确保数据的安全性呢?假如我有1G数据,在这次流的批次处理中需要处理,那我是否一定能处理这1G数据,其实不一定,wal确实能把要写入磁盘的数据,就是进行wal的数据,能够保证它的安全,我们现在不考虑wal失败的可能,wal失败的可能不大,因为他一般写.hdfs之类的。其实Executor接受数据是一条一条接收的(从流的角度讲)或者说从一个对象一个对象接收的,他会把数据在内存中,Receiver把数据积累到一定程度时候,才写到wal或者写到磁盘。还没有积累到一定程度,Receiver(Executor)失败了怎么办,这时还是会有部分数据丢失一点(是的)。谈不到备份,因为还没有准备好数据块,就是几条数据
4.处理数据角度:
处理数据之前先checkpoint,checkpoint放到文件系统中,处理之后也会进行checkpoint,在保存一下自己状态。spark streaming内部工作起来,绝对的核心是SparkContext;spark streaming就2点:就是StreamingContext,第一获取数据,第二产生作业StreamingContext没有解决执行问题,解决执行问还需要SparkContext;
假设出现崩溃的时候,需要数据恢复,从Driver的角度进行恢复,Driver先checkpoint文件系统读取进来,而在内部重新启动SparkContext。Driver里面恢复过数据,重新构建StreamingContext,其实也是构建SparkContext,恢复产生的元数据,再次产生RDD(恢复时候是基于上一次job或相对应的job)再次提交到spark集群,在提交集群时候再次执行,另外一方面包含了Receiver恢复,Receiver从新恢复在以前数据的基础上接收数据,曾经接受的数据它会通过wal之类的机制从磁盘重新恢复回来。
5.ExactlyOnce的事务处理:
1.数据零丢失:必须有可靠的数据来源和可靠的Receiver,且整个应用程序的metadata必须进行checkpoint,且通过wal来保证数据安全;
2.Spark Streaming 1.3的时候为了避免WAL的性能损失和实现Exactly -once而提供了Kafka Direct API,把Kafka作为文件存储系统!!!此时兼具有流的优势和文件系统优势,至此,Spark Steaming + Kafka就构建了完美的流处理世界!!!所有的Executor通过KafkaAPI直接消费数据,直接管理offset,所以也不会重复消费数据;(此时可以保证数据一定会被处理且一定会被处理一次)事务实现啦!!!
备注:
资料来源于:DT_大数据梦工厂(Spark发行版本定制)
更多私密内容,请关注微信公众号:DT_Spark
如果您对大数据Spark感兴趣,可以免费听由王家林老师每天晚上20:00开设的Spark永久免费公开课,地址YY房间号:68917580