1

我们正在处理美国的 2400 万家企业。我们现在在 HDFS 和 Hadoop 上使用 Pig。我们希望加快临时查询的调试速度。例如,现在从我们的 5 个服务器集群中的 2400 万个业务中提取一个业务需要几分钟。

Hbase 似乎是我发现的唯一可以完成这项工作的系统。蜂巢似乎没有这样做。

这是我们当前在 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 不支持重复键。正如您在上面的示例中看到的,每个企业可以有多个电话号码、标题、评论等。

所以我的问题

  1. 在 Hadoop 中加速这样的临时查询的想法是什么?
  2. 在 HBase 中存储字符串数组的最佳实践是什么?
  3. 如何用 HBase 中的重复键对这个键值对进行建模?

阅读评论中的问题后编辑: 最常见的临时查询是返回具有给定 ID 的企业的所有信息。还有其他很好的即席查询支持,例如返回给定邮政编码和标题的企业。

使用 RDBMS 支持 ad hoc 查询的评论中的建议是一个很好的建议。但我希望有一个系统来支持流式查询和即席查询。我们的临时查询主要用于调试。如果我们在数据中发现错误,我们仍然需要验证它是否是我们的 Hadoop 数据中的错误,因此查询 RDBMS 是不够的。

最常见的流式处理查询是将两个大数据集加入并匹配两个数据集中的业务。流处理查询支持要求比 ad hoc 查询多得多,因此我们选择 Hadoop。我们的临时查询主要用于调试。

4

3 回答 3

2

Pig/Hive 主要用于批处理,而不是用于实时即席查询。

Apache Drill已被踢出,它是用于交互式即席查询的Google Dremel实现。可能需要一段时间才能从 Apache Drill 中实现一些可靠的东西。在此之前,您可以使用Google BigQuery云服务,该服务用于交互式分析海量数据集——多达数十亿行。

Apache Drill 的目标之一是将其与 HBase 和 HDFS 等数据源结合使用。因此,应该可以使用 Apache Drill 作为 HDFS 中数据的查询引擎。

于 2012-10-03T12:33:45.187 回答
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"

在这些键下,有电话号码、地址和其他任何内容。

您仍然可以像以前一样添加列,因为您不再指定架构。您所有的旧代码仍然可以工作,并且会在新列出现时忽略它们。

于 2012-10-02T01:59:24.623 回答
0

正如罗伯特在评论中提到的,你最好的选择可能是一个常规的 RDBMS。

关于 ad-hoc 查询和存储数组的方法——您希望执行哪些查询(这极大地影响了您在 HBase 中建模事物的方式)。

关于你的第三个问题。存储它的最简单方法(这可能不是我上面提到的最好的方法)是将“名称”变成限定符(“列”)。如果您有多个值(例如电话号码),您可以只拥有多个限定符(假设列族是 f,您将拥有 f:phone1,f:phone2..)并且您可以按前缀获取列(所有列从电话开始)

阿农

于 2012-10-02T04:47:53.487 回答