【发布时间】:2016-04-03 23:16:15
【问题描述】:
这是一个非常直接的问题:
我正在通过以下方式使用 Spark Streaming:
private static int count=0;
public static void main(String[] args) throws Exception {
if (args.length < 2) {
System.err.println("Usage: sparkstreaminggetjson <hostname> <port>");
System.exit(1);
}
SparkConf sparkConf = new
SparkConf().setMaster("local[2]").setAppName("sparkstreaminggetjson");
JavaSparkContext sc=new JavaSparkContext(sparkConf);
JavaStreamingContext ssc = new JavaStreamingContext(sparkConf,
Durations.seconds(1));
JavaReceiverInputDStream<String> lines = ssc.socketTextStream(
args[0],Integer.parseInt(args[1]), StorageLevels.MEMORY_AND_DISK_SER);
count=count+1;
lines.print;
ssc.start();
ssc.awaitTermination();
}
每次新的“批处理时间”开始时,变量行从套接字获取新值并打印出来,变量计数增加 1。
我的问题是:现在我在 main() 之外声明计数,因为如果我这样做
public static void main(String[] args) throws Exception {
if (args.length < 2) {
System.err.println("Usage: sparkstreaminggetjson <hostname> <port>");
System.exit(1);
}
//declare count here
int count=0;
SparkConf sparkConf = new
SparkConf().setMaster("local[2]").setAppName("sparkstreaminggetjson");
JavaSparkContext sc=new JavaSparkContext(sparkConf);
JavaStreamingContext ssc = new JavaStreamingContext(sparkConf,
Durations.seconds(1));
JavaReceiverInputDStream<String> lines = ssc.socketTextStream(
args[0],Integer.parseInt(args[1]), StorageLevels.MEMORY_AND_DISK_SER);
count=count+1;
lines.print;
ssc.start();
ssc.awaitTermination();
}
每次新的批处理时间开始时,变量计数都会重置为 0。所以,它基本上就像一个 while 循环。
我有什么方法可以在 main() 方法中声明 count 以使 Spark Streaming 循环不会将其重置为 0?如果是这样,我在哪里声明它?
基本上我想知道当我们创建一个 Spark 上下文时,我们是否让整个 main() 方法表现得像一个 while 循环,或者这个循环是否有一个特定的地方开始。
非常感谢,希望我没有混淆。
【问题讨论】:
-
如果 (1) 计数器增加,您如何观察?
-
此外,在案例 #1 中,'lines' 变量在每个流式传输间隔上都没有获得新值。它只有一个值:对在创建时实例化的
socketTextStream的引用。每个时间间隔的变化是底层 RDD 的内容,只能通过 DStream 上的操作访问。
标签: java apache-spark spark-streaming