Apache Flume と Python を使用したデータ収集のスケーリング

著者: 禅とコンピュータープログラミングの芸術

1 はじめに

Apache Flume は、Cloudera が提供するオープンソースの分散型信頼性の高いログ コレクターです。ロギング、イベント収集、ストリーミング データ送信などのシナリオで広く使用されています。大量のログ データを非常に適切に処理でき、ログ データの整合性、リアルタイム性、適時性を効果的に確保できます。Flume のデータ ストレージ バックエンドは、HDFS、HBase、Kafka、およびその他のストレージ システムをサポートしています。Flume は、データのセグメンテーション、圧縮、暗号化などの前処理操作を実行して、データのセキュリティ、可用性、パフォーマンスなどをさらに向上させることもできます。この記事では、Python 言語を使用して単純なログ収集アプリケーションを実装し、同時実行性の高いシナリオでのログ データの収集、集計、分析プロセスをシミュレートします。Flume と Python は密接に統合されているため、この記事は 2 つの統合に関する記事でもあります。この記事を読むことで、読者は Flume を使用して複数のソースからデータを集約する方法と、Python を使用して収集されたログをクリーンアップ、計算、分析する方法を理解できると思います。

2. 基本的な概念と用語の説明

2.1 Flume の概要

Apache Flume (略して Flume) は、大量のログ ファイルを収集、集約、移動するための、信頼性が高くフォールト トレラントな分散型サービスです。その主な機能は次のとおりです。

  1. 信頼性: Flume はデータが失われないことを保証します。たとえ Flume 自体またはログ ソースに障害が発生しても、データの整合性は影響を受けません。

  2. データの整合性: Flume はシンプルで使いやすいトランザクション メカニズムを使用して、データが破壊されたり破損したりしないようにします。

  3. 効率: Flume は、低遅延、高スループット、高耐障害性を備えながら、ログをバッチ処理して迅速に送信できます。

  4. 複数のストレージ バックエンドのサポート: Flume は、HDFS、HBase、Kakfa などの複数のストレージ バックエンドをサポートします。ニーズに応じて、さまざまなストレージ バックエンドを選択できます。

  5. データ前処理のサポート: Flume は、データのセグメンテーション、圧縮、暗号化などの前処理操作をサポートし、データのセキュリティ、可用性、パフォーマンスなどをさらに向上させます。

2.2 Python の概要

Python は、無料のオープンソース、クロスプラットフォームのコンピューター プログラミング言語です。その設計哲学は、コードの読みやすさ、シンプルさ、移植性、その他多くの利点を重視しています。Python は元々 Guido van Rossum によって開発され、最初のバージョンは 1991 年にリリースされました。2019 年 7 月現在の Python の最新バージョンは 3.7.0 です。Python には、Web 開発、科学技術コンピューティング、データ マイニング、機械学習などの分野をサポートする豊富なライブラリとモジュールがあり、非常に人気のあるプログラミング言語となっています。

2.3 ログ

ログとは、アプリケーションの実行状況や処理フローを記録するテキスト情報で、通常はタイムスタンプ、レベル、スレッドID、カテゴリ、メッセージなどの情報が含まれます。実際の運用環境では、ログは非常に重要な情報源です。大規模なソフトウェア システムでは、大量のログ データが生成されることがよくあります。開発者が問題を特定するのに役立つだけでなく、ログ データは統計、監視、その他のタスクを実行するためにも使用できます。したがって、ログ データの収集、処理、分析、検索、レポートに関連する技術的な知識とツールも非常に重要です。

3. コアアルゴリズムの原則と具体的な操作手順

3.1 ログデータモデル

ログ データ モデルとは、ログ データを簡単に取得、分析、理解できるように編成および構造化する方法を指します。一般に、ログ データ モデルには、ログ名、フィールド、ラベル、カテゴリ、レベルなどが含まれます。次の図は、最も一般的なログ データ モデル、つまり 4 要素モデルを示しています。

