如何将Map发送到Kafka主题,以便ProducerRecord键与对应的Map键相同

时间:2018-10-02 15:18:39

标签: apache-spark apache-kafka spark-streaming kafka-producer-api

我正在使用Spark流式传输,并且数据正在发送到Kafka。我正在向Kafka发送地图。假设我有一个20的Map(在“流式批处理”持续时间内可能增长到1000),如下所示:

HashMap<Integer,String> input = new HashMap<Integer,String>();
        input.put(11,"One");
        input.put(312,"two");
        input.put(33,"One");
        input.put(24,"One");
        input.put(35,"One");
        input.put(612,"One");
        input.put(7,"One");
        input.put(128,"One");
        input.put(9,"One");
        input.put(10,"One");
        input.put(11,"One1");
        input.put(12,"two1");
        input.put(13,"One1");
        input.put(14,"One1");
        input.put(15,"One1");
        input.put(136,"One1");
        input.put(137,"One1");
        input.put(158,"One1");
        input.put(159,"One1");
        input.put(120,"One1");



        Set<Integer> inputKeys = input.keySet();
        Iterator<Integer> inputKeysIterator = inputKeys.iterator();
        while (inputKeysIterator.hasNext()) {
            Integer key = inputKeysIterator.next();
            ProducerRecord<Integer, String> record = new ProducerRecord<Integer, String>(topic,
                    key%10, input.get(key));
            KafkaProducer.send(record);
        }

我的Kafka主题有10个分区。在这里,我调用kafkaProducer.send()20次,因此调用20次Kafka。我该如何批量发送整个数据,即在一个Kafka调用中,但是我又想确保每条记录都进入由公式 key%10 驱动的特定分区,如

ProducerRecord记录=新的ProducerRecord(topic,                         键%10 ,input.get(键));

我看到的选项: linger.ms = 1 可以确保,但延迟为1ms。 如何避免这种延迟并避免20个网络(Kafka)通话或最小化Kafka通话?

1 个答案:

答案 0 :(得分:0)

即使您一个接一个地单独调用,Kafka Producer API也已经批量发送了消息

请参见文档中的batch.size,它是按字节而不是消息显示的,但是您可以通过在Producer上调用flush来强制发生实际的网络事件

关于分区,您需要创建代码分区程序。仅将mod值作为键传递并不能保证您不会在默认分区程序中发生哈希冲突