我们正在美国处理2400万家企业。我们现在在HDFS和Hadoop上使用Pig。我们希望加快调试的即席查询。例如。现在,我们的5个服务器集群中的2,400万个业务中需要花费几分钟时间来完成一项业务。
Hbase似乎是我发现的唯一可以完成这项工作的系统。 Hive似乎没有这样做。
这是我们的架构,当前存储为HDFS中的制表符分隔的平面文本文件。
place_id name value
1 Title Bamboo Garden
1 Title Bamboo Garden Restaurant
1 Phone 425-555-555
1 Phone 425-444-444
1 Address 123 Bellevue Way
2 Title Burger King
2 Phone 425-333-3333
我们选择此名称值对,以便灵活地组合附加数据和字段。例如。如果我们想要联合两个数据集,我们可以很容易地“捕捉”它们。此外,添加更多新字段非常容易。这个架构是很久以前设计的,很少有机会改变它。
我们发现很难在Hbase中对此进行建模,因为Hbase不支持重复键。正如您在上面的示例中所看到的,每个企业都可以拥有多个电话号码,标题,评论等。
所以我的问题
在阅读评论中的问题后编辑: 最常见的即席查询是返回具有给定ID的商家的所有信息。还有其他很好的特殊查询支持,例如返回给定邮政编码和标题的业务。
使用RDBMS支持即席查询的评论中的建议是一个很好的建议。但我希望有一个系统支持流媒体和即席查询。我们的即席查询主要用于调试。如果我们在数据中发现错误,我们仍需要验证它是否是我们的Hadoop数据中的错误,因此查询RDBMS是不够的。
最常见的流处理查询是加入两个大数据集并匹配两个数据集中的业务。与ad hoc查询相比,有更多的流处理查询支持要求,因此我们选择Hadoop。我们的即席查询主要用于调试。
答案 0 :(得分:2)
在Hadoop中加快像这样的即席查询的想法是什么?
我认为你不应该尝试。 Hadoop用于批量分析,而不是记录提取。
在HBase中存储字符串数组的最佳做法是什么?
有几种方法可以做到这一点。如果没有很多更新,请将字符串数组以序列化方式存储在一个字符串中。类似于“电话”的单元格中的425-555-5555^425-444-444
之类的东西。在Pig和Hive中,您可以使用一些简单的字符串拆分实用程序将其转换回数组。
如果您经常添加数字,那么您可以将单元格称为"phone1"
,"phone[2]"
等。这使得使用Pig和Hive进行处理非常困难。
如何使用HBase中的重复键对此键值对进行建模?
基本上,您在SQL模式中实现的是双嵌套映射,这正是HBase的基础。因此,建模数据应该非常简单。
你需要在这里复制密钥。拥有业务的头衔是关键,因为这似乎是单一的。你确实想找到一种让它独一无二的方法,因为我认为“汉堡王”可能存在于不止一个地方。我建议的一件事是将业务名称作为密钥的一部分,但添加使其独特的东西。
示例:"Bambo Garden^1"
,"Burger King^2"
或"Bamboo Garden^123 Bellvue Way"
。
在这些密钥下,有电话号码,地址等等。
您仍然可以像以前一样添加列,因为您不再指定架构。您的所有旧代码仍然有效,只会在新列出现时忽略它们。
答案 1 :(得分:2)
Pig / Hive主要用于批处理,而不是用于实时特殊查询..
Apache Drill已被踢,这是用于交互式adhoc查询的Google Dremel的实现。可能需要一段时间才能实现Apache Drill的实体化。然后,您可以使用Google BigQuery云服务,该服务用于交互式分析海量数据集 - 最多可达数十亿行。
Apache Drill的目标之一是将其与HBase和HDFS等数据源结合使用。因此,应该可以使用Apache Drill作为HDFS中数据的查询引擎。
答案 2 :(得分:0)
正如罗伯特在评论中提到的,你最好的选择可能就是常规的RDBMS。
关于即席查询和存储阵列的方法 - 您希望做什么查询(这极大地影响了您在HBase中建模的方式)。
关于你的第3个问题。存储它的最简单方法(可能不是我上面提到的最好的方法)是将“name”变成限定符(“列”)。如果您有多个值(例如电话号码),您可以只有多个限定符(假设列族为f,您有f:phone1,f:phone2 ..)并且您可以按前缀(所有列)获取列从电话开始)
嫩