使用 spark 在 hive 中存储流数据

luc*_*ucy 5 hadoop hive scala apache-spark spark-streaming

我正在创建一个应用程序,其中获取进入 kafka 然后进入 spark 的流数据。消费数据,应用一些登录,然后将处理过的数据保存到配置单元中。数据速度非常快。我在 1 分钟内获得了 50K 条记录。火花流中有 1 分钟的窗口,它在其中处理数据并将数据保存在配置单元中。

我的问题是生产前瞻性架构好吗?如果是,我如何将流数据保存到配置单元中。我正在做的是,创建 1 分钟窗口数据的数据框,并使用

results.write.mode(org.apache.spark.sql.SaveMode.Append).insertInto("stocks")
Run Code Online (Sandbox Code Playgroud)

我还没有创建管道。可以吗,还是我必须修改架构?

谢谢

小智 7

我会试一试的!

但是 kafka->spark->hive 不是您用例的最佳管道。

  1. hive 通常基于 hdfs,它不是为少量插入/更新/选择而设计的。因此,您的计划最终可能会遇到以下问题:
    • 许多以性能不佳而告终的小文件
    • 你的窗口变小,因为它需要很长时间

建议:

选项 1: - 将 kafka 用作缓冲区队列并设计您的管道,例如 - kafka->hdfs(例如使用 spark 或水槽)->batch spark to hive/impala table

选项 2:

  • kafka->flume/spark 到 hbase/kudu->batch spark 到 hive/impala

选项 1 没有“实时”分析选项。这取决于您运行批处理 spark 的频率

option2 是我推荐的一个不错的选择,在 hbase 中存储 30 天,在 hive/impala 中存储所有较旧的数据。通过视图,您将能够连接新旧数据以进行实时分析。Kudu 使架构变得更加容易。

如果您喜欢对数据进行分区并通过 HIVEsql 使用它,那么将数据保存到 hive 表中可能会很棘手。

但基本上它会像下面这样工作:

xml.write.format("parquet").mode("append").saveAsTable("test_ereignis_archiv")
Run Code Online (Sandbox Code Playgroud)

BR