1

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'

私が考慮すべき重要な詳細と、この問題を解決するための他の既知のアプローチがあるかどうかを教えてください。助けていただければ幸いです。ありがとう!

4

0 に答える 0