一、什么是事务:
1.1 情形描述:
task处理到一半,失败了。可是数据 已经在输出存储在数据库了。如果第二次继续重试task,数据是不是就重复输出了?
Spark Streaming 的任务失败,讲会自动进行重试, 数据会被多次写入到存储程序中。
1.2 事务的要求:
1.能够处理且处理一次。
2.能够输出且只输出一次。
Exactly one
举例:A 给B转账,A一定会被扣除,且被扣除一次。B能接受到A转账的数据,且只接受到一次。
问:会不会完全失败呢?
答:可能性不大,一般会被处理。 除非硬件 全 部崩溃。
数据不断流进Executor。Receiver。
Executor 中只有 具体该怎么算 这个事情。
WAL: Write-Ahead Logging[1] 预写日志系统
数据库中一种高效的日志算法,对于非内存数据库而言,磁盘I/O操作是数据库效率的一大瓶颈。在相同的数据量下,采用WAL日志的数据库系统在事务提交时,磁盘写操作只有传统的回滚日志的一半左右,大大提高了数据库磁盘I/O操作的效率,从而提高了数据库的性能。
二、怎么实现事务
一、Exactly Once 的事务处理:
1.数据零丢失:必须有可靠的数据来源和可靠的Receiver,且整个应用程序的metadata必须进行checkpoint,且通过WAL来保证数据安全。
2.Spark Streaming 1.3 的时候 为了避免WAL的性能 损失和实现Exactly Once而提供了Kafka Direct API,把Kafka作为文件存储系统!!!(兼具了流的优势和文件系统的优势。Kafka消耗磁盘和HDFS消耗磁盘是一样的。直接操作它的offset)
至此,Spark Streaming + Kafka 就构建了