我是Apache Spark的初学者。我正在尝试运行一个流作业,它接收一些数据,将其转换为数据帧并运行一些处理,如加入和删除重复项等。现在我必须缓存这个已处理的数据,以便我可以将其附加到下一个dstream(使用一些union / join)并再次进行处理。
我尝试使用dataframe.cache()缓存并在下一个批处理中重新使用它。
例如,如果df是由dstream形成的rdd。
foreachrdd{
new =df.unionAll(processed)
new.registerTempTable("TableScheme")
sql.( //perform inner join and some other processing)
processed=new
processed.cache();
}
当我们执行Dataframe.cache或Dataframe.persist()时,我们是否缓存了实际数据或应用的DAG /转换?当第二个流来时,我的程序退出
Caused by: org.apache.spark.sql.catalyst.errors.package$TreeNodeException: execute, tree:
org.apache.spark.SparkException: Attempted to use BlockRDD[1] at socketTextStream after its blocks have been removed!
答案 0 :(得分:0)
cache()
功能执行DAG中定义的处理,直到cache()
调用并适当地存储数据,以便在不执行多个操作的情况下不重复计算。
你想要的是跨流批次的一些持久性。
有几种方法可以做到这一点:
streamingContext.remember
(Minutes(5))保留以前批次的数据Minutes(5)
时间window
ing跨数据移动固定时间窗口,允许您对多批数据执行操作updateStateByKey
& mapWithState
提供了跨批次维护和转换状态的机制您选择的方法在很大程度上取决于您的用例。