为啥 Spark Streaming 将每条 Kafka 消息保存为单个文件?

Posted

技术标签:

【中文标题】为啥 Spark Streaming 将每条 Kafka 消息保存为单个文件?【英文标题】:Why does Spark Streaming save each Kafka message as a single file?为什么 Spark Streaming 将每条 Kafka 消息保存为单个文件? 【发布时间】:2015-04-19 13:58:46 【问题描述】:

我已将 Spark Streaming 配置为从 Kafka 接收数据,遵循 Kafka Integration Guide。

我将 Spark Streaming 的持续时间配置为 20 秒,并尝试将每 20 秒收到的消息保存到 HDFS,使用 DStream 方法saveAsTextFile

我成功运行了应用程序,它成功地从 Kafka 接收数据并每 20 秒将消息保存到 HDFS。但我对输出布局感到困惑。每隔20秒就会创建一个带有saveAsTextFile参数指定前缀的目录,其中包含一些带有前缀“part-”的输出文件,例如“part-00001”

但是,每个输出文件中只有一个消息内容。似乎 Kafka DStream 将收到的每条消息保存到 HDFS 中的单个输出文件中。我期待将多条消息保存到一个输出文件中。

顺便说一句,我正在使用 Spark Standalone 部署并且只有一名工作人员

【问题讨论】:

您能否添加代码来重现您所面临的问题? 【参考方案1】:

不,这肯定不是它的工作原理;那太疯狂了。每个批处理间隔创建一个目录。内容是part-* 文件,其中包含在该时间间隔内发送的所有 消息。每个流式任务创建一个文件,基本上就是流式 RDD 的分区数。

【讨论】:

是的,每个流式传输任务创建一个文件。我检查了 web-ui,发现 saveAsTextFile 阶段是通过多个任务执行的。似乎 spark 将阶段拆分为在多个线程中运行的多个任务。正是配置的持续时间和消息速率使得看起来每条消息都创建一个文件。无论如何,谢谢 Sean,我根据您的提示解决了这个问题,即每个流式任务创建一个文件。【参考方案2】: 在调用saveAsTextFile 方法之前

重新分区 rdd 为1。您将获得单个输出文件。顺便说一句,它会增加更多的计算开销!!

【讨论】:

以上是关于为啥 Spark Streaming 将每条 Kafka 消息保存为单个文件?的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我发送两个输入流时 Spark Streaming 停止工作?

为啥由于 java.lang.OutOfMemoryError,Spark Streaming 在字符串解码时失败?

SparkStreaming wordcount demo

SparkStreaming wordcount demo

Structured-Streaming之窗口操作

Spark Streaming源码解读之JobScheduler详解