我有一个简单的程序,因为我正在尝试使用kafka
接收数据。当我启动一个kafka生产者并发送数据时,例如:“Hello”,当我打印消息时,我得到了这个:(null, Hello)
。我不知道为什么会出现这个空值。有没有办法避免这个null?我认为这是由于Tuple2<String, String>
,第一个参数,但我只想打印第二个参数。另一件事,当我使用System.out.println("inside map "+ message);
打印它时,它没有显示任何消息,有人知道为什么吗?感谢。
public static void main(String[] args){
SparkConf sparkConf = new SparkConf().setAppName("org.kakfa.spark.ConsumerData").setMaster("local[4]");
// Substitute 127.0.0.1 with the actual address of your Spark Master (or use "local" to run in local mode
sparkConf.set("spark.cassandra.connection.host", "127.0.0.1");
// Create the context with 2 seconds batch size
JavaStreamingContext jssc = new JavaStreamingContext(sparkConf, new Duration(2000));
Map<String, Integer> topicMap = new HashMap<>();
String[] topics = KafkaProperties.TOPIC.split(",");
for (String topic: topics) {
topicMap.put(topic, KafkaProperties.NUM_THREADS);
}
/* connection to cassandra */
CassandraConnector connector = CassandraConnector.apply(sparkConf);
System.out.println("+++++++++++ cassandra connector created ++++++++++++++++++++++++++++");
/* Receive kafka inputs */
JavaPairReceiverInputDStream<String, String> messages =
KafkaUtils.createStream(jssc, KafkaProperties.ZOOKEEPER, KafkaProperties.GROUP_CONSUMER, topicMap);
System.out.println("+++++++++++++ streaming-kafka connection done +++++++++++++++++++++++++++");
JavaDStream<String> lines = messages.map(
new Function<Tuple2<String, String>, String>() {
public String call(Tuple2<String, String> message) {
System.out.println("inside map "+ message);
return message._2();
}
}
);
messages.print();
jssc.start();
jssc.awaitTermination();
}
答案 0 :(得分:0)
Q1)空值:
Kafka中的消息是Keyed,这意味着它们都具有(Key,Value)结构。
当您看到(null, Hello)
是因为制作人在主题中发布了(null,"Hello")
值。
如果您想在流程中省略密钥,请映射原始Dtream
以删除密钥:kafkaDStream.map( new Function<String,String>() {...})
Q2)System.out.println("inside map "+ message);
无法打印。几个经典的原因:
转换应用于执行程序中,因此在群集中运行时,该输出将出现在执行程序中而不是主程序中。
操作很懒惰,需要实现DStream才能应用操作。
在这种特定情况下,JavaDStream<String> lines
从未实现,即不用于输出操作。因此,永远不会执行map
。