Java Spark Streaming/Spark是否像main()方法中的while循环一样工作?

Java Spark Streaming/Spark是否像main()方法中的while循环一样工作?,java,apache-spark,spark-streaming,Java,Apache Spark,Spark Streaming,这是一个非常直截了当的问题: 我以以下方式使用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>");

这是一个非常直截了当的问题:

我以以下方式使用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();
}
private static int count=0;
公共静态void main(字符串[]args)引发异常{
如果(参数长度<2){
System.err.println(“用法:sparkstreaminggetjson”);
系统出口(1);
}
SparkConf SparkConf=新
SparkConf().setMaster(“本地[2]”).setAppName(“sparkstreaminggetjson”);
JavaSparkContext sc=新的JavaSparkContext(sparkConf);
JavaStreamingContext ssc=新的JavaStreamingContext(sparkConf,
持续时间:秒(1);
JavaReceiverInputDStream lines=ssc.socketTextStream(
args[0]、Integer.parseInt(args[1])、StorageLevels.MEMORY\u和\u DISK\u SER;
计数=计数+1;
行。打印;
ssc.start();
ssc.终止();
}
每次新的“批处理时间”开始时,变量行从套接字获取一个新值并打印它,变量计数增加1

我的问题是:现在我在main()之外声明count,因为如果我这样做

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();
}
publicstaticvoidmain(字符串[]args)引发异常{
如果(参数长度<2){
System.err.println(“用法:sparkstreaminggetjson”);
系统出口(1);
}
//在这里申报计数
整数计数=0;
SparkConf SparkConf=新
SparkConf().setMaster(“本地[2]”).setAppName(“sparkstreaminggetjson”);
JavaSparkContext sc=新的JavaSparkContext(sparkConf);
JavaStreamingContext ssc=新的JavaStreamingContext(sparkConf,
持续时间:秒(1);
JavaReceiverInputDStream lines=ssc.socketTextStream(
args[0]、Integer.parseInt(args[1])、StorageLevels.MEMORY\u和\u DISK\u SER;
计数=计数+1;
行。打印;
ssc.start();
ssc.终止();
}
每次新的批处理时间开始时,变量计数都会重置为0。因此,它基本上就像一个while循环

我有没有办法在main()方法中声明count,这样Spark Streaming循环就不会将其重置为0?如果是,我在哪里申报

基本上,我想知道当我们创建一个Spark上下文时,我们是否使整个main()方法的行为像一个while循环,或者这个循环是否有一个特定的开始位置


非常感谢,我希望我没有混淆。

不。Spark流媒体不会在“主”上执行“while循环”。Spark Streaming使用调度程序在提供的批处理间隔内触发注册

这些输出操作符将在每个批处理间隔触发底层RDD的具体化。在这个具体化过程中,RDD操作将在Spark集群中执行

使用与集群中序列化的任何代码交互的全局静态变量将导致意外行为

Spark是一个分布式计算框架,其操作就是为了实现这一目标。经典的转换,如“映射”、“过滤器”。。。将在群集中跨节点分布的数据块上执行

Spark中与“全局变量”最接近的等价物是,但这些变量不能在闭包中更新


从提供的代码中,我了解到这些是理解Spark流模型的初步实验。花些时间学习,充分了解它的工作原理。在这种特殊情况下,增加一个静态变量只能在本地模式下工作,因为所有代码都在同一个JVM上执行,但这不是Spark Streaming的目标。

您如何观察到在情况(1)中计数器增加了?此外,在情况#1中,“lines”变量不会在每个流间隔上获得新值。它只有一个值:对创建时实例化的
sockettexstream
的引用。每个时间间隔的变化是底层RDD的内容,它只能通过对数据流的操作访问。非常感谢。你是对的,这只是一个很简单的例子来说明我的问题。实际上,我想做的是将
DStream中每个RDD的值存储到一个.txt文件中,每行一个值。使用
savetextasfiles.dstream()
我可以在批处理间隔中保存每个RDD,但是当另一个批处理间隔开始时,下一个RDD存储在不同的文件中,所有文件都具有相同的hdfs目录。我曾考虑使用FileWriter在给定的时间间隔内将每个RDD中的值保存到一个唯一的文件中。但在每个批处理时间间隔内,FileWriter filew=new FileWriter()会重复一次又一次,并且我会将所需的值存储在同一个文件中。结果是我的.txt文件中只保存了一个值。当我尝试将这些值存储在SQL数据库中时也是如此。如果我感到困惑,我很抱歉,但谢谢你的解释,这是非常必要的。@manuelmourato我明白了。在这种情况下,使用
FileWriter(filename,TRUE)
附加到文件。与上述相同,请注意,只有在一个节点上运行时,才能在本地文件系统中写入文件。