Hadoop(+ HBase/HDFS)vs Mysql(或Postgres) - 要处理和查询的大量独立结构化数据

Mal*_*dog 9 mysql postgresql distributed database-design hadoop

您好,在SO,

我想对你们尊敬和尊敬的一些人提出一些想法/意见.

我有100M记录需要处理.我有5个节点(在岩石群中)来做这件事.数据非常有条理,并且很好地适用于关系数据模型.我希望并行处理,因为我的处理需要一些时间.

我看到它有两个主要选择:

在每个节点上安装mysql,并在每个节点上放置20M记录.使用头节点将查询委派给节点并聚合结果. 查询功能++,但是当我选择分区策略等时,我可能会冒一些头痛的风险.(问:这就是他们所谓的mysql/postgres集群吗?).真正糟糕的是,记录的处理现在由我来处理(如何跨机器分发等)...

或者安装Hadoop,Hive和HBase(请注意,这可能不是存储数据的最有效方法,因为HBase是面向列的)并且只是定义节点.我们在MapReduce范例中写下了所有内容,而且,从此以后,我们幸福地生活着.这里的问题是我们失去了"实时"查询功能(我知道你可以使用Hive,但这不建议用于实时查询 - 我需要) - 因为我还有一些正常的sql查询有时执行" select*from wine where color ='brown'".

请注意,理论上 - 如果我有100M机器,我可以立即完成所有事情,因为对于每个记录,处理是独立于另一个.另外 - 我的数据是只读的.我没有想到会发生任何更新.我不需要/想要一个节点上的100M记录.我不希望有冗余数据(因为它有很多)所以保持它在两个mysql/postgres和Hadoop/HBase/HDFS.不是一个真正的选择.

非常感谢

baj*_*ife 8

你能证明MySQL是瓶颈吗?100M记录并不多,看起来你没有执行复杂的查询.在不知道究竟是什么类型的处理的情况下,我将按以下顺序执行此操作:

  1. 在MySQL中保持100M.看一下Cloudera的Sqoop实用程序,从数据库导入记录并在Hadoop中处理它们.
  2. 如果MySQL是(1)中的瓶颈,请考虑设置从属复制,这将使您可以并行化读取,而不会出现分片数据库的复杂性.既然您已经声明不需要回写数据库,那么这应该是一个可行的解决方案.您可以根据需要将数据复制到尽可能多的服务器.
  3. 如果您正在从数据库运行复杂的选择查询,并且(2)仍然不可行,那么请考虑使用Sqoop导入您的记录并执行Hadoop中所需的任何查询转换.

在你的情况下,我会抵制跳出MySQL的诱惑,除非绝对必要.


Fah*_*tha 1

你好,

我遇到过这样的情况:我有许多使用 sqlalchemy 和 python 多处理库并行创建的表。我有多个文件,每个表一个,并使用并行 COPY 进程加载它们。如果每个进程对应一个单独的表,那就很好了。对于一张表,使用 COPY 会很困难。我猜你可以在 PostgreSQL 中使用表分区。如果您有兴趣,我可以提供更多详细信息。

问候。