2

嗨,我已经开发了一个应用程序,我必须第一次存储 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 将如何支持记录级别更新。

4

2 回答 2

2

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

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

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

这是该过程的详细步骤

创建快照

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 表的扫描,并且对区域服务器也没有影响。

于 2017-06-05T06:04:27.333 回答
-1

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

我现在无法检查您的设计,但我认为您可能必须这样做。

我们的想法不是像拥有 RDBMS 表那样设计 HBase 表,关键是设计一个好的行键。如果您的 rowKey 构建良好,则永远不应该进行完整扫描。

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

于 2017-05-21T02:36:56.227 回答