我正在使用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通话?
答案 0 :(得分:0)
即使您一个接一个地单独调用,Kafka Producer API也已经批量发送了消息
请参见文档中的batch.size
,它是按字节而不是消息显示的,但是您可以通过在Producer上调用flush来强制发生实际的网络事件
关于分区,您需要创建代码分区程序。仅将mod值作为键传递并不能保证您不会在默认分区程序中发生哈希冲突