有没有办法计算随着时间的推移,java/scala 应用程序中的 KTable/KStream 将使用多少堆(或任何其他)内存?
我有一些具体的假设,我想知道它们是否正确:
Kafka 流仅使用内部主题和 RocksDB。
RocksDB 是嵌入式数据库,因此它使用我的应用程序的堆内存。
当拓扑中的任何处理器不再使用这些记录时,KStream 不断地从 RocksDB 中删除所有记录(例如,用于与指定的 JoinWindow 进行连接)(== 没有使用太多内存)
KTable完全存储在RocksDB中(==在内存中)
当 KTable 收到空值记录时,它会从 RocksDB 中删除记录(==释放内存)
假设我有一个流数据帧,并且我正在将其写入 Databricks Delta Lake:
someStreamingDf.writeStream
.format("delta")
.outputMode("append")
.start("targetPath")
Run Code Online (Sandbox Code Playgroud)
然后从中创建一个增量表:
spark.sql("CREATE TABLE <TBL_NAME> USING DELTA LOCATION '<targetPath>'
TBLPROPERTIES ('delta.autoOptimize.optimizeWrite'=true)")
Run Code Online (Sandbox Code Playgroud)
失败了AnalysisException: The specified properties do not match the existing properties at <targetPath>。
我知道我可以预先创建一个表:
CREATE TABLE <TBL_NAME> (
//columns
)
USING DELTA LOCATION "< targetPath >"
TBLPROPERTIES (
"delta.autoOptimize.optimizeWrite" = true,
....
)
Run Code Online (Sandbox Code Playgroud)
然后就写入它,但是使用所有列及其类型编写此 SQL 看起来像是一些额外/不必要的工作。那么有没有办法在写入增量表(第一次)时而不是事先指定这些 TBLPROPERTIES?
apache-spark databricks spark-structured-streaming delta-lake