StructedStreaming消费Kafka数据突然存储不到HDFS

问题描述:

StructedStreaming消费Kafka数据存储到HDFS中,以前正常存储,突然就存储不进去了,可以新建文件夹,但是数据写入不进去了。
分析:通过流写出到控制台,能消费数据,说明消费正常,但是就是写不进HDFS中,说明写时不能触发HDFS保存。

/**
* 消费数据,写到控制台
*/
val query = spark.sql(sql)
    .writeStream
    .format("console")
    .outputMode("append")
    .start()

解决方案

网上也没找到相关解决方案,所以自己只能考虑,换种写数据的方式,通过foreachBatch这种方式,可以对每一条流进行触发。
foreachBatch允许在每个微批次的输出上进行任意操作和自定义逻辑。
foreachBatch(…)允许您指定对流式查询的每个微批次的输出数据执行的函数。从 Spark 2.4 开始,Scala、Java 和 Python 都支持这一点。它有两个参数:一个 DataFrame 或 Dataset,其中包含微批次的输出数据和微批次的唯一 ID。
using-foreach-and-foreachbatch - 官网详解

// 原来写数据方式
val query = spark.sql(sql)
    .coalesce(1)
    .writeStream
    .format("parquet")
    .outputMode("append")
    .option("truncate", "false")
    .option("path", hdfs_save_path)
    .option("checkpointLocation", checkPointDir)
    .partitionBy("part_date")
    .trigger(Trigger.ProcessingTime("1 minutes"))
    .queryName("game_event")
    .start()
// 修改为foreachBatch的方式
 val query = spark.sql(sql)
            .coalesce(1)
            .writeStream.foreachBatch((batchDF: DataFrame, batchId: Long) =>
            batchDF.
              write.format("parquet")
              .mode("append")
              .partitionBy("part_date")
              .save(hdfs_save_path))
            .outputMode("append")
            .option("checkpointLocation", checkPointDir)
            .trigger(Trigger.ProcessingTime("1 minutes"))
            .queryName("game_event")
            .start()

修改后,意外的发现可以正常些数据了。

注意事项:

修改写入方式后,有可能还会报一个

Offsets out of range with no configured reset policy for partitions

错误。
解决方案:
将checkPointDir更换一个目录,或者将原来checkPointDir目录中的数据全部清掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

erainm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值