4 要素モデルでは、ログの 4 つの要素は次のとおりです。

  1. ログ名: ログ名は、ログの名前識別子を指します。通常、ログ名はアプリケーションによって生成され、ログが属するシステム プロセスまたはサービスを示します。

  2. ログ フィールド: ログ フィールドは、ログ内のすべての関連情報を参照します。これはさまざまなフィールドで構成されており、それぞれが独自の名前、値、タイプを持つことができます。たとえば、ログには「ユーザー ID」、「アクセス時間」、「リクエスト パラメーター」などのフィールドが含まれる場合があります。

  3. ログ タグ: ログ タグは、ログを説明する追加情報を指します。ホスト名、IP アドレス、環境情報など、ログの取得、分析、レポートを容易にするあらゆる情報を指定できます。

  4. ログレベル: ログレベルとは、ログの重要度の分類を指します。一般に、ログ レベルは、DEBUG、INFO、WARN、ERROR、FATAL、TRACE、ALL の 7 つのレベル (低位から高位まで) に分類されます。このうち、DEBUG が最も低いレベル、FATAL が最も高いレベルです。

3.2 Flumeの基本構成

インストール

Flume は、ソース コード パッケージまたはコンパイルされたバイナリ パッケージをダウンロードしてインストールできます。具体的な方法については、公式 Web サイトのインストール手順を参照してください。

構成

Flume の設定ファイルは flume.conf という名前で、デフォルトでは /etc/flume ディレクトリに保存されます。Flume 設定ファイルには、次の 3 つの主要なセクションが含まれています。

  1. エージェント
  2. ソース
  3. チャンネル
  4. シンク

エージェント: エージェントは、構成チェック間隔、独立して実行できるかどうか、動作モードなど、Flume の基本プロパティを定義します。sources:sources はログ データ ソースを定義します。Flume は、AvroSource、ExecSource、SpoolDirectorySource など、さまざまなデータ ソースをサポートしています。ここでは、ログ収集をシミュレートするために ExecSource のみを使用します。チャネル: チャネルは Flume の最も重要なコンポーネントの 1 つであり、ログ データの保存、キャッシュ、送信を担当します。メモリ、ローカル ディスク、Thrift、MySQL などの複数のバッファリング戦略をサポートします。ここではメモリキャッシュのみを使用します。シンク: シンクはログの出力先を定義します。Flume は、HDFS、Hive、LoggerSink、SolrJ、FileChannel、KafkaSink など、さまざまな出力ターゲットをサポートしています。ここでは、ログをコンソールに出力するために LoggerSink のみを使用します。具体的な構成例は以下のとおりです。

#agent name
agent.name=quickstart-agent

