Apache spark StreamingQueryListner spark结构化流媒体
我正在开发结构化流媒体应用程序,其中我以流的形式从Kafka读取数据,对于每一批流,我需要执行S3查找文件(接近200gb)来获取一些属性 因此,我使用df.persist()(基本上是缓存查找),但由于S3查找数据频繁更改,我需要刷新数据帧。我正在使用下面的代码Apache spark StreamingQueryListner spark结构化流媒体,apache-spark,amazon-s3,apache-spark-sql,spark-structured-streaming,Apache Spark,Amazon S3,Apache Spark Sql,Spark Structured Streaming,我正在开发结构化流媒体应用程序,其中我以流的形式从Kafka读取数据,对于每一批流,我需要执行S3查找文件(接近200gb)来获取一些属性 因此,我使用df.persist()(基本上是缓存查找),但由于S3查找数据频繁更改,我需要刷新数据帧。我正在使用下面的代码 类RefreshcachedDF(sparkSession:sparkSession)扩展了StreamingQueryListener{ 重写DefonQueryStarted(事件:org.apache.spark.sql.str
类RefreshcachedDF(sparkSession:sparkSession)扩展了StreamingQueryListener{
重写DefonQueryStarted(事件:org.apache.spark.sql.streaming.StreamingQueryListener.QueryStartedEvent):单位={}
重写DefonQueryTerminated(事件:org.apache.spark.sql.streaming.StreamingQueryListener.QueryTerminatedEvent):单位={}
重写def onQueryProgress(事件:StreamingQueryListener.QueryProgressent):单位={
val currTime=System.currentTimeMillis()
如果(currTime>(globaltempview中提到的latestrefreshtime)){
//oldDF是从GlobalTempView创建的缓存数据帧,大小为200GB。
oldDF.unpersist()//我想这是一个异步调用,我应该使用阻塞的unpersist(true)吗?它安全吗?
val inputDf:DataFrame=readFile(规范,sparkSession)
val recreateddf=inputDf.persist()
val count=重新创建ddf.count()
}
}
}
}
上述方法是刷新缓存数据帧的更好解决方案吗?此刷新的触发器是将S3缓存的过期日期存储在globaltempview中
- 所以问题是,这是刷新缓存df的正确位置吗
- 如果是,我应该使用阻塞或非阻塞非持久性方法,因为数据是巨大的200GB
- 对于类似的问题,我看到Databricks提交人的回复如下
query.processAllavailable()
query.stop()
df.unpersist()
val-inputDf:DataFrame=readFile(spec,sparkSession)//从S3读取文件
或任何其他来源
val recreateddf=inputDf.persist()
//启动查询
当我查看上述方法的spark文档时
用于测试///
块,直到源中的所有可用数据都已处理并
把它放在水槽里。此方法用于测试。注意,在
在连续到达数据的情况下,此方法可能永远阻塞。
此外,此方法仅保证在数据被删除之前阻止
在调用之前已将数据同步附加到源。(即。
getOffset
必须立即反映添加内容)
如果此查询正在运行,则停止执行。此方法阻止
直到执行执行的线程停止
请建议一种更好的方法来刷新缓存
void processAllAvailable() ///documentation says This method is intended
stop()