在 HBase 中存储嵌套的 HashMap

Posted

技术标签:

【中文标题】在 HBase 中存储嵌套的 HashMap【英文标题】:Storing Nested HashMap in HBase 【发布时间】:2016-09-28 17:38:12 【问题描述】:

请原谅我的无知,但我对 HBase 比较陌生,似乎无法弄清楚。我想在 HBase 中存储以下嵌套的 HashMap:

Map<String, Map<String, Map<String, Double>>> 

我似乎无法弄清楚 HBase 表的架构。

Row Index 显然是最外层 Map 中的字符串值。但是,我不认为 HBase 允许嵌套列族(尽管它确实允许每个列族有任意数量的列)

同样从here 的回答中我发现嵌套实体在 HBase 中不能有嵌套实体。

让您了解数据大小:

    最里面的 Map (Map&lt;String, Double&gt;) 将只有 3 个键。 中间的地图 (Map&lt;String, Map&lt;String, Double&gt;&gt;) 将有 100 把钥匙。 最外层地图 (Map&lt;String, Map&lt;String, Map&lt;String, Double&gt;&gt;&gt;) 可能有大约 20-3000 万个密钥。

感谢任何帮助。

编辑 1: 基本上,我要存储的数量是针对特定 productId 的,即从特定仓库在本地、区域或国家层面销售了多少数量。

productId 是最外层 Map 的键。 warehouseID 是中间 Map 的键。 local/zonal/national 是最里面地图的关键。

编辑 2: 数据将在映射作业中填充和读取。基本上,对于每个产品 id,warehouseId x (Local/Zonal/National : 我们暂时称它为 saleType) 数量作为另一个操作的输入是必需的。我还考虑将数据以 productId x warehouseId x saleType 粒度存储在 csv 文件中,并从映射作业中读取它

【问题讨论】:

停下! :) 问题陈述是什么?您要存储什么(嵌套的哈希图并不能告诉我太多)?您的访问模式是什么?推荐阅读(全部):hbase.apache.org/book.html 上面的编辑有一点帮助吗? 确实如此。现在,您打算如何读取数据?你希望什么样的手术更常见?另外,到目前为止,您的数据还不算“太大”,您是否探索过其他选择?我正在尝试确定“显然”是否是您问题的根源...... 数据将在映射作业中填充和读取。基本上,对于每个产品 id,warehouseId x (Local/Zonal/National : 我们暂时称它为 saleType) 数量作为另一个操作的输入是必需的。我还考虑将数据以 productId x warehouseId x saleType 粒度存储在 csv 文件中,并从映射作业中读取。 我的 2c 对此:如果您不需要随机访问,那么我可能会放入普通的 hdfs... 【参考方案1】:

鉴于您的编辑,我会避免使用 HBase(尽管我喜欢它)。似乎您不需要随机访问您的数据,并且在每次迭代时进行全表扫描和全表写入并不是 HBase 的最佳用途。

我假设您已经拥有一个 Hadoop 集群。最好的选择可能是将数据以平面格式直接存储在 HDFS 中(ASequenceFile、Avro 或其他序列化格式)。另外,我不确定您使用哪种工具,但我猜对于基本计数聚合,Hive 将是一个简单的开始选项)。

【讨论】:

【参考方案2】:

考虑这个问题的一种方法是 (key1, key2, key3) -> 双映射。您可以使用键、列族和限定符来描述您的结构。您可以将键元组的所有 3 个部分作为一个连接的 row_key 用于一个非常高的表,尽管这不会很好。

您有多达 90 亿个元组。您对数据有很好的了解。从那里我会遇到的第一个问题是:“您将如何最频繁地查询和访问数据?”如果您正在寻找特定的值而不是集合,那么也许 90 亿行是有意义的。如果更多时候不是,您正在寻找单个外部键的所有内部数据,那么也许最外部的键作为 row_key 和 (middle)_(inner) 作为列限定符可以工作。在后一种情况下,您可以使用 QualifierFilter 和正则表达式比较器来进一步过滤响应。

【讨论】:

数据将在映射作业中填充和读取。基本上,对于每个产品 id,warehouseId x (Local/Zonal/National : 我们暂时称它为 saleType) 数量作为另一个操作的输入是必需的。我还考虑将数据以 productId x warehouseId x saleType 粒度存储在 csv 文件中,并从映射作业中读取 如果您要处理所有数据,CSV 文件可能会更好。我不确定你是否需要 HBase。如果 CSV 文件比 hbase 容易得多,我会从那里开始。【参考方案3】:

据我了解,您拥有庞大的数据集、分区范围并且还需要快速检索,因此您可以在 HDFS 上使用parquet 格式。 这将为您提供带有分区和压缩支持的列式存储。 您还可以通过任何其他框架(如 spark、drill 等)读取数据。

【讨论】:

以上是关于在 HBase 中存储嵌套的 HashMap的主要内容,如果未能解决你的问题,请参考以下文章

hbase么,为啥存储速度快

在 HBase 与 Parquet 文件中存储数据

HBase存储架构

基于hbase+hdfs的小文件(图片)存储

HBase架构组成及原理

向 HBase 提供文件的命令,该文件随后存储在 HDFS 中