如何设计hbase表

如何设计hbase表,hbase,Hbase,我计划为JSON数据设计Hbase表 由于我不太了解Hbase的概念,我想知道为下面提到的JSON类型设计表的最佳方法是什么 虚线是Json数据中的逻辑划分: 这意味着记录有一个行键,即uid,然后有粗体的请求部分,斜体的响应部分和分类。在分类下有一个类似数组的结构。 我正在考虑为每个逻辑组创建3个列族。但如何将类似数组的结构(“问题原因”)存储到HBASE表中。除了二进制之外,hbase是否有任何特定的数据类型 { "uid": "abc2342", -------------

我计划为JSON数据设计Hbase表

由于我不太了解Hbase的概念,我想知道为下面提到的JSON类型设计表的最佳方法是什么

虚线是Json数据中的逻辑划分: 这意味着记录有一个行键,即uid,然后有粗体的请求部分,斜体的响应部分和分类。在分类下有一个类似数组的结构。 我正在考虑为每个逻辑组创建3个列族。但如何将类似数组的结构(“问题原因”)存储到HBASE表中。除了二进制之外,hbase是否有任何特定的数据类型

{
        "uid": "abc2342",
-----------------------------------

        "req1": sometext,
        "res1": sometext,
        "matter": "point1",
        "body": "point2",
-------------------------------------
        "response": null,
                "validity": null
---------------------------------------

    "classification": "Problems",
        "Problem reasons": [
            "Address Not found",
            "Invalid Phone Number",
            "Invalid Email"
        ]
    },

HBase只有二进制文件。您必须自己对数据进行序列化和反序列化。该类可以在这方面帮助您(例如
Bytes.toBytes((short)5)
)。对于数组,您必须考虑如何计划查询它,从而找出最适合您的格式。存储字符串数组的一种简单方法是使用字符串本身不允许的分隔符将它们连接起来。您也可以将其作为JSON转储

另一个重要的考虑因素是你的工作。通常,您希望有一个统一的随机密钥,这样您就不会得到可能降低性能的热点。一个简单的方法是散列字符串键并使用散列的字节

用于:

实际上,所有列族成员都存储在文件系统中。由于调整和存储规范是在柱族级别完成的,因此建议所有柱族成员具有相同的一般访问模式和大小特征

IBM有一些经验法则:

HBase表由列族组成,列族是列的逻辑和物理分组。一个族中的列与另一个族中的列分开存储。如果有不经常查询的数据,请将该数据指定给单独的列族

每行的列族和列限定符名称都是重复的。因此,请尽量缩短名称,以减少HBase存储和读取的数据量。例如,使用f:q而不是mycolumnfamily:mycolumnqualifier

由于柱族存储在单独的HFiles中,因此应尽可能减少柱族的数量。您还希望减少列族的数量,以减少MemStore刷新的频率和压缩的频率。而且,通过使用尽可能少的列族,可以缩短加载时间并减少磁盘消耗


HBase只有二进制文件。您必须自己对数据进行序列化和反序列化。该类可以在这方面帮助您(例如
Bytes.toBytes((short)5)
)。对于数组,您必须考虑如何计划查询它,从而找出最适合您的格式。存储字符串数组的一种简单方法是使用字符串本身不允许的分隔符将它们连接起来。您也可以将其作为JSON转储

另一个重要的考虑因素是你的工作。通常,您希望有一个统一的随机密钥,这样您就不会得到可能降低性能的热点。一个简单的方法是散列字符串键并使用散列的字节

用于:

实际上,所有列族成员都存储在文件系统中。由于调整和存储规范是在柱族级别完成的,因此建议所有柱族成员具有相同的一般访问模式和大小特征

IBM有一些经验法则:

HBase表由列族组成,列族是列的逻辑和物理分组。一个族中的列与另一个族中的列分开存储。如果有不经常查询的数据,请将该数据指定给单独的列族

每行的列族和列限定符名称都是重复的。因此,请尽量缩短名称,以减少HBase存储和读取的数据量。例如,使用f:q而不是mycolumnfamily:mycolumnqualifier

由于柱族存储在单独的HFiles中,因此应尽可能减少柱族的数量。您还希望减少列族的数量,以减少MemStore刷新的频率和压缩的频率。而且,通过使用尽可能少的列族,可以缩短加载时间并减少磁盘消耗


我假设您的结构是每个用户都有一个请求、一个响应和几个问题

如果是这样,只需将UID设置为rowkey。行键设计是HBase模式设计中最重要的部分。这是因为HBase基于行键对数据进行切分,并控制您查找数据的方式。为了避免热插销,您可能希望在密钥前面预先添加UID哈希。例如,您可以使密钥看起来像这样
hash(UID):UID
f97h23:user123

现在进入下一个问题。HBase只存储字节。它不关心这些字节是什么。由您的程序来了解存储的字节的含义。除了计数器,HBase不知道数据类型,但我们将忽略这些数据类型

这个表看起来相当简单,所以我将把其余的JSON字段分别放在一列中。对于数组,我在列中做了类似于分隔列表的操作,即
找不到地址、无效电话号码、无效电子邮件
。无论何时使用这样的方案,都要确保在数据中使用非法的定界字符,或者使用转义方案

在大多数情况下,我认为没有理由使用单独的柱族。似乎每行有少量数据,并且没有提到不同的访问模式,这让我假设在查询UID时,您通常只获取每个字段。如果这是真的