我有一个技术堆栈,其中 Hadoop 作为原始数据的分布式存储,HBase 作为在 Hadoop 和 HDFS 之上运行的 NoSQL 数据库,Hive 作为 Hive 之上的 RDBMS 数据仓库,用于在非结构化上应用结构(表)数据、Spark 作为 Hive 上的内存批处理和执行引擎,以及 Spark SQL 用于运行查询。
当我从 Kafka 读取消息时,可能会有 upsert 操作。
如何使用此堆栈更好地从 Kafka 读取消息和数据?
这意味着我应该在哪一层(hdfs、hbase、hive)插入输入消息,以便在考虑所有层的 ACID 原则的情况下在 Spark 上进行更新的批处理?
我认为,您应该将数据从Kafka插入到Hbase中。 HBase 是 NoSQL,具有非常快的读/写速度,您可以利用它来实现高吞吐量的 Kafka Streams。 HBase 也可以非常高效地处理更新插入。
我排除了 HDFS,因为它不适合更新插入,而 Hive 则不适合 OLTP 类型查询和更新插入。
因此,您可以先将数据摄取到HBase中。然后您可以使用 Apache Spark 处理 HBase 中的数据。 Spark 可以通过 HBase-Spark 连接器与 HBase 配合使用。处理数据后,您可以将结果移至 Hive 中进行进一步分析或使用 Spark SQL 查询。
需要注意的是,虽然 HBase 确实提供了一定程度的 ACID 合规性,但它并不像传统 RDBMS 那样完全符合 ACID 合规性。它仅在行级别提供强一致性保证。