我正在寻找一个分布式的解决方案,以屏幕/过滤实时大量的关键。我的应用程序每天生成超过1000亿条记录,我需要一种从流中过滤重复记录的方法。我正在寻找一个系统来存储滚动10天的价值的关键,在大约100字节每键。我想知道在使用hadoop之前,这种大规模问题是如何解决的。hbase是正确的解决方案吗?有没有人尝试过像zookeeper这样的部分内存解决方案?
k4aesqcs1#
恐怕用传统的系统是不可能的:|以下是你提到的:每天1000亿就意味着每秒大约100万!!!!密钥的大小为100字节。你想在一个10天的工作组中检查重复项意味着1万亿个项目。这些假设导致查找一组1万亿个对象,总大小为90兆字节!!!!!任何解决这个实时问题的方法都应该提供一个系统,在这个数据量中每秒可以查找100万个项目。我对hbase、cassandra、redis和memcached有一些经验。我敢肯定,在任何基于磁盘的存储上,如hbase、cassandra或hypertable(以及添加任何RDBMS,如mysql、postgresql和。。。这些)。我听说redis和memcached的最佳性能实际上是在一台机器上每秒10万次操作。这意味着你必须有90台机器,每台都有1兆字节的内存!!!!!!!!即使像hadoop这样的批处理系统也不能在不到一个小时内完成这项工作,我猜即使是在100台机器的大集群上,也要花费数小时甚至数天的时间。你说的是非常大的数字(90 tb,每秒1百万)。你确定吗???
eqzww0vc2#
我可以看到你的问题有很多解决方案,但实时性要求确实缩小了范围。您所说的实时是指在创建密钥时要查看密钥是否重复?我们来讨论一下每秒的查询数。你说的是100b/天(太多了,恭喜你!)。即每秒有115万个查询(10000000000/24/60/60)。我不确定hbase是否能处理这个问题。您可能想考虑redis(也许是sharded)或membase/memcached之类的东西。如果您要在hbase中执行此操作,我只需将一万亿个键(10天x 100b键)作为表中的键,并在其中放入一些值来存储它(因为您必须这样做)。然后,你可以试着找出钥匙是否在里面。这是一种hokey,并没有充分利用hbase,因为它只是充分利用了keyspace。因此,在这种情况下,hbase实际上是一个b树服务。我觉得这不是个好主意。如果您放松了对实时性的限制,就可以使用mapreduce进行批量重复数据消除。这很简单:只需要字数而不需要计数。您可以按所拥有的键进行分组,然后如果返回多个值,您将在reducer中看到dup。有了足够的节点和足够的延迟,就可以有效地解决这个问题。以下是mapreduce设计模式手册中的一些示例代码:https://github.com/adamjshook/mapreducepatterns/blob/master/mrdp/src/main/java/mrdp/ch3/distinctuserdriver.javazookeeper用于分布式进程通信和同步。你不想在zookeeper中存储数以万亿计的记录。所以,在我看来,像redis这样的内存中的键/值存储更好,但是你很难在内存中存储那么多的数据。
2条答案
按热度按时间k4aesqcs1#
恐怕用传统的系统是不可能的:|
以下是你提到的:
每天1000亿就意味着每秒大约100万!!!!
密钥的大小为100字节。
你想在一个10天的工作组中检查重复项意味着1万亿个项目。
这些假设导致查找一组1万亿个对象,总大小为90兆字节!!!!!任何解决这个实时问题的方法都应该提供一个系统,在这个数据量中每秒可以查找100万个项目。我对hbase、cassandra、redis和memcached有一些经验。我敢肯定,在任何基于磁盘的存储上,如hbase、cassandra或hypertable(以及添加任何RDBMS,如mysql、postgresql和。。。这些)。我听说redis和memcached的最佳性能实际上是在一台机器上每秒10万次操作。这意味着你必须有90台机器,每台都有1兆字节的内存!!!!!!!!
即使像hadoop这样的批处理系统也不能在不到一个小时内完成这项工作,我猜即使是在100台机器的大集群上,也要花费数小时甚至数天的时间。
你说的是非常大的数字(90 tb,每秒1百万)。你确定吗???
eqzww0vc2#
我可以看到你的问题有很多解决方案,但实时性要求确实缩小了范围。您所说的实时是指在创建密钥时要查看密钥是否重复?
我们来讨论一下每秒的查询数。你说的是100b/天(太多了,恭喜你!)。即每秒有115万个查询(10000000000/24/60/60)。我不确定hbase是否能处理这个问题。您可能想考虑redis(也许是sharded)或membase/memcached之类的东西。
如果您要在hbase中执行此操作,我只需将一万亿个键(10天x 100b键)作为表中的键,并在其中放入一些值来存储它(因为您必须这样做)。然后,你可以试着找出钥匙是否在里面。这是一种hokey,并没有充分利用hbase,因为它只是充分利用了keyspace。因此,在这种情况下,hbase实际上是一个b树服务。我觉得这不是个好主意。
如果您放松了对实时性的限制,就可以使用mapreduce进行批量重复数据消除。这很简单:只需要字数而不需要计数。您可以按所拥有的键进行分组,然后如果返回多个值,您将在reducer中看到dup。有了足够的节点和足够的延迟,就可以有效地解决这个问题。以下是mapreduce设计模式手册中的一些示例代码:https://github.com/adamjshook/mapreducepatterns/blob/master/mrdp/src/main/java/mrdp/ch3/distinctuserdriver.java
zookeeper用于分布式进程通信和同步。你不想在zookeeper中存储数以万亿计的记录。
所以,在我看来,像redis这样的内存中的键/值存储更好,但是你很难在内存中存储那么多的数据。