DNSログの膨大なデータ(TB)がテキストファイルにあり、各レコードは次の形式になっています。
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
ます。したがって、ホスト名を含む過去10日間のレコードを表示したい場合は、過去10日間www.google.com
のデータ全体をスキャンし(たとえば50GB)、ドメインに一致するレコードのみをフィルター処理する必要があります(たとえば、10MBのデータ)。したがって、明らかに、ディスクから不必要に読み取られる大量のデータがあり、結果を取得するのに多くの時間がかかります。
この状況を改善するために、に基づいてデータを分割し、domain name
それによって検索スペースを減らすことを考えています。また、時間に基づいて分離されたレコードの概念を保持したいと思います(5分ごとではない場合は、たとえば毎日ファイルを作成したいと思います)。
私が考えることができる1つの簡単なアプローチは、
ドメイン名(または最初の2文字)のハッシュに基づいてレコードをバケット化します[domain_AC、domain_AF、domain_AI ... domain_ZZ]ここで、ディレクトリdomain_ACには、最初の文字がAで2番目の文字であるすべてのドメインのレコードがあります。文字はAまたはBまたはCのいずれかです。
各バケット内には、毎日個別のファイルがあります[20130129、20130130、...]
したがって、のレコードを取得するにはwww.google.com
、最初にバケットを識別し、次に日付範囲に基づいて、それぞれのファイルをスキャンし、www.google.comに一致するレコードのみをフィルタリングします。
resolvername
私が持っているもう1つの要件は、などのクエリに答えるためにに基づいてレコードをグループ化することですget all the records by resolver 'x'
。
私が考慮すべき重要な詳細と、この問題を解決するための他の既知のアプローチがあるかどうかを教えてください。助けていただければ幸いです。ありがとう!