前面说过SparkStreaming可以接受的一种高级数据源——Flume,今天来介绍另外一种高级数据源——Kafka。。。
Kafka是一种基于消息发布订阅的消息队列,并且是分布式的,分区有副本的日志服务但是在0.8-0.10出现了一些更新上的改变,具体情况如下:
本人使用的是0.8 or higher版本作为讲解。。。
案例一、基于基于Receiver-based Approach
- 首先导入相关依赖
<!--Spark Streaming整合Kafka依赖-->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming-kafka-0-8_2.11</artifactId>
<version>2.1.1</version>
</dependency>
- 获取到SparkStreaming的配置和Kafka相关的配置(Kafka需要的相关参数),开始先做出判断参数个数是否满足,满足再继续下去
- 根据线程数,将输入的数据转换为map形式,才能继续后面的计算
- SparkStreaming和Kafka的连接
- WordCount的统计
- 配置一下kafka需要的参数,然后启动kafka
案例二、Direct Approach
这是无接收器的方法,为了保证端到端的信息安全到达,要定期向kafka查询每个topic和partition中的偏移量,并且处理这些数据的时候消费者API会读取之前定义好的一定范围的数据。。
和第一种相比,优点有:
- 简化并行性:不用创建多个kafka的DataSource,可以联合起来,因为使用了directStream,可以让SparkStreaming创建和kafka分区个数一样的RDD,然后互相进行一对一的映射。
- 效率:第一种方法保证数据不丢失的方法时数据存入日志,第二种方法杜绝了这个问题因为没有接收器,因此要有足够的kafka就可以保证数据安全。
- 完整性:第一种方法使用kafka API在Zookeeper中存储消耗的偏移量,第二种方法时利用checkpoint跟踪偏移量
- 导入的maven依赖和第一种方法导入的一样
- 获取到SparkStreaming的配置和Kafka相关的配置(Kafka需要的相关参数)
- 和之前不同的是,这次要创建的是DirectStream,先进入它的API看需要的参数,需要的分别是String,String,StringDecoder和StringDecoder这四个泛型
- 传入参数,需要的是ssc,kafkaParams和topic
- 创建topicSet
- 业务逻辑的处理