Apache spark 结构化流式性能和清除拼花文件

Apache spark 结构化流式性能和清除拼花文件,apache-spark,parquet,spark-structured-streaming,Apache Spark,Parquet,Spark Structured Streaming,我使用Spark结构化流媒体从Kafka获取流媒体数据。我需要聚合各种度量(比如6个度量)并作为拼花文件写入。我确实看到度量1和度量2之间存在巨大的延迟。例如,如果度量值1最近更新,则度量值2是一小时前的数据。如何提高并行工作的性能 此外,我还编写拼花文件,其他应用程序应该读取这些文件。如何不断清除旧拼花地板信息?我应该有不同的申请吗 Dataset lines\u topic=spark.readStream().format(“kafka”).option(“kafka.bootstrap.

我使用Spark结构化流媒体从Kafka获取流媒体数据。我需要聚合各种度量(比如6个度量)并作为拼花文件写入。我确实看到度量1和度量2之间存在巨大的延迟。例如,如果度量值1最近更新,则度量值2是一小时前的数据。如何提高并行工作的性能

此外,我还编写拼花文件,其他应用程序应该读取这些文件。如何不断清除旧拼花地板信息?我应该有不同的申请吗

Dataset lines\u topic=spark.readStream().format(“kafka”).option(“kafka.bootstrap.servers”,bootstrapserver)
Dataset data=lines\u topic.select(functions.from\u json(lines\u topic.col(“value”),schema).alias(topics));data.withWatermark(-).groupBy(-).count();query=data.writeStream().format(“parquet”).option(“path”,--).option(“truncate”,“false”).outputMode(“append”).option(“checkpointLocation”,checkpointFile).start();

由于每个查询都独立于其他查询运行,因此您需要确保为每个查询提供足够的资源来执行。可能发生的情况是,如果使用默认值,那么所有触发器都是顺序运行的,而不是并行运行的

正如所描述的,您应该在SparkContext上设置一个新的池,然后为每个查询定义新的池

// Run streaming query1 in scheduler pool1
spark.sparkContext.setLocalProperty("spark.scheduler.pool", "pool1")
df.writeStream.queryName("query1").format("parquet").start(path1)

// Run streaming query2 in scheduler pool2
spark.sparkContext.setLocalProperty("spark.scheduler.pool", "pool2")
df.writeStream.queryName("query2").format("orc").start(path2)

此外,在清除旧拼花地板文件方面,您可能希望对数据进行分区,然后根据需要定期删除旧分区。否则,如果所有数据都写入同一输出路径,则不能仅删除行。

谢谢。我的问题完全解决了。我是否可以删除早于x天的snappy.parquet文件?您的意思是删除文件夹中的parquet文件?为此,您需要直接使用HDFS API,因为Spark没有为您提供删除单个文件的方法。是的。我在谷歌云存储中存储文件。我可以使用谷歌API删除旧文件。我不确定这是否会产生任何不同的问题。我能理解拼花文件和普通文件一样,删除旧文件不会在更新的数据中产生任何问题吗?我计划创建一个Google云存储桶,只保留最后2天的文件。如果您主动查询数据并将其删除,可能会产生问题。所以,当您知道自己最不可能运行查询时,可以尝试删除它们。