Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何显示数据流中更新的当前累加器值?_Java_Apache Spark_Apache Kafka_Accumulator - Fatal编程技术网

Java 如何显示数据流中更新的当前累加器值?

Java 如何显示数据流中更新的当前累加器值?,java,apache-spark,apache-kafka,accumulator,Java,Apache Spark,Apache Kafka,Accumulator,我正在处理一个javajar。累加器将流值相加。问题是,我希望每次递增或以特定的周期间隔在UI中显示该值 但是,由于累加器值只能从驱动程序获取,因此在进程完成执行之前,我无法访问该值。知道如何定期访问此值吗 我的代码如下所示 package com.spark; import java.util.HashMap; import java.util.Map; import org.apache.spark.Accumulator; import org.apache.spark.SparkCo

我正在处理一个javajar。累加器将流值相加。问题是,我希望每次递增或以特定的周期间隔在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");
    }
}
package com.spark;
导入java.util.HashMap;
导入java.util.Map;
导入org.apache.spark.acculator;
导入org.apache.spark.SparkConf;
导入org.apache.spark.api.java.function.function;
导入org.apache.spark.streaming.Duration;
导入org.apache.spark.streaming.api.java.JavaDStream;
导入org.apache.spark.streaming.api.java.JavaPairDStream;
导入org.apache.spark.streaming.api.java.JavaStreamingContext;
导入org.apache.spark.streaming.kafka.KafkaUtils;
导入scala.Tuple2;
公共级卡夫卡{
/**
*@param args
*/
公共静态void main(字符串[]args){
SparkConf conf=new SparkConf().setAppName(“简单应用程序”);
conf.setMaster(“本地”);
JavaStreamingContext jssc=新的JavaStreamingContext(conf,
新期限(5000);
最终累加器accum=jssc.sparkContext()累加器(0);
Map topicMap=newhashmap();
topicMap.put(“测试”,1);
JavaPairDStream行=KafkaUtils.createStream(jssc,
“本地主机:2181”,“组1”,topicMap);
JavaDStream映射=行
.map(新函数(){
公共整数调用(Tuple2 v1)
抛出异常{
如果(v1._2.包含(“该”)){
累计增加(1);
返回1;
}
返回0;
}
});
map.print();
jssc.start();
jssc.aittimination();
System.out.println(“*************”+累计值());
系统输出打印项次(“完成”);
}
}

我正在使用Kafka流式传输数据。

只有在调用jssc.star()时,实际代码才开始执行。现在控件使用spark开始运行循环,所有system.out.println将只调用一次。并且不会每次都与循环一起执行

对于输出操作,请检查

你可以使用

打印() forEachRDD() 另存为对象文本或hadoop文件


希望这有帮助

为什么您认为蓄能器非常适合该用例?我更愿意考虑一些外部数据存储来反映此聚合的当前值,即另一个卡夫卡主题,客户可能会使用它来获得有关更改的通知。
jssc.start();
while(true) {
    System.out.println("current:" + accum.value());
    Thread.sleep(1000);
}