编程语言
首页 > 编程语言> > java-Spark Streaming / Spark是否像main()方法中的while循环一样工作?

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

作者:互联网

这是一个非常简单的问题:

我通过以下方式使用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()之外声明了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();
}

每次新的批处理时间开始时,变量计数都会重置为0,因此它基本上像while循环一样工作.

我有什么方法可以在main()方法中声明count,以使Spark Streaming循环不会将其重置为0?如果是这样,我在哪里声明呢?

基本上,我想知道是否在创建Spark上下文时使整个main()方法的行为类似于while循环,或者是否存在该循环开始的特定位置.

非常感谢您,我希望我不要感到困惑.

解决方法:

不可以.SparkStreaming不会在“主”上执行“ while循环”. Spark Streaming使用调度程序以提供的批处理间隔触发注册的output operators.

这些输出运算符将在每个批处理间隔触发基础RDD的实现.在此实现过程中,将在Spark集群中执行RDD操作.

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

Spark是一个分布式计算框架,其操作针对该目标.经典的转换(例如“ map”,“ filter”,…)将对分布在集群中各个节点上的数据片段执行.

Spark中“全局变量”的最接近等效项是broadcast variables,但不能在闭包中进行更新.

从提供的代码中,我了解到这是了解Spark Streaming模型的初步实验.花一些时间研究related material,以完全了解它的工作方式.在这种特殊情况下,增加静态变量仅在本地模式下有效,因为所有代码都在同一JVM上执行,但这不是Spark Streaming的目标.

标签:apache-spark,spark-streaming,java
来源: https://codeday.me/bug/20191118/2031330.html