Apache spark 火花流分割

Apache spark 火花流分割,apache-spark,apache-kafka,spark-streaming,Apache Spark,Apache Kafka,Spark Streaming,我们正在使用Kafka和Spark流媒体处理贸易数据。 我们从卡夫卡接收avro格式[键,字节[]]的数据。我们对数据进行反序列化,并将其进一步发送以进行处理。我们正在spark流媒体应用程序中使用数据流。 我们需要根据接收到的avro记录中的密钥对数据进行分区。因此,每当我们以流的形式从卡夫卡接收数据时,它都应该将记录发送给指定的执行者 我们可能从卡夫卡那里收到10种不同类型的钥匙。 因此,所有带有key1的记录都应该转到Node1,key2应该转到Node2,以此类推 作为接收到的流数据,我

我们正在使用Kafka和Spark流媒体处理贸易数据。 我们从卡夫卡接收avro格式[键,字节[]]的数据。我们对数据进行反序列化,并将其进一步发送以进行处理。我们正在spark流媒体应用程序中使用数据流。 我们需要根据接收到的avro记录中的密钥对数据进行分区。因此,每当我们以流的形式从卡夫卡接收数据时,它都应该将记录发送给指定的执行者

我们可能从卡夫卡那里收到10种不同类型的钥匙。 因此,所有带有key1的记录都应该转到Node1,key2应该转到Node2,以此类推

作为接收到的流数据,我们映射到RDD而不是PAIRDD


请告知我们是否可以根据从kafka收到的记录的密钥配置分区。

如果我有此要求,我会首先记住一些概念-

  • Kafka根据其密钥分发MSG,即具有相同密钥的所有MSG进入相同的主题分区
  • Spark Kafka connector为每个组id的每个分区提供一个使用者
  • 无法为特定节点编写Spark逻辑,因为事先没有特定的分配
  • 这基本上意味着您的数据已经按照您的需要(键)进行了拆分,并且已经发送到特定的节点,只是您对该节点分配没有太多控制权

    这是我应该做的

    由于Kafka是键控制的,所以首先创建一个Kafka数据流RDD,它将spark节点与Kafka分区连接起来。现在,您需要做的是确定此消费者连接到哪个密钥

    将spark作业的逻辑写入基于节点接收到的密钥的细分逻辑,很容易找到第一条记录。然后,控制应该被发送到处理特定密钥逻辑的子逻辑。你只需要第一次做这个检查,或者在这个检查中花费几纳秒


    如果你还想获得更多的控制权,可以考虑使用简单的微服务,而不是Spark streaming。

    如果我有这个要求,我会首先记住一些概念-

  • Kafka根据其密钥分发MSG,即具有相同密钥的所有MSG进入相同的主题分区
  • Spark Kafka connector为每个组id的每个分区提供一个使用者
  • 无法为特定节点编写Spark逻辑,因为事先没有特定的分配
  • 这基本上意味着您的数据已经按照您的需要(键)进行了拆分,并且已经发送到特定的节点,只是您对该节点分配没有太多控制权

    这是我应该做的

    由于Kafka是键控制的,所以首先创建一个Kafka数据流RDD,它将spark节点与Kafka分区连接起来。现在,您需要做的是确定此消费者连接到哪个密钥

    将spark作业的逻辑写入基于节点接收到的密钥的细分逻辑,很容易找到第一条记录。然后,控制应该被发送到处理特定密钥逻辑的子逻辑。你只需要第一次做这个检查,或者在这个检查中花费几纳秒


    如果你还想获得更多的控制权,可以考虑使用简单的微服务,而不是Spark streaming。

    阿披舍克所说的是正确的。在发送数据时,你需要使用基于密钥的分区器,并拥有足够数量的分区,以便属于每个密钥的数据最终都位于一个分区中。 在spark stream中使用direct stream方法,因为这将产生为kafka主题中的分区提供服务器所需数量的使用者。
    spark中的每个分区都有kafka的相应分区中存在的数据。但是我们不能指定某个特定的分区应由特定的节点处理。

    阿披舍克所说的是正确的。在发送数据时,您需要使用基于密钥的分区器,并拥有足够数量的分区,以便属于每个密钥的数据最终都位于一个分区中。 在spark stream中使用direct stream方法,因为这将产生为kafka主题中的分区提供服务器所需数量的使用者。 spark中的每个分区都有kafka的相应分区中存在的数据。但是我们不能指定一个特定的分区应该由一个特定的节点来处理