2

有一个大小约为 5GB 的数据集。这个大数据集每行只有一个键值对。现在这需要读取数十亿次键的值。

我已经尝试过MapDB的基于磁盘的方法,但是它抛出ConcurrentModification Exception并且还不够成熟,无法在生产环境中使用。

我也不想将它放在数据库中并进行十亿次调用(尽管可以在这里完成一定级别的内存缓存)。

基本上,我需要在 hadoop 工作步骤的映射器/归约器中访问这些键值数据集。

4

4 回答 4

3

所以在尝试了很多东西之后,我们现在正在使用 SQLite。

以下是我们所做的:

  1. 我们将所有键值对数据加载到预定义的数据库文件中(在键列上对其进行索引,虽然它增加了文件大小但值得。)
  2. 将此文件 (key-value.db) 存储在 S3 中。
  3. 现在这被作为分布式缓存传递给 hadoop 作业。
  4. 在 Mapper/Reducer 的配置中,打开到 db 文件的连接(大约需要 50 毫秒)
  5. 在 map/reduce 方法中使用键查询这个数据库(花费的时间可以忽略不计,甚至不需要分析它,它是如此微不足道!)
  6. 在 Mapper/Reducer 的清理方法中关闭了连接
于 2012-12-13T17:34:04.180 回答
0

试试Redis。看来这正是您所需要的。

于 2012-12-04T15:38:37.283 回答
0

我会试试Oracle Berkerley DB Java 版,它支持 Maps,既成熟又可扩展。

于 2012-12-04T15:57:26.823 回答
0

我注意到你用 elastic-map-reduce 标记了这个......如果你在 AWS 上运行,也许 DynamoDB 是合适的。

另外,我想澄清一下:这个数据集是您的 MapReduce 作业的输入,还是在 MapReduce 作业期间随机访问的补充数据集?

于 2012-12-05T00:49:28.680 回答