Hive 用于存储海量数据和实时更新的非HBase解决方案

Hive 用于存储海量数据和实时更新的非HBase解决方案,hive,mapreduce,hbase,hadoop2,spark-avro,Hive,Mapreduce,Hbase,Hadoop2,Spark Avro,您好,我开发了一个应用程序,在这个应用程序中,我必须第一次存储TB的数据,然后每月以xml的形式增量存储20 GB的数据,如插入/更新/删除,这些数据将应用于这5 TB的数据之上。 最后,根据请求,我必须生成所有数据的完整快照,并根据逻辑创建5K文本文件,以便各个数据应位于各个文件中 我用HBase完成了这个项目。 我在HBase中创建了35个表,区域从10到500。 我将数据保存在HDFS中,并使用mapreduce将数据批量加载到可接收的Hbase表中 之后,我用java编写了SAX解析器应

您好,我开发了一个应用程序,在这个应用程序中,我必须第一次存储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文本文件并将其交付给客户端

这三个步骤都很好,但当我在共享集群的生产服务器上部署应用程序时,基础架构团队不允许我们运行我的应用程序,因为我在HBase上执行完整表扫描

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

mapreduce扫描和创建文本文件的总时间为2小时

现在我正在寻找其他解决方案来实现这一点

我可以使用HIVE,因为我有记录级别的插入/更新,并以非常精确的方式删除它们

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

我现在想不出任何解决办法,有点卡住了。 请帮助我找到其他不涉及HBase的解决方案


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

高效使用HBase的关键是设计。有了一个好的设计,你将永远不必做全扫描。这不是HBase的用途。相反,您可以使用过滤器进行扫描—HBase是为高效处理而构建的

我现在不能检查你的设计,但我想你可能不得不检查

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


如果希望使用行键以外的其他列访问表,您可能还希望使用类似ApachePhoenix的项目。它的表现也很好。我在凤凰城有很好的经验。

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

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

因此,为了避免全表扫描,请将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表的扫描,并且不会对区域服务器造成影响。

我没有性能问题。我尝试了20亿条数据大小为400 GB的记录,获得了良好的性能,我的工作在12分钟内完成。但我担心的是,完整表扫描会影响群集如果我的应用程序部署在共享集群上,性能会有什么影响?当然,完整的表扫描会影响性能。您希望尝试重新设计行键,然后使用筛选器。或者部署Apache Phoenix,然后像访问RDBMS中的任何表一样访问HBase表。快照MR作业需要HDFS上的HBase权限—您是如何解决的?