背景: 我编写了一个简单的Spark结构化蒸汽应用程序,用于将数据从Kafka移至S3。发现为了支持一次保证,spark创建了_spark_metadata文件夹,该文件夹最终变得太大,而当流媒体应用程序长时间运行时,元数据文件夹变得如此之大,以至于我们开始收到OOM错误。我想摆脱Spark结构化流式处理的元数据和检查点文件夹,并自己管理偏移量。
我们如何在Spark Streaming中管理偏移量: 我已经使用val offsetRanges = rdd.asInstanceOf [HasOffsetRanges] .offsetRanges来获取Spark结构化流中的偏移量。但是想知道如何使用Spark结构化流技术获取偏移量和其他元数据来管理我们自己的检查点。您是否有实现检查点的示例程序?
我们如何在Spark结构化流媒体中管理偏移量? 看这个JIRA https://issues-test.apache.org/jira/browse/SPARK-18258。好像没有提供偏移量。我们应该怎么做?
问题在于元数据的大小在6小时内增加到45MB,并且一直增长到接近13GB。分配的驱动程序内存为5GB。那时,系统因OOM而崩溃。想知道如何避免使此元数据变得如此之大?如何使元数据不记录太多信息。
代码:
1. Reading records from Kafka topic
Dataset<Row> inputDf = spark \
.readStream \
.format("kafka") \
.option("kafka.bootstrap.servers", "host1:port1,host2:port2") \
.option("subscribe", "topic1") \
.option("startingOffsets", "earliest") \
.load()
2. Use from_json API from Spark to extract your data for further transformation in a dataset.
Dataset<Row> dataDf = inputDf.select(from_json(col("value").cast("string"), EVENT_SCHEMA).alias("event"))
....withColumn("oem_id", col("metadata.oem_id"));
3. Construct a temp table of above dataset using SQLContext
SQLContext sqlContext = new SQLContext(sparkSession);
dataDf.createOrReplaceTempView("event");
4. Flatten events since Parquet does not support hierarchical data.
5. Store output in parquet format on S3
StreamingQuery query = flatDf.writeStream().format("parquet")
数据集dataDf = inputDf.select(from_json(col(“ value”)。cast(“ string”),EVENT_SCHEMA).alias(“ event”)) .select(“ event.metadata”,“ event.data”,“ event.connection”,“ event.registration_event”,“ event.version_event” ); SQLContext sqlContext =新的SQLContext(sparkSession); dataDf.createOrReplaceTempView(“ event”); 数据集flatDf = sqlContext .sql(“选择” +“日期,时间,ID,” + flattenSchema(EVENT_SCHEMA,“事件”)+“来自事件”); StreamingQuery查询= flatDf .writeStream() .outputMode(“ append”) .option(“ compression”,“ snappy”) .format(“ parquet”) .option(“ checkpointLocation”,checkpointLocation) .option(“ path”,outputPath) .partitionBy(“ date”,“ time”,“ id”) .trigger(Trigger.ProcessingTime(triggerProcessingTime)) 。开始(); query.awaitTermination();
答案 0 :(得分:1)
对于非批处理Spark结构化流式KAFKA集成:
报价:
结构化流忽略Apache Kafka中的偏移量提交。
相反,它依赖于驱动程序端自身的偏移量管理,负责将偏移量分配给执行者和 用于在处理回合结束时检查它们(时期或 微型批次)。
如果您遵循Spark KAFKA集成指南,则不必担心。
对于批处理而言,情况有所不同,您需要自己进行管理并存储偏移量。
更新 根据评论,我建议这个问题稍有不同,建议您查看Spark Structured Streaming Checkpoint Cleanup。除了更新的注释和没有错误的事实之外,我建议您在Spark结构化流https://www.waitingforcode.com/apache-spark-structured-streaming/checkpoint-storage-structured-streaming/read的元数据上对此进行总结。查看与我的风格不同的代码,但是看不到任何明显的错误。