如何使用Java使用foreachRDD发送数据

时间:2015-01-30 17:55:04

标签: java streaming apache-kafka spark-streaming

我正在使用我在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代码,我不想使用匿名类,

提前致谢,

2 个答案:

答案 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)); 

            }