2013-07-31 99 views
1

我最近从rdbms切换到Hbase以处理数百万条记录。但作为新手,我不确定什么是设计Hbase方案的有效方式。实际上,场景是我有文本文件,其中有数百,数千和数百万条记录,我必须读取并存储到Hbase中。所以,有两组文本文件(RawData文件,标签文件)相互链接,因为它们属于同一用户,对于这些文件,我制作了两个单独的表格(RawData和Label),我将它们的信息存储在那里。所以RAWDATA文件和RAWDATA表是这样的:Hbase Scheme设计 - 最佳实践

enter image description here enter image description here

所以,你可以在我的RAWDATA表见我行键实际上是文本文件(01-01-全数据的文件名.txt)和每行文本文件的行号。列族只是随机的'r',列限定符是文本文件的列,值是列的值。这是我如何在我的表中插入记录,我有第三个表(MapFile),其中我将textfile的名称存储为用户的行关键用户标识,作为列限定符和文本文件的记录总数,如下所示:

  01-01-All-Data.txt  column=m:1, timestamp=1375189274467, value=146209 

我将使用映射文件表,以读取行RAWDATA表行..

你怎么看待这种HBase的架构有何建议?这是一种正确的方式吗?或者它在Hbase概念中没有意义?

此外,值得一提的是,在Hbase中插入21个带有146207行的21 MB文件需要大约3分钟。

请教。

感谢

+0

检查了这一点: http://java.dzone.com/videos/hbase-schema-design-things-you 它会帮助你正确选择你的模式 – Udy

+0

@Udy提到的视频的更新链接:https://www.youtube.com/watch?v=_HLoH_PgrLk –

回答

4

虽然我没有发现任何问题与您当前的模式,这是适当与否只能分析您的使用情况,并频繁访问模式后决定。恕我直言,正确并不总是合适的。由于我对这一切都不了解,所以我的建议可能听起来不正确。请让我知道如果是这样的话。我会相应地更新答案。在这里,我们走了,

是否有意义(保持你的数据,并考虑访问模式),以有3次的家庭只有一个表:

  • RD - 对于RAWDATA文件,将所有的这个文件
  • LF列 - 对于该文件的所有列标签文件,并
  • MF - 对于有你的文本文件的记录,一列数保持映射文件。

使用userid作为rowkey。它将是独一无二的,看起来不长。采用这种设计,您可以绕过从一个表到另一个表的分流开销,同时获取数据。

很少有更多的建议:

  • 如果用户ID是单调递增然后哈希你rowkeys,这样你就不会从RegionServer的Hotspotting受到影响。
  • 您也可以创建预分割表以获得更好的分布。
  • 尽可能缩短列名称。
  • 保持尽可能低的版本号。

此外,值得一提的是,在Hbase中插入21个带有146207行的21 MB文件需要大约3分钟。

您如何插入数据?MapReduce或普通Java + HBAse API?您的群集大小是多少?配置和规格?

您可能会发现这些链接有用:

HTH

+0

谢谢@Tariq。是的,将它们与单列表合并成3列系列是有意义的。然而,对于RD表和LB表,我使用的文本文件名和rownumber为文本文件作为我的rowkey,即01-01-All-Data.txt:0,01-01-All-Data.txt:1 ..等等。 ,我无法使用UserID作为行键bcoz,每个用户可以有多个文本文件。我还想提一下,RD和LF文件是相互关联的,但不是他们文件的记录。我目前使用我的本地机器和Java + HBase API在HBase中插入数据,我还没有在服务器上检查过它。 – user2304819

+1

将rowkeys看作** userid + filename + rownumber **看起来是否合理? – Tariq

+0

再次感谢@Tariq。是的,你是对的我可以按照这种模式为rowkeys,使他们更独特。感谢您的所有建议。我会标记你的答案是正确的。 – user2304819