Kafka和TextSocket Stream中的Spark Streaming数据传播

时间:2016-03-11 13:58:56

标签: java apache-kafka spark-streaming

我想了解如何从文本套接字流或Spark Streaming中的Kafka输入读取数据。

  1. 是否在单个线程中从驱动程序读取数据然后传播给工作人员?单点数据读取不会成为瓶颈吗?

  2. 所有工作人员是否并行读取数据?如果是这样,读取如何同步?

2 个答案:

答案 0 :(得分:1)

1)否,数据由执行者直接读取。考虑到他们所覆盖的分区,他们打开自己与相应经纪人的联系。见下一点。

2)每个执行者(假设不止一个)具有给定主题的分区子集。如果有2个分区,并且您有2个执行程序,则每个执行程序将获得1个分区。如果你只有1个分区,那么1个执行器将获得所有数据,1个什么都得不到。在Kafka中,您只能保证消息将在分区内按顺序传递,并且缺少魔法Spark可以做得更好。

答案 1 :(得分:1)

  

是否在单个线程中从驱动程序读取数据然后传播给工作人员?单点数据读取不会成为瓶颈吗?

不,通常不是这样做的。使用Kafka,您可以选择两种方法:

  1. 基于Receiver的流 - Spark工作者运行的接收器基本上是与kafka的连接。他们读取数据并使用WAL并更新ZooKeeper以获得偏移量。这种方法要求您启动多个接收器以便从Kafka进行并发读取。这通常通过创建多个DStream然后使用DStream.union来统一所有数据源来完成。

  2. 基于Receiverless的流 - 这是随Spark 1.3.0发布的新API。此方法使驱动程序将偏移量读入不同的Kafka分区,并向每个工作人员启动具有特定偏移量的作业。这种方法并不要求您打开与kafka集群的并发连接,它会为您打开每个Kafka分区的连接。这使得工作人员可以轻松地查询具有所需范围的Kafka。但是,此方法不会存储ZooKeeper的偏移量。相反,使用火花检查指向机制可靠地检查偏移以实现容错。

  3.   

    所有员工是否并行读取数据?如果是这样,读取如何同步?

    这取决于您选择的上述哪个选项。例如,如果您选择基于接收器的方法并且仅启动与Kafka的单个连接,那么您将拥有一名消耗所有数据的工作人员。在无接收方法中,多个连接已经代表您开放并分发给不同的工作人员。

    我建议您阅读DataBricks撰写的精彩博文:Improvements to Kafka integration of Spark StreamingSpark Streaming + Kafka integration文档。