我想了解如何从 Spark Streaming 中的文本套接字流或 Kafka 输入读取数据。
数据是否在单个线程中从驱动程序读取,然后传播给工作人员?单点数据读取不会成为瓶颈吗?
是否所有工作人员都并行读取数据?如果是这样,读取是如何同步的?
最佳答案
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 工作人员运行接收器,这些接收器基本上是与 kafka 的连接。他们读取数据并使用 WAL 并更新 ZooKeeper 以获得偏移量。这种方法要求您启动多个接收器以从 Kafka 并发读取。这通常是通过创建多个 DStream,然后使用
DStream.union
统一所有数据源来完成的。基于无接收器的流 - 这是随着 Spark 1.3.0 的发布而推出的新 API。这种方法让驱动程序将偏移量读取到不同的 Kafka 分区中,并向每个工作人员启动具有特定偏移量的作业。这种方法不需要您打开与 kafka 集群的并发连接,它会为您打开每个 Kafka 分区的连接。这使得工作人员可以轻松地使用所需范围查询 Kafka。但是,这种方法不会将偏移量存储到 ZooKeeper。相反,使用 Spark 检查点机制可靠地检查偏移量以实现容错。
Do all workers read the data in parallel? If so how is the read synchronized?
这取决于您选择上述哪种阅读方式。例如,如果您选择基于接收器的方法并且只启动与 Kafka 的单个连接,那么您将有一个工作人员使用所有数据。在无接收器方法中,多个连接已经代表您打开并分发给不同的工作人员。
我建议阅读 DataBricks 的一篇很棒的博客文章:Improvements to Kafka integration of Spark Streaming , 和 Spark Streaming + Kafka integration文档。
关于java - Kafka 和 TextSocket Stream 中的 Spark Streaming 数据分发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35942148/