Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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
Apache spark 如何仅在接收到所有输入数据后停止Spark流媒体上下文?_Apache Spark_Spark Streaming - Fatal编程技术网

Apache spark 如何仅在接收到所有输入数据后停止Spark流媒体上下文?

Apache spark 如何仅在接收到所有输入数据后停止Spark流媒体上下文?,apache-spark,spark-streaming,Apache Spark,Spark Streaming,使用套接字连接,我接收到一个JavaInputDStream,它每两秒钟向Spark集群发送一条JSON消息。我有大约60个MSG,所以接收所有JSON数据大约需要2分钟 这里是我的问题:当我停止接收JSON行作为输入时,如何才能停止SparkStreamingContext() 如果我使用ssc.stop()方法,上下文在执行一次后停止,因此我甚至不开始接收数据。 如果我使用ssc.waitiveterminationortimeout(long time),它也没有帮助,因为它会在时间之后停

使用套接字连接,我接收到一个JavaInputDStream,它每两秒钟向Spark集群发送一条JSON消息。我有大约60个MSG,所以接收所有JSON数据大约需要2分钟

这里是我的问题:当我停止接收JSON行作为输入时,如何才能停止SparkStreamingContext()

如果我使用ssc.stop()方法,上下文在执行一次后停止,因此我甚至不开始接收数据。 如果我使用ssc.waitiveterminationortimeout(long time),它也没有帮助,因为它会在
时间之后停止上下文,时间总是比我希望上下文停止的确切时间稍大

正如您可能已经猜到的,我的目标是测量代码处理所有JSON消息所需的准确时间,我这样做是为了实现这一目标:

SparkConf sparkConf = new   SparkConf().setMaster("local[2]").setAppName("sparkstreaminggetjson");
    // JavaSparkContext sc=new JavaSparkContext(sparkConf);

    JavaStreamingContext ssc = new JavaStreamingContext(sparkConf, Durations.seconds(2));

    long duration = System.currentTimeMillis();

//receive and process the JSON messages

    ssc.start();
    ssc.awaitTerminationOrTimeout(180000); 

    duration = System.currentTimeMillis()-duration;
这样,持续时间为180000,与处理所有JSON消息的实际时间无关

我该怎么做?
非常感谢。

您的消费者如何知道所有数据都已收到?输入流没有确定数据是否结束的方法。我想到了两种解决方案:1)计算我们的消息数,消息数等于预定义的值-您可以停止流式传输上下文;2) 如果您在输入数据流-stop3)中遇到空RDD,请向我发送一封邮件。听起来,对于常规的Spark作业,这可能比流式作业更好。@YuvalItzchakov,除了他使用
NetworkInputStream
作为源之外。@maasg他总是可以手动读取流中的内容。