有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Hbase方案设计最佳实践

我最近从rdbms转向Hbase,以处理数百万条记录。。但作为一名新手,我不确定设计Hbase方案的有效方法是什么。事实上,情况是我有文本文件,其中有成百上千万条记录,我必须读取并存储到Hbase中。因此,有两组文本文件(RawData文件、标签文件)彼此链接,因为它们属于同一个用户,对于这些文件,我制作了两个单独的表(RawData和标签),并将它们的信息存储在那里。所以RawData文件和RawData表如下所示:

enter image description here enter image description here

所以你可以在我的RawData表中看到,我有一个row key,它实际上是文本文件(01-01-All-Data.txt)的文件名,带有文本文件每行的行号。列族只是随机的“r”,列限定符是文本文件的列,值是列的值。这就是我在表中插入记录的方式,我有第三个表(MapFile),其中我将textfile的名称作为行键用户id存储为列限定符,将textfile的记录总数存储为值,如下所示:

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

我将使用Mapfile表格逐行读取RawData表格

你对这种Hbase模式有什么建议?这样合适吗?或者它在Hbase概念中没有意义

此外,值得一提的是,在Hbase中插入21Mbs、146207行的文件大约需要3分钟

请给出建议

谢谢


共 (1) 个答案

  1. # 1 楼答案

    虽然我没有发现您当前的模式有任何错误,但是只有在分析您的用例和频繁访问模式之后才能决定它是否合适。正确并不总是合适的,伊姆霍。因为我对这一切一无所知,所以我的建议听起来可能不正确。如果是这样,请告诉我。我会相应地更新答案。好了

    只有一个包含3列族的表(记住数据和访问模式)有意义吗

    • RD-用于包含该文件所有列的RawData文件
    • LF-对于包含此文件所有列的标签文件,以及
    • MF-用于MapFile,其中一列包含文本文件的多条记录

    将用户ID用作行键。它将是独一无二的,看起来不会太长。通过这种设计,您可以绕过在获取数据时从一个表转移到另一个表的开销

    还有几点建议:

    • 如果用户ID是单调递增的,那么散列您的行键,这样您就不会受到区域服务器热点的影响
    • 您还可以创建预先拆分的表,以获得更好的分布
    • 尽可能缩短列名
    • 将版本数保持在尽可能低的水平

    此外,值得一提的是,在Hbase中插入21Mbs、146207行的文件大约需要3分钟

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

    您可能会发现以下链接很有用: