面试官要求我设计一个存储千兆字节数据的系统,该系统还必须支持某种查询。
描述:
IDC中生成大量记录,每个记录由一个URL,访问该URL的IP以及访问发生的时间组成。记录可以这样表示,但我不确定应该选择哪种数据类型来表示它们:
struct Record { url; //char * IP; //int? visit_time; //time_t or simply a number? }
要求:
设计一个存储1000亿条记录的系统,并且该系统至少要支持两种查询:
首先,给定一个时间段(t1,t2)和一个IP,查询该IP在给定时间段内访问了多少个网址。 第二,给定时间段(t1,t2)和一个URL,查询该URL被访问了多少次。
首先,给定一个时间段(t1,t2)和一个IP,查询该IP在给定时间段内访问了多少个网址。
第二,给定时间段(t1,t2)和一个URL,查询该URL被访问了多少次。
我迷迷糊糊,这是我的愚蠢解决方案:
分析:
因为每个查询都是 _ 在给定的时间段内 执行 _ 的 ,所以:
1. 创建一个集合 ,将所有访问时间放入集合中,并根据从旧到最新的时间值使集合保持有序。
2. 使用hash(visit_time)作为键 创建一个哈希表,该哈希表称为time-hash-table,然后特定存储桶中的 每个节点 都有2个指针,分别 指向另外2个哈希表。
3. 另外两个哈希表 将是 ip-hash-table 和 url-hash-table 。
ip-hash-table 使用hash(ip)作为键,并且同一ip-hash-table中的所有ip都具有相同的访问时间; url-hash-table 使用hash(url)作为键,并且同一url-hash-table中的所有url都具有相同的访问时间。
ip-hash-table 使用hash(ip)作为键,并且同一ip-hash-table中的所有ip都具有相同的访问时间;
ip-hash-table
url-hash-table 使用hash(url)作为键,并且同一url-hash-table中的所有url都具有相同的访问时间。
url-hash-table
给出如下图:
time_hastbl [] [] []-->[visit_time_i]-->[visit_time_j]...[visit_time_p]-->NIL [] | | [] ip_hastbl url_hastbl [] [] : : [] [] [] []
因此,在对(t1,t2)进行查询时:
从时间集合中找到最接近的匹配,假设匹配为(t1’,t2’),那么所有有效的访问时间都将落入集合中从t1’到t2’开始的部分;
对于时间set [t1’:t2’]中的每个访问时间t,执行hash(t)并找到t的ip_hastbl或url_hastbl,然后计数并记录给定ip或url出现了多少次。
问题:
1.我的解决方案很愚蠢,希望您能给我另一个解决方案。
2.关于如何将大量记录存储在磁盘上,有什么建议吗?我想到了B树,但是如何使用它或B树在该系统中适用呢?
我相信采访者期望的是基于分布式计算的解决方案,尤其是当涉及“ 1000亿条记录”时。鉴于我对分布式计算的了解有限,建议您研究一下分布式哈希表和map- reduce(用于并行查询处理)