非hbase解决方案,用于存储大量数据和实时更新

kqlmhetl  于 2021-06-09  发布在  Hbase
关注(0)|答案(2)|浏览(405)

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

f45qwnt8

f45qwnt81#

有效使用hbase的关键是设计。有了一个好的设计,你永远不必做全扫描。这不是hbase的用途。相反,您可以使用filter进行扫描—hbase是为高效处理而构建的。
我现在不能检查你的设计,但我想你可能不得不检查。
这样做的目的不是像设计rdbms表那样设计hbase表,关键是设计一个好的rowkey。如果你的rowkey是良好的建设,你不应该做一个完整的扫描。
如果您想使用除row key以外的其他列访问表,您可能还需要使用类似apachephoenix的项目。它的表现也很好。我在Phoenix城有很好的经验。

ecfdbz9o

ecfdbz9o2#

我会回答我的问题。我的问题是我不想在hbase上执行全表扫描,因为它会影响区域服务器的性能,特别是在共享集群上,它会影响hbase的读写性能。
所以我的解决方案使用hbase,因为它非常适合于更新,特别是delta更新,也就是列更新。
所以为了避免全表扫描,需要将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表的扫描,并且不会影响区域服务器。

相关问题