我想了解如何从文本套接字流或Spark Streaming中的Kafka输入读取数据。
是否在单个线程中从驱动程序读取数据然后传播给工作人员?单点数据读取不会成为瓶颈吗?
所有工作人员是否并行读取数据?如果是这样,读取如何同步?
答案 0 :(得分:1)
1)否,数据由执行者直接读取。考虑到他们所覆盖的分区,他们打开自己与相应经纪人的联系。见下一点。
2)每个执行者(假设不止一个)具有给定主题的分区子集。如果有2个分区,并且您有2个执行程序,则每个执行程序将获得1个分区。如果你只有1个分区,那么1个执行器将获得所有数据,1个什么都得不到。在Kafka中,您只能保证消息将在分区内按顺序传递,并且缺少魔法Spark可以做得更好。
答案 1 :(得分:1)
是否在单个线程中从驱动程序读取数据然后传播给工作人员?单点数据读取不会成为瓶颈吗?
不,通常不是这样做的。使用Kafka,您可以选择两种方法:
基于Receiver的流 - Spark工作者运行的接收器基本上是与kafka的连接。他们读取数据并使用WAL并更新ZooKeeper以获得偏移量。这种方法要求您启动多个接收器以便从Kafka进行并发读取。这通常通过创建多个DStream然后使用DStream.union
来统一所有数据源来完成。
基于Receiverless的流 - 这是随Spark 1.3.0发布的新API。此方法使驱动程序将偏移量读入不同的Kafka分区,并向每个工作人员启动具有特定偏移量的作业。这种方法并不要求您打开与kafka集群的并发连接,它会为您打开每个Kafka分区的连接。这使得工作人员可以轻松地查询具有所需范围的Kafka。但是,此方法不会存储ZooKeeper的偏移量。相反,使用火花检查指向机制可靠地检查偏移以实现容错。
所有员工是否并行读取数据?如果是这样,读取如何同步?
这取决于您选择的上述哪个选项。例如,如果您选择基于接收器的方法并且仅启动与Kafka的单个连接,那么您将拥有一名消耗所有数据的工作人员。在无接收方法中,多个连接已经代表您开放并分发给不同的工作人员。
我建议您阅读DataBricks撰写的精彩博文:Improvements to Kafka integration of Spark Streaming和Spark Streaming + Kafka integration文档。