#sources
source.exec = exec
 .command = tail -F /var/logs/*.log
 .filegroups = logs
 .batchSize = 1000
 .batchTimeout = 30 seconds

#channels
channel.memory.type = memory
channel.memory.capacity = 10000

#sinks
sink.console.type = logger
sink.console.loggerClassName = org.apache.flume.sink.ConsoleLogger
sink.console.logFormat = "%-4r %d{ISO8601} %-5p %c{1.}:%L - %m%n"

このうち.command実行コマンドは、フォルダー内のすべてのログファイルtail -Fを監視するコマンドを指定します。ログ ファイル グループを指定します。ここにはグループが 1 つだけありますバッチ転送サイズを設定します。ここでは 1000 に設定されています。バッチ転送のタイムアウトを設定します。ここでは 30 秒に設定されています。/var/logs/*.log.filegroupslogs.batchSize.batchTimeout

次に、Flume を起動します。設定ファイルのパスは/etc/flume/flume.conf、コマンドは ですflume-ng agent --config conf -f flume.conf -n quickstart-agent -Dflume.root.logger=INFO,consoleその後、Flume が正常に起動するまで待ちます。ログ データがコンソールに出力され始めていることがわかります。

3.3 データ収集

データ収集は、ログ データの最も基本的なリンクです。ログ データは通常、次の段階を経ます。

  1. 収集: ログ ファイルを読み取り、ログ サーバーなどからログを取得し、Flume が配置されているマシンにログ データを読み取ります。

  2. 分割: ログ ファイルが大きすぎる場合は、ログ ファイルを分割する必要があります。Flume は、SpoolDirArchive や TaildirNewLineEscaped スプリッターなど、ログ ファイルのセグメント化を完了するためのいくつかのプラグインを提供します。

  3. 解析: Flume は、RegexParser、Log4jEventDeserializer などの複数のログ形式パーサーをサポートします。ログ データは解析された後、指定された形式に従ってメモリ キャッシュに保存されます。

  4. ルーティング: Flume は、フィルタリング ルールを構成することによって、修飾されたログ データを指定されたチャネルに送信します。

  5. 消費: ログ データがチャネルに入ると、Flume はログ データを順番に消費し、指定された宛先に (HDFS、HBase、MySQL など) 書き込みます。

  6. クリーニング: Flume は、特殊文字の削除、IP アドレス変換、重複排除など、さまざまなログデータのクリーニング方法をサポートしています。

具体的な手順:

  1. ログ ソースからログ データを読み取る: ExecSource または SpoolDirectorySource をデータ ソースとして使用して、ログ データを Flume キャッシュ チャネルに書き込むことができます。

  2. データの解析とクリーンアップ: Flume は、RegexParser、Log4jEventDeserializer などの複数のログ形式パーサーをサポートしています。カスタム パーサーを作成することもできます。同時に、Flume は、特殊文字の削除、IP アドレス変換、重複排除など、さまざまなログデータのクリーニング方法をサポートしています。

  3. ルーティング ルールに従ってチャネルにデータを送信する: Flume は、正規表現、イベント タイプ、タイムスタンプ、ホストなどに基づくルーティング ルールをサポートしています。

  4. データをチャネルに保存する: Flume は、メモリ チャネル、ファイル チャネル、データベース チャネルなど、複数のタイプのチャネルをサポートします。さまざまなタイプのチャネルは、構成ファイルを通じて柔軟に構成できます。

  5. 宛先にデータを書き込む: Flume は、HDFS、HBase、MySQL などを含む複数の宛先をサポートしており、構成ファイルを通じて柔軟に構成できます。

3.4 データ処理

データ処理は、ログ データ収集の次のステップです。主なタスクは次のとおりです。

  1. データ分析: Flume によってキャッシュされたログ データをビジネス ニーズに応じて分析し、ビジネス関連の指標やデータを形成します。

  2. ログ品質評価:Flumeがキャッシュしたログデータの精度、完全性、操作性などを評価し、異常なデータを発見し、適切に対処します。

  3. データ レポート: Flume によってキャッシュされたログ データに対する要約、カウント、クエリなどの操作を行ってデータ レポートを作成し、ビジネス関連担当者に提示します。

  4. データストレージ: Flume によってキャッシュされたログデータを、HDFS、MySQL などのさまざまなストレージデバイスに保存します。

  5. パイプライン データ処理: ログの収集、処理、保存のプロセス中に、さまざまなリンク間でログ データを転送できるようにデータ処理パイプラインを設計できます。

具体的な手順:

  1. MapReduce や Spark などのビッグ データ処理フレームワークを使用して、Flume によってキャッシュされたログ データを分析および処理します。

  2. Hive、Impala、Drill などの SQL エンジンを介して、Flume のキャッシュされたログ データをクエリします。

  3. Flume が提供する HTTP Post Sink を使用して、Elasticsearch、Kafka などの外部システムにデータを同期します。

  4. Flume が提供する Sqoop ソースと Sqoop コネクタを使用して、データを Hadoop クラスターにインポートします。

  5. Flume が提供する JDBC チャネルを使用して、データをリレーショナル データベースにインポートします。

  6. Flume が提供する JMS シンクを使用して、データを外部システムに同期します。

おすすめ

転載: blog.csdn.net/universsky2015/article/details/133504367