【问题标题】:Efficient search in nested HBase entities嵌套 HBase 实体中的高效搜索
【发布时间】:2014-09-23 18:45:21
【问题描述】:

如果我遵循Ian Varley's HBase design practice 并将一堆嵌套实体存储在同一个 HBase 实体中(以受益于 HBase 的单行 ACID 属性),是否可以有效地搜索这些嵌套实体,甚至 MapReduce 来决定使用是否选择封装(父)实体的某些标准?

例如,我有一个客户实体,其中嵌套了订单实体

CustomerInfo 和 Orders 是列族。 对于订单列族(这里很有趣),1, 2 ... 6 是列名(在 HBase 中是动态的,可以动态添加),旁边的文本是订单实体详细信息(我将这些细节序列化为文本,但序列化无关紧要,因为 HBase 不关心)

如果我有很多(更多详情见下文,见 3.)类似此客户实体的实体

  1. 是否可以基于 MapReduce(仅限地图?)方法或任何其他扫描客户实体、读取这些客户实体内的客户订单值并仅返回包含以下内容的客户实体的有效方法来选择客户实体具有特定标准(例如成本 > 40)的订单?

  2. 同样,是否可以将符合指定条件(Cost > 40)的订单实体与客户实体一起返回以显示客户及其最昂贵的订单?

  3. 如果每个客户的订单数量非常大(最多 100,000 个)并且客户数量也很大(最多 100,000 个),是否可以相当快地进行此选择操作(不到一秒?)?假设我可以为此构建一个非常大的 HBase 集群(根据需要)。

  4. 1234563快速地)?将客户实体反规范化为包含客户信息的订单实体会是更好的方法吗?

【问题讨论】:

    标签: hadoop mapreduce hbase


    【解决方案1】:
    1. 是否可以根据 MapReduce 选择客户实体 (仅限地图?)方法或任何其他有效的扫描方法 客户实体,读取其中的客户订单值 客户实体并仅返回那些客户实体 包含具有特定标准(例如成本 > 40)的订单?
    2. 类似地,是否可以返回订单实体 与客户一起匹配指定的标准(成本 > 40) 实体来展示客户及其最昂贵的订单?

    当然可以基于 MapReduce 方法选择实体,因为地图可以处理 rowkey 中的所有数据,然后您可以解析数据,过滤您需要的内容,并只写入您需要的数据。

    1. 是否可以相当快地进行此选择操作(小于 一秒钟?)如果每个客户的订单数量非常大(最多 100,000)并且客户数量也很大(最多100,000)? 假设我可以构建一个非常大的 HBase 集群(如 需要)。

    我不认为 MapReduce 是为动态处理而设计的,因为它更适合批处理。你可以尝试使用spark。

    1. 因为我相信 3) 是不可能的(作为单个 MapReduce worker 必须处理这 100,000 个序列化订单), 对于这个问题有什么更好的设计(选择 客户根据他们的订单属性快速)?将 将客户实体反规范化为订单实体,其中包括 客户信息是更好的方法吗?

    您可以更改设计以使用 HBase 扫描程序及其过滤器。而不是
    1:"ItemA;Cost:$12"
    你可以试试
    1-ItemA:"12"
    或
    ItemA-1:"12"
    或者可能将值存储在整数字节而不是字符串中,这样您就可以使用带有value filter 的扫描来根据您的需要过滤返回的结果

    或者您可以尝试多层架构,其中有数据表进行处理,聚合表进行实时访问

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-23
      • 1970-01-01
      • 2021-12-17
      • 2012-04-19
      相关资源
      最近更新 更多