【发布时间】:2017-04-07 05:34:24
【问题描述】:
我没有使用 Kafka 直接流从队列中获取任何数据。在我的代码中,我把 System.out.println() 这个语句没有运行,这意味着我没有从该主题中获取任何数据..
我很确定队列中有可用的数据,因为没有进入控制台。
我也没有在控制台中看到任何错误。
谁能给点建议?
这是我的 Java 代码,
SparkConf sparkConf = new SparkConf().setAppName("JavaKafkaWordCount11").setMaster("local[*]");
sparkConf.set("spark.streaming.concurrentJobs", "3");
// Create the context with 2 seconds batch size
JavaStreamingContext jssc = new JavaStreamingContext(sparkConf, new Duration(3000));
Map<String, Object> kafkaParams = new HashMap<>();
kafkaParams.put("bootstrap.servers", "x.xx.xxx.xxx:9092");
kafkaParams.put("key.deserializer", StringDeserializer.class);
kafkaParams.put("value.deserializer", StringDeserializer.class);
kafkaParams.put("group.id", "use_a_separate_group_id_for_each_stream");
kafkaParams.put("auto.offset.reset", "latest");
kafkaParams.put("enable.auto.commit", true);
Collection<String> topics = Arrays.asList("topicName");
final JavaInputDStream<ConsumerRecord<String, String>> stream = KafkaUtils.createDirectStream(jssc,
LocationStrategies.PreferConsistent(),
ConsumerStrategies.<String, String>Subscribe(topics, kafkaParams));
JavaPairDStream<String, String> lines = stream
.mapToPair(new PairFunction<ConsumerRecord<String, String>, String, String>() {
@Override
public Tuple2<String, String> call(ConsumerRecord<String, String> record) {
return new Tuple2<>(record.key(), record.value());
}
});
lines.print();
// System.out.println(lines.count());
lines.foreachRDD(rdd -> {
rdd.values().foreachPartition(p -> {
while (p.hasNext()) {
System.out.println("Value of Kafka queue" + p.next());
}
});
});
【问题讨论】:
-
要检查的两个想法:1)新数据是否流入您的主题?默认情况下,您只会收到比您的工作开始时间新的数据。否则将 auto.offset.reset 设置为“最早” 2) bootstrap.servers 需要与 kafka 所宣传的值完全匹配(请参阅 kafka 代理配置)。如果代理公布其 dns 名称,而您尝试通过 ip 地址进行连接,您将不会收到数据但也不会收到错误
-
你在 pom 中添加了 spark-streaming-kafka jar 吗?
-
我之前参与过此集成。如果您需要任何帮助,请分享您的电子邮件
-
@user4342532 你能把代码上传到github什么的吗..
标签: java apache-spark apache-kafka spark-streaming kafka-consumer-api