我正在使用我在JavaDStream中转换的RDD数据,现在我想将它发送到kafka主题, 我不想要kafka发送代码, 我只需要foreachRDD实现, 我的代码看起来像
public void publishtoKafka(ITblStream t)
{
MyTopicProducer MTP = ProducerFactory.createProducer(hostname+":"+port);
JavaDStream<?> rdd = (JavaDStream<?>) t.getRDD();
rdd.foreachRDD(new Function<String, String>() {
@Override
public Void call(JavaRDD<String> rdd) throws Exception {
KafkaUtils.sendDataAsString(MTP,topicName, "String RDDData");
return null;
}
});
log.debug("------------------------sent to kafka: ------------------");
}
这里myTopicproducer将创建工作正常的生产者 KafkaUtils.sendDataAsString是将数据发布到kafka主题的方法也工作正常,
我只有一个问题我无法使用foreach或foreachRDD将JavaDStream rdd转换为字符串,最后我需要来自rdds的String消息, 请善意建议使用java代码,我不想使用匿名类,
提前致谢,
答案 0 :(得分:3)
我没有测试过,但应该可以正常工作:
public Void call(JavaRDD<String> rdd) throws Exception {
for (rddData : rdd.collect()) {
KafkaUtils.sendDataAsString(MTP,topicName, rddData);
}
return null;
}
关键是你需要collect
你的RDD(javadoc here)才能从你的RDD获得实际的String数据集合。
答案 1 :(得分:1)
问题已经解决, 我用的时候
rdd.foreachRDD(new Function<JavaRDD<String>, Void>() {
@Override
public Void call(JavaRDD<String> rdd) throws Exception {
if(rdd!=null)
{
List<String> result = rdd.collect();
KafkaUtil.sendString(p,topic,result.get(0));
KafkaUtils.sendDataAsString(MTP,topicName, result.get(0));
}