我正在尝试通过spark框架将请求响应日志存储在我的Kafka队列中。
我使用的依赖关系:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql-kafka-0-10_2.11</artifactId>
<version>2.1.1</version>
</dependency>
代码:
private static void startKafkaProducer() {
Properties props = new Properties();
props.put("bootstrap.servers", _properties.getProperty("broker.request"));
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeSerializer");
props.put("acks", "0");
props.put("retries", 0);
props.put("batch.size", 1);
props.put("enable.auto.commit", false);
_producer = new KafkaProducer<>(props);
System.out.println("\n\n\n\n\n\n>>>>>>>>\nstartKafkaProducer()\n>>>>>>>>\n\n");
}
public static void routeToKafka(String incomingrequest, String optionalEsId, String topic) {
try {
System.out.println("\n\n\n\n\n\n>>>>>>>>\nrouteToKafka()\n>>>>>>>>\n\n");
System.out.println("Request: " + incomingrequest);
System.out.println("topic: " + topic);
_producer.send(new ProducerRecord<>(topic, incomingrequest));
} catch (Exception e) {
e.printStackTrace();
}
}
我的用例限制我一次只发送一条消息 - 这就是我的服务器收到请求后我处理它并计算响应,这几乎不需要1毫秒然后我将其排入Kafka,我的惊奇每次需要6000毫秒或更多。
我在我的其他项目中使用类似的代码,尽管键和值序列化器/反序列化器在那里工作得更快。
以下是我尝试添加记录的方法,这是一个普通的JSON字符串。
routeToKafka(dataset.toJSON().toString(), null, PREDICT_TOPIC);
我在这里遗漏了一些东西,因为添加队列会阻止我的HTTP请求响应,而我愿意为上述调用启动一个单独的线程,但延迟似乎很大。