Spark Streaming + Kafka整合指南

前言

      翻译之官网http://spark.apache.org/docs/latest/streaming-kafka-integration.html,spark版本为1.6.1,由于某些部分比较绕口,所以这里并没有完全遵照官网进行翻译。

正文

      Apache Kafka是一个实现发布-订阅方式的消息系统,它可以用来实现分布式、可分区、可复制的日志服务。这里我们解释怎么配置Spark Streaming,使它能够从Kafka接收数据。目前总共有两种方式,旧的方式是使用Receivers和Kafka提供的API,而新的方式并不使用Receivers(从Spark 1.3引入)。这两种方式有不同的编程模型、性能特征以及语义保障,下面会详细的来探讨。

方式一:基于Receiver的方法

    这种方式使用Receiver来接收数据。Receiver是基于Kafka consumer API的实现。对于所有的receiver来说,通过Receiver从Kafka接收的数据存储在Spark的执行器中,然后由Spark Streaming启动的作业来处理这些数据。
      然而,在默认配置下,这种方式可能会丢失数据(参看receiver reliability。为了保证0数据丢失,你必须额外启用Spark Streaming的Write Ahead Logs(从Spark 1.2引入)。这会把接收的Kafka数据异步写入位于分布式系统上的write ahead log(例如HDFS),所以,所有的失败数据都可以恢复。参看流式编程指南中的Deploying section获取更多关于Write Ahead Logs的信息)。

Write Ahead Log一般称为WAL机制,在HBase中也有类似机制防止数据读入失败导致数据不一致

接下来,我们来讨论如何在你的streaming应用中使用这种方式。
1. Linking: 对于使用SBT/Maven构建的Scala/Java应用,在应用中添加如下的artifact.

groupId = org.apache.spark
artifactId = spark-streaming-kafka_2.10
version = 1.6.1 

对于Python应用,你必须添加上述库以及它所依赖的库。参看下面的部署部分。
2. 编程: 在streaming应用代码中,使用如下方式引入KafkaUtils并且创建DStream

Scala

 import org.apache.spark.streaming.kafka._

 val kafkaStream = KafkaUtils.createStream(streamingContext,   [ZK quorum], [consumer group id], [per-topic number of Kafka partitions to consume])

      你也可以使用提供了Key、Value以及Decoder参数的createStream方法。参看API docs以及例子
需要注意的点

  • Kafka的Topic分区与Spark Streaming中产生的RDD分区并没有什么关联。所以在kafkaUtils.createStream()中增加topic的分区数只会增加单个receiver消费topic的线程数。它并不会增加Spark处理数据时的并行数量。
  • 对于不同的group和topic,可以使用多个receiver创建Kafka输入DStream来并行接收数据。
  • 如果你已经在一个可复制的文件系统上(例如HDFS上)启用了WAL机制,

猜你喜欢

转载自blog.csdn.net/solo_sky/article/details/51064356