java - Kafka 和 TextSocket Stream 中的 Spark Streaming 数据分发

标签 java apache-kafka spark-streaming

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

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

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

最佳答案

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,您可以在两种方法之间进行选择:

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

  2. 基于无接收器的流 - 这是随着 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/

相关文章:

java - 即使设置为通知也不会播放声音或显示灯光

java - 提交 Spark 作业时出现 java.lang.NoSuchMethodError

java - 无法使用 XStream Java lib 将属性绑定(bind)到对象

Java SSH Ganymed - 尝试使用用户名和密码连接时出现随机错误

jdbc - Kafka JDBC Connect(源和接收器)和 Informix

apache-kafka - 日志压缩以确保每个键只保留一条消息

scala - 处理不同的状态

scala - 如何在 HDP(Hortonworks 数据平台)中安装 Scala 库

java - 如何使用 Volley 获取并等待来自多个 url 的数据

java - 某些记录的 Azure eventhub Kafka org.apache.kafka.common.errors.TimeoutException