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