我在文本文件中有大量数据(TB)的DNS日志,其中每条记录的格式为
timestamp | resolvername | domainlookedfor | dns_answer
其中,
timestamp - time at which the record was logged
resolvername - the dns resolver that served the end-user
domainlookedfor - domain that was looked for by the end user
dns_answer - final dns resolution record of 'hostname -> ip address'
截至目前,我individual text files for every five minutes of logs
来自dns resolvers
www.google.com
。因此,如果我想查看过去10天内包含主机名domain name
的记录,那么我将不得不扫描过去10天的整个数据(假设为50GB),并仅过滤那些记录,匹配域(假设10MB的数据)。显然,从磁盘中不必要地读取了大量数据,并且需要花费大量时间才能获得结果。
为了改善这种情况,我正在考虑根据www.google.com
对数据进行分区,从而减少搜索空间。另外,我想保留基于时间分隔的记录的概念(如果不是每隔5分钟,我希望每天都有一个文件说)。
我能想到的一个简单方法是,
根据域名的哈希值(或者可能是前两个字母)[domain_AC,domain_AF,domain_AI ... domain_ZZ]暂存记录,其中目录domain_AC将拥有所有域的记录第一个字符是A,第二个字符是A或B或C.
在每个桶中,每天都会有一个单独的文件[20130129,20130130,...]
因此,要获取resolvername
的记录,请首先识别存储区,然后根据日期范围扫描相应的文件,并仅过滤与www.google.com匹配的记录。
我的另一个要求是根据get all the records by resolver 'x'
对记录进行分组,以回答{{1}}等问题。
如果有任何重要的细节我应该考虑以及任何其他已知的方法来解决这个问题,请告诉我。我感谢任何帮助。谢谢!