在Spark Streaming的生产实践中,要做到数据零丢失,需要满足以下几个先决条件:
1.输入的数据源是可靠的/数据接收器是可靠的
2.应用程序的metadata被application的driver持久化了(checkpointed )
3.启用了WAL特性(Write ahead log)
下面分别对这3个条件进行介绍:
- 对于一些输入数据源(比如Kafka),Spark Streaming可以对已经接收的数据进行确认。输入的数据首先被接收器(receivers )所接收,然后存储到Spark中(默认情况下,数据保存到2个执行器中以便进行容错)。数据一旦存储到Spark中,接收器可以对它进行确认(比如,如果消费Kafka里面的数据时可以更新Zookeeper里面的偏移量)。这种机制保证了在接收器突然挂掉的情况下也不会丢失数据:因为数据虽然被接收,但是没有被持久化的情况下是不会发送确认消息的。所以在接收器恢复的时候,数据可以被原端重新发送。