【发布时间】:2012-04-18 23:22:42
【问题描述】:
我有很多文本文件,它们的总大小约为 300GB ~ 400GB。都是这种格式
key1 value_a
key1 value_b
key1 value_c
key2 value_d
key3 value_e
....
每一行由一个键和一个值组成。我想创建一个数据库,它可以让我查询一个键的所有值。比如我查询key1时,返回value_a、value_b和value_c。
首先,将所有这些文件插入数据库是一个大问题。我尝试使用 LOAD DATA INFILE 语法将几 GB 大小的块插入 MySQL MyISAM 表。但似乎 MySQL 不能利用多核来插入数据。它像地狱一样慢。所以,对于这么多记录,我认为 MySQL 不是一个好的选择。
另外,如果可能,我需要定期、每周甚至每天更新或重新创建数据库,因此,插入速度对我来说很重要。
单个节点不可能高效地进行计算和插入,要高效,我认为最好在不同节点并行执行插入。
例如,
node1 -> compute and store 0-99999.txt
node2 -> compute and store 10000-199999.txt
node3 -> compute and store 20000-299999.txt
....
所以,第一个标准来了。
标准1.分布式批量插入速度快。
然后,正如您在文本文件示例中看到的那样,最好为不同的值提供多个相同的键。就像示例中的 key1 映射到 value_a/value_b/value_c 一样。
标准 2. 允许多个键
然后,我需要查询数据库中的键。不需要关系或复杂的连接查询,我只需要简单的键/值查询。重要的部分是相同值的多个键
标准 3. 简单快速的键值查询。
我知道有 HBase/Cassandra/MongoDB/Redis....等等,但我对它们都不熟悉,不确定哪一个适合我的需求。所以,问题是 - 使用什么数据库?如果它们都不符合我的需求,我什至打算建立自己的,但这需要努力:/
谢谢。
【问题讨论】:
-
不要自己构建。不管你有多好,你确定你和那些一直只做这件事的人一样好吗?有支持、有用户、有测试?
-
当然,我不如那些人。我也不想重建轮子。但如果没有轮子适合我的需要,我必须建造一个。 :S
-
不,对于像数据库存储引擎这样重要的东西,你总是稍微调整你的需求,或者处理一些怪癖会更好。谷歌并没有为他们的数据创建自己的存储系统,他们对 MySQL 做了一些修补。不要错误地认为您的问题是独一无二的。
-
这不是一个真正的编程问题。尝试在dba.stackexchange.com 上提问
-
圆柱形,我不同意。 Oracle 等可能非常复杂,但不可变的键/值数据库则不然。你不必害怕它。 Google 确实为他们的数据创建了自己的存储系统(Bigtable,其中一些内容变成了开源的 LevelDB;Spanner;以及许多其他),您可以使用 LevelDB 的一小部分来解决这个问题。那部分非常简单。您没有理由不能很好地理解所涉及的代码和数据结构。
标签: mysql database nosql distributed bigdata