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

时间:2017-05-20 09:41:48

标签: hive mapreduce hbase hadoop2 spark-avro

您好我开发了一个应用程序,我必须首次存储数据TB,然后每月增加20 GB,如xml形式的插入/更新/删除,将应用于此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将如何支持记录级更新。

2 个答案:

答案 0 :(得分:0)

我会回答我的问题。 我的问题是我不想在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快照上进行朗姆酒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表上的扫描,并且对区域服务器也没有影响。

答案 1 :(得分:-1)

有效使用HBase的关键是DESIGN。凭借良好的设计,您将永远无需进行全面扫描。这不是HBase的用途。相反,你本可以使用Filter进行扫描 - 为了有效地处理HBase而构建了一些东西。

我现在无法检查你的设计,但我认为你可能不得不这样做。

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

如果要使用除行键以外的其他列访问表,您可能还希望使用Apache Phoenix之类的项目。它也表现良好。我和凤凰城有很好的经历。