0

我有一个问题要解决,想知道我是否正确使用 Hadoop 之类的东西来解决这个问题,将它分布在多个节点上或使用其他东西。

问题:

我有一个非常大的数据库表,其中可能包含大量记录,每条记录都有关联的元数据字段(表示为表上的一列)和值。我想要达到的是:

给定特定条件,例如搜索元数据字段 X 和值 Y 的记录,我想检索一些记录,但更重要的是,我想向用户提出一些关于下一步要搜索什么的智能建议,以便他们可以找到一些他们不知道的有趣记录。我计划这样做的方式是检查所有匹配的记录元数据字段和值,并向用户提供有趣的选择以继续进行过滤(确定什么是有趣的任务与这个问题无关)。

现在,如果我的表有大量记录,并且初始“过滤器”与很多记录匹配,那么检索所有记录然后扫描它们的其他列以获取建议,如果全部完成,可能需要很长时间比如说一个查询,甚至是迭代查询以增量获取越来越多的记录。

我在想这个问题可以通过将任务分配到多个节点来搜索不同的记录来解决。我的问题是,我应该为此研究 Hadoop 之类的东西(分配负载),还是有人可以提出其他方法来完成这项任务?

谢谢

丹尼尔

4

2 回答 2

1

如果你想为你的搜索应用程序提供真正实时(大约 200 毫秒)的响应,无论是首次搜索查询响应还是进一步建议的搜索响应,Hadoop 都不是一个好的选择,甚至 Hive、HBase 甚至 Impala(或Apache Drill,类似 Google Dremel 的系统)。

Hadoop 是一个批处理系统,适用于一次写入,多次读取的用例。它的优势在于可扩展性和 I/O 吞吐量。我看到的趋势是,许多组织将其用作离线数据挖掘和 BI 分析目的的数据仓库,以替代基于关系数据库的数据仓库。

Hive 和 HBase 都在 Hadoop 之上提供了额外的功能,但是对于平均复杂的查询工作负载,它们都不可能达到 200 毫秒的实时时间。

在Apache Drill主页上查看每个可能的解决方案如何真正达到“实时”的高级视图。CloudEra Impala 或 Apache Drill 借鉴了 Google Dremel 的想法,旨在通过查询优化、基于列的存储、I/O 的大规模并行性来提高 Hadoop 之上的查询速度。我相信这两个仍处于早期阶段,以实现他们声称的目标。我发现了 Impala 的一些初始性能基准测试结果。

如果您决定使用 Hadoop 或相关解决方案堆栈,则可以使用Sqoop或其他利用 Hadoop 分布式文件系统 API 的自定义数据加载应用程序将数据从 MySQL 加载到 Hadoop。但是,如果您将不时有新数据进入 MySQL,那么您需要安排一个作业定期运行,以从 MySQL 到 Hadoop 进行增量加载。

另一方面,构建 Hadoop 集群并找到或构建从 MySQL 到 Hadoop 的合适数据加载工具的工作量可能是巨大的工作量。此外,您需要找到一个合适的额外层来访问运行时数据并围绕它构建代码,无论是 Impala 还是其他东西。为了解决您自己的问题,最好构建自己的定制解决方案,例如使用内存缓存与数据库中的元数据一起使用热记录,以及一些索引机制来快速定位您需要的数据以进行建议的搜索查询计算。如果一台机器上的内存无法容纳足够的记录,那么内存缓存网格或集群组件就会派上用场,例如Memcached或 Reddis、EhCache等。

于 2013-10-09T08:40:57.830 回答
1

恕我直言,Hadoop 本身无法解决您的问题。首先,Hadoop(准确地说是HDFS)是一个FS,不提供列式存储,您可以在其中查询特定字段。HDFS 中的数据存储为平面文件,您必须遍历数据才能到达感兴趣的数据所在的位置。

话虽如此,有一些解决方法,比如使用Hive。Hive 是 Hadoop 家族的另一个成员,它在您现有的 Hadoop 集群之上提供仓储功能。它允许我们将 HDFS 文件映射为 Hive 表,方便查询。此外,它还提供了一个类似 SQL 的接口来查询这些表。但是,如果您有实时需求,Hive 并不适合。

我觉得像Imapala这样的东西对你更有用,它允许查询我们的大数据,同时牢记实时性。

我上面提到的原因是您的用例需要的不仅仅是 Hadoop 提供的可扩展性。除了分配负载的能力外,您的解决方案还应该能够满足您在上面指定的需求。它不仅仅是将您的数据分布在一组机器上并在其上运行原始查询。您的用户需要实时响应以及您在问题中提到的智能建议功能。

您实际上需要一个比 Hadoop 集群更智能的系统。看看Apache Mahout。它是一个很棒的工具,提供了推荐挖掘的功能,并且可以很容易地与 Hadoop 一起使用。你可以找到更多它的主页。我一定会帮助您将智能建议功能添加到您的系统中。

您可能想看看 Hadoop 系列的另一个工具HBase,它是一种分布式、可扩展的大数据存储。它的作用类似于数据库,但它不是关系数据库。它还可以在现有的 Hadoop 集群上运行,并提供实时随机读/写功能。阅读一下它,看看它是否适合某个地方。

最后但并非最不重要的一点是,这完全取决于您的需求。只有在尝试不同的事情并进行比较研究之后才能做出准确的决定。我们可以根据我们的经验为您提供建议,但只有在测试了一些工具并找到最适合您要求的工具后才能做出公平的决定:)

于 2013-10-08T17:17:02.893 回答