-
22-10-2019 - |
题
我有很多文本文件,它们的总尺寸约为300GB〜400GB。他们都采用这种格式
key1 value_a
key1 value_b
key1 value_c
key2 value_d
key3 value_e
....
每行都是由键和值组成的。我想创建一个数据库,该数据库可以让我查询键的所有值。例如,当我查询键1时,返回value_a,value_b和value_c。
首先,将所有这些文件插入数据库是一个大问题。我尝试将一些GBS大小的块插入带有负载数据填充语法的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 ....依此类推,但是我不熟悉所有这些,不确定哪个适合我的需求。那么,问题是 - 要使用什么数据库?如果他们都不适合我的需求,我什至计划自己建立自己的需求,但这需要努力:/
谢谢。
解决方案
我处在类似的情况下,强烈建议您根据您的需求寻找MongoDB或HBase。其他(Cassandra/redis)也很好,但是HBase和MongoDB在大型环境中进行了战斗,拥有大型社区,良好的文档(MongoDB更好),并且通常满足您正在寻找的三个要求。
其他提示
- 钥匙有多大?
- 价值有多大?
- 数据会“不断地”到达,还是一次性负载?
- 让我们看看所有代表性的查询。你只提到
SELECT val FROM tbl WHERE key = 'constant';
还有其他吗?
总的来说,钥匙值商店很糟糕。但是,也许我们可以使您的特殊情况变得不太好起来。