第一种:receiver方式。
1、receiver不停地从kafka拉取数据,n秒钟(程序设置的)拉取产生一批数据
2、这种方式偏移量zookeeper帮我们管理,灵活性差
这种方式有缺点:
receiver从Kafka中获取的数据都存储在Spark Executor的内存中,某个时间段内拉去的数据可能会大于某台机器executor分配的内存数量,部分数据会溢出丢失。
针对这一问题,1.2版本之后提供记log方式(Streaming的预写日志机制)(Write Ahead Log,WAL)。该机制会将从kafka中读取的数据先保存到hdfs或者S3上,然后再去消费数据,WAL是为了防止数据的丢失,可以对数据进行恢复。所以,即使底层节点出现了失败,也可以使用预写日志中的数据进行恢复。
使用时的注意事项:
1)Kafka中topic的partition与Spark中RDD的partition是没有关系的,因此,在KafkaUtils.createStream()中,提高partition的数量,只会增加Receiver的数量,也就是读取Kafka中topic partition的线程数量,不会增加Spark处理数据的并行度。
2)可以创建多个Kafka输入DStream,使用不同的consumer group和topic,来通过多个receiver并行接收数据。
3