Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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 StreamingQueryListner spark结构化流媒体_Apache Spark_Amazon S3_Apache Spark Sql_Spark Structured Streaming - Fatal编程技术网

Apache spark StreamingQueryListner spark结构化流媒体

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

我正在开发结构化流媒体应用程序,其中我以流的形式从Kafka读取数据,对于每一批流,我需要执行S3查找文件(接近200gb)来获取一些属性

因此,我使用df.persist()(基本上是缓存查找),但由于S3查找数据频繁更改,我需要刷新数据帧。我正在使用下面的代码

类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提交人的回复如下
是的,您必须重新创建流数据帧以及 静态数据帧,然后重新启动查询。目前还没有一个可行的解决方案 在不重新启动查询的情况下执行此操作。但是在不重新启动的情况下重新启动查询 整个应用程序+spark cluster速度相当快。如果你的 ApplicationIn可以承受10秒的延迟,然后停止并重新启动 同一Spark应用程序中的查询是一个合理的解决方案

主题:刷新持久化RDD

所以,如果这是一个更好的解决方案,我应该按如下方式重新启动查询吗

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()