目前我正在使用Spark Streaming以及从Kafka读取消息的可能性。使用Kafka Producer,我将消息发送到主题,并希望借助Spark Streaming阅读此主题。
我使用以下Java代码来查询消息:
package apache_spark_streaming;
import java.util.*;
import org.apache.spark.SparkConf;
import org.apache.spark.streaming.Durations;
import org.apache.spark.streaming.api.java.JavaInputDStream;
import org.apache.spark.streaming.api.java.JavaStreamingContext;
import org.apache.spark.streaming.kafka010.*;
import org.apache.kafka.clients.consumer.ConsumerRecord;
public final class Spark_Kafka_Example {
private static final String BOOTSTRAP_SERVERS_CONNECTION = "XXXXX";
private static final String SPARK_CONNECTION = "spark://XXXXX:7077";
private static final String TOPIC_NAME = "KafkaTesting1";
private static final Set<String> TOPIC_1 = new HashSet<>(Arrays.asList(TOPIC_NAME.split(",")));
public static Map<String, Object> getProperties() {
try {
Map<String, Object> kafkaParams = new HashMap<>();
kafkaParams.put("bootstrap.servers", BOOTSTRAP_SERVERS_CONNECTION);
kafkaParams.put("key.deserializer", org.apache.kafka.common.serialization.StringDeserializer.class.getName());
kafkaParams.put("value.deserializer", org.apache.kafka.common.serialization.StringDeserializer.class.getName());
kafkaParams.put("group.id", "Stream Testing");
kafkaParams.put("auto.offset.reset", "earliest");
kafkaParams.put("enable.auto.commit", false);
return kafkaParams;
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) throws Exception {
// Create context with a 2 seconds batch interval
SparkConf sparkConf = new SparkConf().setAppName("Kafka Example").setMaster(SPARK_CONNECTION);
JavaStreamingContext sc = new JavaStreamingContext(sparkConf, Durations.seconds(2));
JavaInputDStream<ConsumerRecord<String, String>> stream = KafkaUtils.createDirectStream(
sc
, LocationStrategies.PreferConsistent()
, ConsumerStrategies.Subscribe(TOPIC_1, getProperties())
);
stream.print();
sc.start();
sc.awaitTermination();
}
}
我的问题是我不知道如何在命令行上输出消息。也许我只有一个理解问题如何正确使用JavaInputDStreams。
目前我只使用print()函数将其作为输出:
17/07/10 16:59:20 INFO JobScheduler:已添加时间1499698760000 ms的作业
我希望你能帮助我解决这个问题&#34;。
更新 我试过
stream.foreachRDD(consumerRecordJavaRDD -> {
consumerRecordJavaRDD.foreach(stringStringConsumerRecord -> {
//.to get topic name: stringStringConsumerRecord.topic()
//To get value : stringStringConsumerRecord.value()
} }
答案 0 :(得分:0)
创建流后,您将提取内容并使用过滤器或地图进行处理。
查看Spark / java的流示例目录:https://github.com/apache/spark/tree/master/examples/src/main/java/org/apache/spark/examples/streaming
JavaQueueStream给出了一个例子。
答案 1 :(得分:0)
您直接绑定来打印输入流,这是我无法打印流的实际值的原因。
使用以下代码来打印输入流,该输入流是由Kafka生产者产生的。
JavaDStream<String> data = stream.map(v -> {
return v.value(); // mapping to convert into spark D-Stream
});
data.print();