Apache spark 火花流:火花和卡夫卡的沟通是如何发生的?

Apache spark 火花流:火花和卡夫卡的沟通是如何发生的?,apache-spark,apache-kafka,spark-streaming,Apache Spark,Apache Kafka,Spark Streaming,我想了解卡夫卡和Spark(流媒体)节点之间的通信是如何发生的。我有以下问题 如果Kafka服务器和Spark节点位于两个单独的集群中,那么通信将如何进行。配置它们需要哪些步骤 如果两者都在相同的集群中,但在不同的节点中,通信将如何进行 我的意思是这里的通信是RPC通信还是套接字通信。我想了解一下内部解剖 谢谢你的帮助 提前感谢。首先,Kafka节点和Spark节点是否在同一集群中并不重要,但它们应该能够相互连接(在防火墙中打开端口) 使用Spark Streaming有两种读取Kafka的方法

我想了解卡夫卡和Spark(流媒体)节点之间的通信是如何发生的。我有以下问题

  • 如果Kafka服务器和Spark节点位于两个单独的集群中,那么通信将如何进行。配置它们需要哪些步骤
  • 如果两者都在相同的集群中,但在不同的节点中,通信将如何进行
  • 我的意思是这里的通信是RPC通信还是套接字通信。我想了解一下内部解剖

    谢谢你的帮助


    提前感谢。

    首先,Kafka节点和Spark节点是否在同一集群中并不重要,但它们应该能够相互连接(在防火墙中打开端口)

    使用Spark Streaming有两种读取Kafka的方法,使用较旧的
    KafkaUtils.createStream()
    API和较新的
    KafkaUtils.createDirectStream()
    方法

    我不想讨论它们之间的差异,这是有很好的文档记录的(简而言之,直接流更好)

    解决您的问题,沟通是如何发生的(内部解剖):最好的方法是查看Spark源代码

    createStream()
    API直接从官方的
    org.apache.Kafka
    包使用一组Kafka消费者。这些卡夫卡消费者有自己的客户机,名为
    NetworkClient
    ,您可以查看。简而言之,
    NetworkClient
    使用套接字进行通信

    createDirectStream()
    API确实使用了同一
    org.apache.Kafka
    包中的Kafka
    SimpleConsumer
    SimpleConsumer
    类使用
    java.nio.ReadableByteChannel
    读取Kafka,后者是
    java.nio.SocketChannel
    的一个子类,因此最终也可以使用套接字完成,但更间接地使用java的非阻塞I/O便利API


    因此,为了回答您的问题:这是通过套接字完成的。

    是否可以在Spark流中使用节点之间的同步通信,例如Http请求/响应?