开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop框架搭建):Streaming消费kafka数据的两种方式】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/670/detail/11626
Streaming 消费 kafka 数据的两种方式
内容介绍:
一、kafkautils.createstream 特点
二、kafkautils.createdirectstream 特点
三、二者区别
一、kafkautils.createstream特点
在读取数据的过程中,用到的技术是sparkstreaming。
第一种方式是kafkautils.createstream,
第二种是kafkautils.createdirectstream.
kafkautils.createstream特点:
构造函数为 KafkaUtils.createStream(ssc,[zk],[consumer group id],[per-topic,partitions])使用了 receivers 来接收数据,利用的是Kafka高层次的消费者api,对于所有的receivers接收到的数据将会保存在 spark executors 中,然后通过 Spark Streaming 启动 job 来处理这些数据,默认会丢失,可启用 WAL 日志,该日志存储在 HDFS 上
#创建一个receiver 来对kafka 进行定时拉取数据,ssc 的 rdd 分区和 kafka 的 topic 分区不是一个概念,故如果增加特定主体分区数仅仅是增加一个 receiver 中消费 topic 的线程数,并不增加 spark 的并行处理数据数量。
#对于不同的group 和 topic 可以使用多个 receivers 创建不同的 DStream
#如果启用了 WAL,需要设置存储级别,即
KafkaUtils.createStream(….,StorageLevel.MEMORY_AND_DISK_SER)
二、kafkautils.createdirectstream 的特点
区别 Receiver接收数据,这种方式定期地从 kafka的 topic+partition中查询最新的偏移量,再根据偏移量范围在每个batch里面处理数据,
使用的是kafka的简单消费者api优点:
#简化并行,不需要多个kafka输入流,该方法将会创建和kafka分区一样的rdd个数,而且会从kafka并行读取。
#高效,这种方式并不需要WAL,WAL模式需要对数据复制两次,第一次是被kafka复制,另一次是写到wal中
#恰好一次语义(Exactly-once-semantics),传统的读取 kafka数据是通过 kafka 高层次 api把偏移量写入zookeeper中,存在数据丢失的可能性是zookeeper中和ssc的偏移量不一致。EOS 通过实现kafka低层次api,偏移量仅仅被ssc保存在checkpoint中,消除了 zk和ssc偏移量不一致的问题。
三、二者区别
1、KafkaUtils.createDirectStream
调用的是低层次(最原始的)的API
kafka的offset是由程序员自己或者DirectStream维护的
只写数据,写一次数据
创建的rdd数量与kafka topic的partition数量相同(有关系)
2、KafkaUtils.createStream
调用的是高层(经过二次封装)次的API
kafka的offset是由zookeeper维护的
需要写WAL 日志,再写数据,实际上是写了两次数据
创建的rdd数量与kafka topic的partition没有关系