嗨,我开发了一个应用程序,在这个应用程序中,我必须第一次存储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如何支持记录级更新。
2条答案
按热度按时间f45qwnt81#
有效使用hbase的关键是设计。有了一个好的设计,你永远不必做全扫描。这不是hbase的用途。相反,您可以使用filter进行扫描—hbase是为高效处理而构建的。
我现在不能检查你的设计,但我想你可能不得不检查。
这样做的目的不是像设计rdbms表那样设计hbase表,关键是设计一个好的rowkey。如果你的rowkey是良好的建设,你不应该做一个完整的扫描。
如果您想使用除row key以外的其他列访问表,您可能还需要使用类似apachephoenix的项目。它的表现也很好。我在Phoenix城有很好的经验。
ecfdbz9o2#
我会回答我的问题。我的问题是我不想在hbase上执行全表扫描,因为它会影响区域服务器的性能,特别是在共享集群上,它会影响hbase的读写性能。
所以我的解决方案使用hbase,因为它非常适合于更新,特别是delta更新,也就是列更新。
所以为了避免全表扫描,需要将hbase表的快照导出到hdfs中,然后在hbase表快照上运行全表扫描。
下面是这个过程的详细步骤
创建快照
将快照导出到本地hdfs
hbase快照上rum mapreduce的驱动程序作业配置
另外,在hbase快照上运行mapreduce将跳过对hbase表的扫描,并且不会影响区域服务器。