我正在寻找一种分布式解决方案来实时筛选/过滤大量密钥。我的应用程序每天生成超过1000亿条记录,我需要一种方法来过滤流中的重复项。我正在寻找一个系统来存储10天的滚动密钥,每个密钥大约100个字节。我想知道在使用Hadoop之前这种类型的大规模问题是如何解决的。 HBase是否是正确的解决方案?有没有人尝试过像Zookeeper这样的部分内存解决方案?
答案 0 :(得分:4)
我可以看到你的问题的一些解决方案,但实时要求确实缩小了它。实时的意思是你想知道一个密钥是否在创建时是重复的?
让我们来谈谈每秒的查询。你说100B /天(这很多,恭喜!)。这是每秒115万次查询(100,000,000,000 / 24/60/60)。我不确定HBase能不能解决这个问题。您可能想要考虑像Redis(可能是分片)或Membase / memcached或类似的东西。
如果您要在HBase中执行此操作,我只需将万亿键(10天x 100B键)的向上按键作为表中的键,并在其中放置一些值来存储它(因为您有至)。然后,您可以直接判断密钥是否在那里。这是一种很好的方式,并没有充分利用hbase,因为它只是充分利用了密钥空间。因此,在这种情况下,HBase实际上是一种b树服务。我认为这不是一个好主意。
如果你放松约束而不必做实时,你可以批量使用MapReduce进行重复数据删除。这很简单:它只是字数不计算。您按键所分组,然后如果有多个值返回,您将在reducer中看到重复项。有足够的节点足够的延迟,您可以有效地解决这个问题。以下是MapReduce设计模式书中的一些示例代码:https://github.com/adamjshook/mapreducepatterns/blob/master/MRDP/src/main/java/mrdp/ch3/DistinctUserDriver.java
ZooKeeper用于分布式进程通信和同步。您不希望在zookeeper中存储数万亿条记录。
因此,在我的意见中,你可以更好地使用内存键/值存储(如redis),但是你很难将这么多数据存储在内存中。 / p>
答案 1 :(得分:1)
我担心传统系统是不可能的:|
这是你提到的:
这些假设导致查找一组1万亿个对象,这些对象的总体大小为90个TERABYTES !!!!!
对这个实时问题的任何解决方案都应该提供一个系统,在这个数据量中每秒可以查找100万个项目。
我对HBase,Cassandra,Redis和Memcached有一些经验。我确信U无法在任何基于磁盘的存储上实现此性能,如HBase,Cassandra或HyperTable(并添加任何RDBMS,如MySQL,PostgreSQl和......)。我实际听到的redis和memcached的最佳性能是在一台机器上每秒大约100k次操作。这意味着U必须有90台机器,每台机器有1个TERABYTES的RAM !!!!!!!!
即使像Hadoop这样的批处理系统也不能在一个小时内完成这项工作,我想即使是100台机器的大型集群也需要数小时和数天。