实时进行 Hive 数据转换?



我有以下数据管道:

  1. 进程将消息写入 Kafka
  2. Spark 结构化流应用程序正在侦听新的 Kafka 消息,并按原样将它们写入 HDFS
  3. 批处理 Hive 作业每小时运行一次,并从 HDFS 读取新摄取的消息,并通过一些中等复杂的 INSERT INTO 语句填充一些表(我没有可用的物化视图(。编辑:基本上在我的Hive作业之后,我的结果是Table1存储原始数据,然后是另一个表Table2 = fun1(Table1(,然后Table3 = fun2(Table2(,然后Table4 = join(Table2,Table3(等。 乐趣是一种选择或聚合。
  4. Tableau 仪表板可视化了我编写的数据。

如您所见,步骤 3 使我的管道不是实时的。 您能给我什么建议,以使我的管道完全实时?编辑:我想要表1,...表N实时更新!

  • 根本不建议将 Hive 与 Spark Streaming 一起使用。由于 Spark 流式传输的目的是具有低延迟。Hive 引入了可能的最高延迟 (OLAP(,因为它在后端执行 MR/Tez 作业(取决于 hive.execution.engine(。

建议:将 Spark 流式处理与低延迟数据库(如 HBASE、Phoenix(一起使用。

解决方案:开发一个以 Kafka 为源的 Spark 流式处理作业,并使用自定义接收器将数据写入 HBase/Phoenix。

引入HDFS显然不是实时的。MemSQL或Druid/Mersive提供了从Kafka获取更多的实时。

您需要历史数据来执行汇总和聚合。Tableau 可能会缓存数据集,但不会永久存储自身。因此,您需要一些存储,并且选择使用HDFS而不是数据库。

注意:Hive/Presto可以直接从Kafka读取。因此,你甚至不需要Spark。

如果你想从 Kafka 进行滚动聚合并使其可查询,可以改用 KSQL,或者你可以编写自己的 Kafka Streams 解决方案