Kafka 和 TextSocket Stream 中的 Spark Streaming 数据分发
Spark Streaming data dissemination in Kafka and TextSocket Stream
我想了解如何从 Spark Streaming 中的文本套接字流或 Kafka 输入读取数据。
是单线程从driver读取数据然后分发给worker吗?单点数据读取不会成为瓶颈吗?
是否所有worker并行读取数据?如果是这样,读取是如何同步的?
1) 不是,数据是直接被executor读取的。考虑到他们覆盖的分区,他们打开自己与适当代理的连接。见下一点。
2) 每个执行器(假设不止一个)都有一个给定主题的分区子集。如果有 2 个分区并且您有 2 个执行程序,则每个执行程序将获得 1 个分区。如果你只有 1 个分区,那么 1 个执行者将获得所有数据,1 个将一无所获。在 Kafka 中,你只能保证消息在分区内按顺序传递,没有神奇的 Spark 也做不到更好。
Is data read from the driver in a single thread and then disseminated to the workers? Wouldn't a single point of data reading become a bottleneck?
不,通常情况并非如此。使用 Kafka,您可以在两种方法之间进行选择:
Receiver based stream - Spark worker 运行 基本上连接到 kafka 的接收器。他们读取数据并使用 WAL 并更新 ZooKeeper 以获得偏移量。这种方法要求您启动多个接收器以从 Kafka 并发读取。这通常是通过创建多个 DStream,然后使用 DStream.union
统一所有数据源来完成的。
基于无接收器的流 - 这是随着 Spark 1.3.0 的发布而推出的新 API。这种方法让驱动程序将偏移量读取到不同的 Kafka 分区中,并向每个工作人员启动具有特定偏移量的作业。这种方法不需要您打开与 kafka 集群的并发连接,它会为您打开每个 Kafka 分区的连接。这使得工作人员可以轻松地使用所需范围查询 Kafka。但是,这种方法不会将偏移量存储到 ZooKeeper。相反,使用火花检查点机制可靠地检查偏移量以实现容错。
Do all workers read the data in parallel? If so how is the read synchronized?
这取决于您选择以上阅读选项中的哪一个。例如,如果您选择基于接收器的方法并且只启动与 Kafka 的单个连接,那么您将有一个工作人员使用所有数据。在无接收器方法中,多个连接已经代表您打开并分发给不同的工作人员。
我建议阅读 DataBricks 的精彩博客 post:Improvements to Kafka integration of Spark Streaming, and the Spark Streaming + Kafka integration 文档。
我想了解如何从 Spark Streaming 中的文本套接字流或 Kafka 输入读取数据。
是单线程从driver读取数据然后分发给worker吗?单点数据读取不会成为瓶颈吗?
是否所有worker并行读取数据?如果是这样,读取是如何同步的?
1) 不是,数据是直接被executor读取的。考虑到他们覆盖的分区,他们打开自己与适当代理的连接。见下一点。
2) 每个执行器(假设不止一个)都有一个给定主题的分区子集。如果有 2 个分区并且您有 2 个执行程序,则每个执行程序将获得 1 个分区。如果你只有 1 个分区,那么 1 个执行者将获得所有数据,1 个将一无所获。在 Kafka 中,你只能保证消息在分区内按顺序传递,没有神奇的 Spark 也做不到更好。
Is data read from the driver in a single thread and then disseminated to the workers? Wouldn't a single point of data reading become a bottleneck?
不,通常情况并非如此。使用 Kafka,您可以在两种方法之间进行选择:
Receiver based stream - Spark worker 运行 基本上连接到 kafka 的接收器。他们读取数据并使用 WAL 并更新 ZooKeeper 以获得偏移量。这种方法要求您启动多个接收器以从 Kafka 并发读取。这通常是通过创建多个 DStream,然后使用
DStream.union
统一所有数据源来完成的。基于无接收器的流 - 这是随着 Spark 1.3.0 的发布而推出的新 API。这种方法让驱动程序将偏移量读取到不同的 Kafka 分区中,并向每个工作人员启动具有特定偏移量的作业。这种方法不需要您打开与 kafka 集群的并发连接,它会为您打开每个 Kafka 分区的连接。这使得工作人员可以轻松地使用所需范围查询 Kafka。但是,这种方法不会将偏移量存储到 ZooKeeper。相反,使用火花检查点机制可靠地检查偏移量以实现容错。
Do all workers read the data in parallel? If so how is the read synchronized?
这取决于您选择以上阅读选项中的哪一个。例如,如果您选择基于接收器的方法并且只启动与 Kafka 的单个连接,那么您将有一个工作人员使用所有数据。在无接收器方法中,多个连接已经代表您打开并分发给不同的工作人员。
我建议阅读 DataBricks 的精彩博客 post:Improvements to Kafka integration of Spark Streaming, and the Spark Streaming + Kafka integration 文档。