我们的场景是通过spark-streaming读取kafka数据,实时持久化到hdfs上。并按day和hour分区。就像这种格式:
kafka:0.10.2.0
hdfs:2.7.3
spark:2.2.0
核心代码如下:
repartition是由于生成文件数量过多,合理合并分区能减少。如果用coalesce会导致任务不能并行(如果是1, 就那就只有一个node运行)。
checkpoint能保证任务挂掉,在kafka数据没有过期前重启能继续正确的运行。但是超过时间会报错Kafka OffSetOutOfRange而导致失败。如果此时你删掉checkpoint dir,任务能正常执行但是会发现它并不会去读取kafka分区的数据。这是因为还有一个地方记录着你的流式处理元信息。
它记录着你流式批次信息,如果不删除,spark-streaming会认为你一直在提交过期的job,导致数据不被处理。
当然,这只是结构化流一点使用心得。更多的文档信息在https://spark.apache.org/docs/latest/structured-streaming-kafka-integration.html