繁体   English   中英

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

[英]Spark Streaming data dissemination in Kafka and TextSocket Stream

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

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

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

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

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

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

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

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

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

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

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

我建议阅读DataBricks的一篇很棒的博客文章: 改进Kafka集成的Spark Streaming ,以及Spark Streaming + Kafka集成文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM