跳到主要内容

简述Saprk Streaming从Kafka中读取数据两种方式 ?

参考答案:

Spark Streaming从Kafka中读取数据主要有两种方式,分别是基于Receiver的方式和Direct方式。

基于Receiver的方式是Spark官方最初提供的Kafka数据消费模式。它使用Kafka的高层次Consumer API来实现。Receiver从Kafka中获取的数据都存储在Spark Executor的内存中,然后Spark Streaming启动的job会去处理这些数据。这种方式通过Zookeeper来连接Kafka队列,并且offset也存储在Zookeeper中,由Receiver维护。然而,这种方式存在程序失败时可能丢失数据的风险。为了解决此问题,Spark 1.2引入了一个配置参数来启用Write-Ahead Log,从而避免数据丢失。

另一种方式是Direct方式,它在Spark 1.3中引入,用于替代基于Receiver的方式。Direct方式会周期性地查询Kafka,获取每个topic+partition的最新offset,从而定义每个batch的offset范围。当处理数据的job启动时,它会使用Kafka的简单consumer API来获取Kafka指定offset范围的数据。这种方式更为直接且高效,因为它直接连接到Kafka的节点上获取数据,而不需要通过Zookeeper。

总的来说,基于Receiver的方式和Direct方式各有其特点和适用场景。在选择时,需要根据具体的需求和场景来权衡。例如,如果对数据的一致性和可靠性有较高要求,或者需要处理大量数据并希望减少数据丢失的风险,那么可能会更倾向于选择Direct方式。