用于存储大量数据并实时更新的非 HBase 解决方案

Non HBase solution for storing Huge data and updating on real time

你好,我开发了一个应用程序,我必须第一次存储 TB 的数据,然后每月增量存储 20 GB,如 insert/update/delete 形式的 xml 将应用于顶部这 5 TB 的数据。 最后根据要求,我必须生成所有数据的完整快照并根据逻辑创建 5K 文本文件,以便相应的数据应该在相应的文件中。

我已经使用 HBase 完成了这个项目。 我在区域从 10 到 500 的 HBase 中创建了 35 tables。 我的数据在我的 HDFS 中,使用 mapreduce 我将数据批量加载到接受 Hbase tables .

之后,我用 java 编写了 SAX 解析器应用程序来解析所有传入的 xml 增量文件并更新 HBase tables。xml 文件的频率每分钟大约 10 xml 个文件,总共 2000 次更新。 增量消息严格按顺序.

最后根据要求我 运行 我最后一个 mapreduce 应用程序扫描所有 Hbase table 并创建 5K 文本文件并将其交付给客户端。

所有 3 个步骤都运行良好,但是当我将我的应用程序部署到共享集群的生产服务器上时,基础架构团队不允许我们 运行 我的应用程序,因为我做了完整的 table 在 HBase 上扫描。

我使用了 94 个节点的集群,我拥有的最大 HBase table 数据约为 20 亿。所有其他 table 的数据不到一百万。

mapreduce 扫描和创建文本文件的总时间需要 2 小时。

现在我正在寻找其他解决方案来实现这个。

我可以使用 HIVE,因为我有记录级别 insert/update 并且也以非常精确的方式删除了它。

我还集成了 HBase 和 HIVE table,因此增量数据将使用 HBase table,而完整 table 扫描将使用 HIVE。 但是由于 HIVE 使用 Hbase 存储处理程序,我无法在 HIVE table 中创建分区,这就是为什么 HIVE 完整 table 扫描变得非常非常慢,甚至比 HBase 完整 table 扫描 [=10] 慢 10 倍=]

我现在想不出任何解决方案有点卡住了。 请帮我解决一些不涉及 HBase 的其他解决方案。

我可以在这个用例中使用 AVRO 或 perquet 文件吗?但我不确定 AVRO 将如何支持记录级别更新。

高效使用HBase的关键在于设计。有了好的设计,您将永远不必进行全面扫描。这不是 HBase 的目的。相反,您可能一直在使用 Filter 进行扫描 - HBase 是为高效处理而构建的。

我现在无法检查您的设计,但我想您可能不得不检查一下。

我们的想法不是像 RDBMS table 那样设计 HBase table,关键是设计一个好的 rowkey。如果你的 rowKey 构建得很好,你永远不应该进行全面扫描。

如果您想使用除行键以外的其他列来访问您,您可能还想使用像 Apache Phoenix 这样的项目。它也表现良好。我对 Phoenix 有很好的体验。

我会回答我的问题。 我的问题是我不想在 Hbase 上执行完整 table 扫描,因为它会影响区域服务器的性能,特别是在共享集群上,它会影响 HBase 的读取性能。

所以我的解决方案使用 Hbase,因为它非常适合更新,特别是增量更新,即列更新。

因此,为了避免完全 table 扫描拍摄 HBase 的快照 table 将其导出到 HDFS,然后他们 运行 完全 table 扫描 Hbase table快照。

这是该过程的详细步骤

创建快照

snapshot 'FundamentalAnalytic','FundamentalAnalyticSnapshot'

将快照导出到本地 hdfs

hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot FundamentalAnalyticSnapshot -copy-to /tmp -mappers 16

Hbase 快照上 rum mapreduce 的驱动程序作业配置

String snapshotName="FundamentalAnalyticSnapshot";
Path restoreDir = new Path("hdfs://quickstart.cloudera:8020/tmp");
String  hbaseRootDir =  "hdfs://quickstart.cloudera:8020/hbase";



 TableMapReduceUtil.initTableSnapshotMapperJob(snapshotName, // Snapshot name
                        scan, // Scan instance to control CF and attribute selection
                        DefaultMapper.class, // mapper class
                        NullWritable.class, // mapper output key
                        Text.class, // mapper output value
                        job,
                        true,
                        restoreDir);

另外 运行Hbase 快照上的 mapreduce 将跳过 Hbase 上的扫描 table 并且也不会对区域服务器产生影响。