Java 为大型数据集(5 GB)提供快速访问键值存储的最佳方法

Java 为大型数据集(5 GB)提供快速访问键值存储的最佳方法,java,hadoop,mapreduce,elastic-map-reduce,emr,Java,Hadoop,Mapreduce,Elastic Map Reduce,Emr,有一个大小约为5GB的数据集。这个大数据集每行只有一个键值对。 现在需要对键的值进行十亿次的读取 我已经尝试了基于磁盘的方法,但它引发了concurrentdimption异常,还不够成熟,无法在生产环境中使用 我也不想把它放在一个数据库中,然后调用数十亿次(不过,这里可以进行一定级别的内存缓存) 基本上,我需要在hadoop作业步骤的mapper/reducer中访问这些键值数据集。试试看。这似乎正是您所需要的。我将尝试此支持地图,它既成熟又可扩展。我注意到您将此标记为弹性地图缩减。。。如果你

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

我已经尝试了基于磁盘的方法,但它引发了
concurrentdimption异常
,还不够成熟,无法在生产环境中使用

我也不想把它放在一个数据库中,然后调用数十亿次(不过,这里可以进行一定级别的内存缓存)


基本上,我需要在hadoop作业步骤的mapper/reducer中访问这些键值数据集。

试试看。这似乎正是您所需要的。

我将尝试此支持地图,它既成熟又可扩展。

我注意到您将此标记为弹性地图缩减。。。如果你在AWS上运行,也许DynamoDB是合适的


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

因此,在尝试了很多东西之后,我们现在使用SQLite

以下是我们所做的:

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

  • 有多少把钥匙?格式是什么,像
    key=value
    这样的简单文本还是二进制的?数据看起来怎么样,数字/字符串键?没有那么大。使用适当的机器,它甚至可以存储在内存中。在这种情况下,您可以将其放在分布式缓存中。@PhilippReichart:准确地说,有103302034个密钥。是的,它是一个csv,每行有
    键,值
    @JorgeGonzálezLorenzo是的,但是分布式缓存只会在每个节点中复制该文件,它不会帮助我轻松访问值,对吗?键看起来如何?有重复的钥匙吗?您希望如何准确地查询它们,即读取/访问模式?如果密钥可以表示为32位整数,那么整个密钥集将适合Redis。但它并没有内置查找表。它就像memcache,不是吗?但是如果你没有太多的可用内存怎么办。除了支持某些数据结构和原子操作(如递增/递减)之外,它不会有任何帮助。如果你不这么认为,请告诉我。在地图绘制的环境中,它有什么用处?我将在每次生成集群时设置DB。在这里,它的工作原理如下:一个由10、20等组成的集群启动机器,做一些工作,一旦这些工作完成,所有这些工作都会消失。我需要在这些作业中访问这些键值对。如果我们在其他地方有一个永久的数据库设置(在另一个框中),那么网络延迟无论多么小都很难控制,因为查找会发生几十亿次。你是对的,RDBMS数据库不是最好的主意,但Berkerley DB不是这样工作的,这就是我建议它的原因。还有很多其他的解决方案,但这是最成熟的解决方案之一。谢谢彼得,让我看看。出于兴趣,你有多少个密钥?它们的平均长度是多少?@PeterLawrey谢谢Peter:)你的建议非常有用,我们最终使用了SQLite,正如你所知,它在内部使用内存映射文件。我们已经尝试过了,但填充dynamoDB需要更多的时间!如果您尝试过,并且知道103302034许多记录可以在一个可行的时间限制内插入,那么请与我分享。我相信它们可以。您只需提供非常高的写吞吐量,并使用线程良好的代码即可。DynamoDB肯定支持至少10000次写入/秒,如果您联系AWS并请求,则可能支持更高的写入/秒。只需确保填充它的代码是异步的或正确线程化的,并且它正在使用统一的密钥分布(即,密钥顺序是随机的)写入记录。是的,Joe,但我们确实以线程化的方式尝试了这一点,正如下面所解释的,甚至使用EMR也可以做到这一点:但即使写吞吐量为1000,它在大约16小时内也只写了40K条记录!