我正在运行使用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
...
然后,我解析从文件中读取的字符串,以便创建表格
的PairRDDJavaPairDStream<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小时。
答案 0 :(得分:0)
好的,我为我迟到而道歉。从文档和我的大脑容量中我看到:The second argument您使用的是"inverse reduce function",它只能应用于可逆功能。
由于它仅适用于离开窗户的元素,你确定任何东西确实离开了窗户吗?
正如另一种检查方法:映射和过滤简单reduceByKeyAndWindow(f,dur,slide,partitions)函数的结果