Spark错误:以前的窗口都没有key的值,也没有找到新的值

时间:2016-06-10 20:22:06

标签: apache-spark spark-streaming

我正在运行使用reduceByKeyAndWindow()的Spark Streaming应用程序。窗口间隔为2小时,而滑动间隔为1小时。我有一个JavaPairRDD,其中键和值都是字符串。每次调用reduceByKeyAndWindow()函数时,它都使用下面的appendString()和removeString()函数来逐步构建一个窗口化的数据流:

Function<scala.Tuple2<String, String>, Boolean> filterEmptyRecords = new Function<scala.Tuple2<String, String>, Boolean>() {
  @Override
  public Boolean call(scala.Tuple2<String, String> t) {
    return (!t._2().isEmpty());
  }
};

filterEmptyRecords()删除最终不会包含任何值的键:

JavaPairDStream<String, String> cdr_kv = cdr_filtered.reduceByKeyAndWindow(appendString, removeString, Durations.seconds(WINDOW_DURATION), Durations.seconds(SLIDE_DURATION), PARTITIONS, filterEmptyRecords);

窗口操作是:

JavaDStream<String> file_orig = jssc.textFileStream(MY_DIR).repartition(PARTITIONS);

运行几个小时后,此函数会引发以下异常: &#34;以前的窗口都没有键值,也没有找到新值。你确定你的关键班一致吗?&#34;

我从2013年发现了这篇文章:https://groups.google.com/forum/#!msg/spark-users/9OM1YvWzwgE/PhFgdSTP2OQJ 然而,这并没有解决我的问题。我使用String来表示密钥,我非常确定哈希值。

为什么会发生这种情况并提出修复建议?

谢谢!

修改

我正在使用Spark Streaming 1.6.1。我从文件中读取数据:

Key: 0000; Value: aaa|bbb|ccc
Key: 0001; Value: ddd|eee|fff
...

然后,我解析从文件中读取的字符串,以便创建表格

的PairRDD
JavaPairDStream<String, String> file_filtered = file_orig.mapToPair(parserFunc)
                                                       .filter(new Function<scala.Tuple2<String, String>, Boolean>() {
                                                         @Override
                                                         public Boolean call(scala.Tuple2<String, String> t) {
                                                           return (!t._2().contains("null"));
                                                         }
                                                       });

键是一个数字,但表示为String。有些对可能有空值,因此它们会被过滤掉。

Item.value.length = 81

在此之后,我应用上面描述的窗口化操作(参见代码),稍后我将窗口化的流加入另一个JavaPairRDD。上面描述的问题发生在窗口操作期间,当前一批中缓存的旧数据被删除时。窗口大小为2小时,滑动间隔为1小时。

1 个答案:

答案 0 :(得分:0)

好的,我为我迟到而道歉。从文档和我的大脑容量中我看到:The second argument您使用的是"inverse reduce function",它只能应用于可逆功能。
由于它仅适用于离开窗户的元素,你确定任何东西确实离开了窗户吗? 正如另一种检查方法:映射和过滤简单reduceByKeyAndWindow(f,dur,slide,partitions)函数的结果