繁体   English   中英

Spark Streaming to Hive,每个分区的小文件太多

[英]Spark Streaming to Hive, too many small files per partition

我有一个批处理间隔为 2 分钟(可配置)的火花流作业。
此作业从 Kafka 主题读取并创建数据集并在其上应用架构并将这些记录插入到 Hive 表中。

Spark 作业在 Hive 分区中的每个批处理间隔创建一个文件,如下所示:

dataset.coalesce(1).write().mode(SaveMode.Append).insertInto(targetEntityName);

现在传入的数据不是那么大,如果我将批处理持续时间增加到 10 分钟左右,那么即使我最终也可能只得到 2-3mb 的数据,这远小于块大小。

这是 Spark Streaming 中的预期行为。
我正在寻找有效的方法来进行后期处理以合并所有这些小文件并创建一个大文件。
如果有人以前做过,请分享您的想法。

我鼓励您不要使用 Spark 将数据从 Kafka 流式传输到 HDFS。

Confluent 的Kafka Connect HDFS插件(或 LinkedIn 的 Apache Gobblin)就是为了这个目的而存在的。 两者都提供 Hive 集成。

这个 Github 问题中找到我关于压缩小文件的评论

如果您需要编写 Spark 代码来将 Kafka 数据处理成模式,那么您仍然可以这样做,并以(最好)Avro 格式写入另一个主题,Hive 可以在没有预定义表模式的情况下轻松读取

我个人编写了一个“压缩”过程,它实际上从 Hive 表中抓取了一堆每小时 Avro 数据分区,然后转换为每日 Parquet 分区表以进行分析。 到目前为止,它一直工作得很好。

如果您想在记录到达 HDFS 之前对其进行批处理,那么 Kafka Connect 或 Apache Nifi(在链接中提到)可以提供帮助,因为您有足够的内存来存储记录,然后再将它们刷新到 HDFS

我和你的情况完全一样。 我通过以下方式解决了它:

假设您的新数据存储在数据集中:dataset1

1- 用一个好的分区键对表进行分区,就我而言,我发现我可以使用键组合进行分区,每个分区大约有 100MB。

2- 使用 spark core 保存而不使用 spark sql:

a- 当您想保存时,将整个分区加载到您的内存中(在数据集内:dataset2)

b- 然后应用数据集联合函数: dataset3 = dataset1.union(dataset2)

c- 确保按照您的意愿对结果数据集进行分区,例如: dataset3.repartition(1)

d - 以“覆盖”模式保存结果数据集以替换现有文件

如果您需要有关任何步骤的更多详细信息,请联系。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM