我正在处理一个java jar。累加器将流值相加。问题是,我想在每次递增时或在特定的周期性间隔中显示我的UI中的值。
但是,由于累加器值只能从驱动程序中获取,因此在进程完成执行之前,我无法访问此值。我是如何定期访问这个值的?
我的代码如下所示
package com.spark;
import java.util.HashMap;
import java.util.Map;
import org.apache.spark.Accumulator;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.streaming.Duration;
import org.apache.spark.streaming.api.java.JavaDStream;
import org.apache.spark.streaming.api.java.JavaPairDStream;
import org.apache.spark.streaming.api.java.JavaStreamingContext;
import org.apache.spark.streaming.kafka.KafkaUtils;
import scala.Tuple2;
public class KafkaSpark {
/**
* @param args
*/
public static void main(String[] args) {
SparkConf conf = new SparkConf().setAppName("Simple Application");
conf.setMaster("local");
JavaStreamingContext jssc = new JavaStreamingContext(conf,
new Duration(5000));
final Accumulator<Integer> accum = jssc.sparkContext().accumulator(0);
Map<String, Integer> topicMap = new HashMap<String, Integer>();
topicMap.put("test", 1);
JavaPairDStream<String, String> lines = KafkaUtils.createStream(jssc,
"localhost:2181", "group1", topicMap);
JavaDStream<Integer> map = lines
.map(new Function<Tuple2<String, String>, Integer>() {
public Integer call(Tuple2<String, String> v1)
throws Exception {
if (v1._2.contains("the")) {
accum.add(1);
return 1;
}
return 0;
}
});
map.print();
jssc.start();
jssc.awaitTermination();
System.out.println("*************" + accum.value());
System.out.println("done");
}
}
我使用Kafka传输数据。
答案 0 :(得分:1)
只有在调用jssc.star()时,才会启动执行实际代码。现在控件是用spark开始运行循环,你只需要调用一次system.out.println。并且不会每次都使用循环执行。
对于输出操作,请检查documentation
你可以使用
打印() forEachRDD() 另存为对象文本或hadoop文件
希望这有帮助
答案 1 :(得分:0)
jssc.start();
while(true) {
System.out.println("current:" + accum.value());
Thread.sleep(1000);
}