你好,在 SO,
我想听听尊敬的各位对以下内容的一些想法/评论。
我有 100M 条记录需要处理。我有 5 个节点(在岩石集群中)来执行此操作。数据非常结构化,非常适合关系数据模型。我想并行处理事情,因为我的处理需要一些时间。
在我看来,我有两个主要选择:
在每个节点上安装mysql,每个节点放20M条记录。使用头节点将查询委托(delegate)给节点并聚合结果。 Query Capabilities++,但在选择分区策略等方面我可能会有些头疼(问:这就是他们所说的 mysql/postgres 集群吗?)。真正糟糕的是记录的处理现在由我来处理(如何跨机器分发等)...
或者安装 Hadoop、Hive 和 HBase(请注意,这可能不是存储我的数据的最有效方式,因为 HBase 是面向列的)并仅定义节点。我们用 MapReduce 范式编写所有内容,然后,砰的一声,我们从此过上了幸福的生活。这里的问题是我们失去了“实时”查询功能(我知道你可以使用 Hive,但不建议实时查询 - 我需要) - 因为我有时也有一些正常的 sql 查询要执行“select * from wine where color = 'brown'”。
请注意,理论上 - 如果我有 100M 台机器,我可以立即完成整个操作,因为对于每条记录,处理过程都是独立于其他记录的。另外 - 我的数据是只读的。我不认为会发生任何更新。我不需要/想要一个节点上的 100M 记录。我不希望有冗余数据(因为有很多)所以将它保存在 mysql/postgres 和 Hadoop/HBase/HDFS 中。不是真正的选择。
非常感谢
最佳答案
你能证明MySQL是瓶颈吗? 100M 条记录并不多,看起来您没有执行复杂的查询。在不知 Prop 体是哪种处理的情况下,以下是我将按以下顺序执行的操作:
- 将 100M 保留在 MySQL 中。查看 Cloudera 的 Sqoop 实用程序,从数据库导入记录并在 Hadoop 中处理它们。
- 如果 MySQL 是 (1) 中的瓶颈,请考虑设置从复制,这将使您并行读取,而无需分片数据库的复杂性。由于您已经声明不需要写回数据库,因此这应该是一个可行的解决方案。您可以根据需要将数据复制到任意数量的服务器。
- 如果您正在从数据库运行复杂的选择查询,并且 (2) 仍然不可行,请考虑使用 Sqoop 导入您的记录并在 Hadoop 中执行您需要的任何查询转换。
在你的情况下,除非绝对必要,否则我会抵制跳出 MySQL 的诱惑。
关于mysql - Hadoop(+HBase/HDFS)与 Mysql(或 Postgres)——要处理和查询的独立结构化数据负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4884967/