spark流数据在kafka和textsocket流中的传播

rdlzhqv9  于 2021-06-07  发布在  Kafka
关注(0)|答案(2)|浏览(284)

我想了解如何从spark流中的文本套接字流或kafka输入读取数据。
数据是在一个线程中从驱动程序读取然后分发给工人的吗?单点数据读取不会成为瓶颈吗?
所有工人都同时读取数据吗?如果是的话,读取是如何同步的?

qnakjoqk

qnakjoqk1#

1) 不,数据由执行者直接读取。考虑到所覆盖的分区,它们会打开自己与相应代理的连接。见下一点。
2) 每个执行器(假设不止一个)都有一个给定主题的分区子集。如果有2个分区并且有2个执行器,那么每个执行器将得到1个分区。如果您只有一个分区,那么一个执行器将获得所有数据,而一个将一无所获。在kafka中,只能保证消息在分区内按顺序传递,而缺少magic spark也不能做得更好。

ylamdve6

ylamdve62#

数据是在一个线程中从驱动程序读取然后分发给工人的吗?单点数据读取不会成为瓶颈吗?
不,一般不是这样做的。有了Kafka,你可以选择两种方法:
基于接收器的流-Spark工人运行接收器,基本上是连接到Kafka。它们读取数据并使用wal更新zookeeper的偏移量。这种方法要求您启动多个接收器,以便同时读取Kafka的内容。这通常是通过创建多个数据流,然后使用 DStream.union 统一所有数据源。
这是spark 1.3.0发布后推出的新api。这种方法让驱动程序将偏移量读入不同的kafka分区,并启动具有特定偏移量的作业。这种方法不需要您打开到kafka集群的并发连接,它将为您打开每个kafka分区的连接。这使得工作人员用所需的范围查询kafka变得简单。但是,这种方法不会将偏移存储到zookeeper。相反,使用sparks检查点机制对偏移进行可靠的检查,以实现容错。
所有工人都同时读取数据吗?如果是的话,读取是如何同步的?
这取决于你选择的阅读选项。例如,如果您选择基于接收器的方法,并且只启动到kafka的单个连接,那么您将有一个worker使用所有数据。在无接收者方法中,多个连接已经代表您打开,并分配给不同的工作人员。
我建议阅读databricks的一篇博文:spark streaming对kafka集成的改进,以及spark streaming+kafka集成文档。

相关问题