嗨,我已经开发了一个应用程序,我必须第一次存储 TB 数据,然后以 xml 的形式每月存储 20 GB 增量,例如插入/更新/删除,这将应用于这 5 TB 数据之上。最后,根据请求,我必须生成所有数据的完整快照并根据逻辑创建 5K 文本文件,以便相应的数据应位于相应的文件中。
我已经使用 HBase 完成了这个项目。我在 HBase 中创建了 35 个表,区域从 10 到 500 。我在我的 HDFS 中有我的数据,并使用 mapreduce 将数据批量加载到接受 Hbase 表中。
之后,我用 Java 编写了 SAX 解析器应用程序来解析所有传入的 xml 增量文件并更新 HBase 表。xml 文件的频率约为每分钟 10 个 xml 文件,总共更新 2000 次。增量消息严格按顺序排列。
最后根据请求,我运行我的最后一个 mapreduce 应用程序来扫描所有 Hbase 表并创建 5K 文本文件并将其交付给客户端。
所有 3 个步骤都运行良好,但是当我在共享集群的生产服务器上部署我的应用程序时,基础架构团队不允许我们运行我的应用程序,因为我在 HBase 上进行全表扫描。
我使用了 94 个节点的集群,我拥有的最大的 HBase 表数据约为 20 亿。所有其他表的数据都少于一百万。
mapreduce 扫描和创建文本文件的总时间需要 2 小时。
现在我正在寻找其他一些解决方案来实现这一点。
我可以使用 HIVE,因为我也有记录级别的插入/更新,并以非常精确的方式删除它。
我还集成了 HBase 和 HIVE 表,因此对于增量数据,将使用 HBase 表,而对于全表扫描,将使用 HIVE。但是由于 HIVE 使用 Hbase 存储处理程序,我无法在 HIVE 表中创建分区,这就是为什么 HIVE 全表扫描变得非常非常慢甚至比 HBase 全表扫描慢 10 倍的原因
我现在想不出任何解决方案。请帮助我解决不涉及 HBase 的其他解决方案。
我可以在这个用例中使用 AVRO 或 perquet 文件吗?但我不确定 AVRO 将如何支持记录级别更新。