Flumeの基本
1. Flumeとは何ですか?
Flumeは、データ収集とログ収集のフレームワークであり、分散方式で収集されます(高可用性分散)
エッセンス:ログデータはさまざまなWebサーバーから効率的に収集され、HDFS、hbaseに保存されます。
2. Flumeはどのデータソースに接続できますか?
コンソール、RPC、テキスト、テール、Syslog、Exec等
3. Flumeが受け入れるデータソースの出力先は何ですか?
ネットワーク経由で送信されるディスク、hdfs、hbase、kafka
データ-> flume-> kafka-> sparkストリーミング/ストーム/フリンク-> hbase、mysql
4.サーバーのログデータの収集を担当するサーバーでのエージェント展開のプロセス
5. Flumeは、イベントを使用して、内部データ送信の基本単位であるデータ送信の形式としてイベントオブジェクトを使用します。
2つの部分:再印刷されたデータのバイト配列+オプションのヘッダーで構成されます
6.エージェント:3つの重要なコンポーネント:
ソース:水路のデータソースを示します
チャネル:ストレージプール
ファイル:データが失われないこと、および速度が比較的遅いことを確認します
メモリ:データが失われる可能性があり、より速く
データ送信が完了すると、イベントはチャネルから削除されます-(信頼性)
シンク:イベントを外部メディアに転送します
• 特徴:
–データ収集のためにログシステムでさまざまなデータ送信者をカスタマイズすることをサポートします
– Flumeは、データを簡単に処理し、さまざまなデータ受信者に書き込む機能を提供します(カスタマイズ可能)
Flumeの機能
- Flumeは、分散型で信頼性が高く、可用性の高い大量のログ収集、集約、および送信システムです。
- Flumeは、ファイル、ソケットパケット、ファイル、フォルダー、kafkaなどのさまざまな形式のソースデータを収集できます。
- また、収集したデータをHDFS、hbase、hive、kafkaなどの多くの外部ストレージシステムに出力することもできます。
- 一般的な収集要件は、水路の簡単な構成によって達成できます
- Flumeには、特別なシナリオ向けの優れたカスタム拡張機能もあるため、Flumeはほとんどの毎日のデータ収集シナリオに適用できます。
- Flumeパイプはトランザクションに基づいており、データの送受信の一貫性を確保します。
- Flumeは、マルチパストラフィック、マルチチャネルアクセストラフィック、マルチチャネルアクセストラフィック、コンテキストルーティングなどをサポートします。
Flumeコア
Flumeイベント
•イベントオブジェクトは、Flume内のデータ送信の最も基本的な単位です。
•2つの部分:イベントは、再印刷されたデータのバイト配列とオプションのヘッダーで構成されます
•イベントは、0個以上のヘッダーと本文で構成されます
•ヘッダーはキー/値の形式であり、ルーティングの決定を行ったり、その他の構造化された情報(イベントのタイムスタンプやイベントが発生したサーバーのホスト名など)を伝達したりするために使用できます。HTTPヘッダーと同じ機能を提供するものと考えることができます。この方法を使用して、追加情報を本文の外部に送信します。
•本文は、実際のコンテンツを含むバイト配列です。
ヘッダー(オプション)->キー
body(data)-> value
Flumeエージェント
• Flume内に1つ以上のエージェントがあります
•各エージェントは独立したデーモン(JVM)です
•クライアントまたは他のエージェントからコレクションを受信し、取得したデータを次の宛先ノードエージェントにすばやく送信する場所
•エージェントは主に、ソース、チャネル、シンクの3つのコンポーネントで構成されています。
エージェントソース
•Flumeソース
•Webサーバーから配信されたイベントなどの外部ソース(データジェネレーター)を担当します
•外部ソースは、Flumeが認識できる形式でイベントをFlumeに送信します
•Flumeソースがイベントを受信すると、1つ以上のチャネルを介してイベントを保存します
エージェントチャネル
•チャンネル:でのフォームパッシブストレージ、チャンネルがキャッシュするイベントがするまで、イベントをシンクコンポーネントによって処理され、
•したがって、チャネルは短命のストレージコンテナです。シンクによって消費されるまで、ソースから受信したイベント形式のデータをキャッシュします。ソースとシンクの間のブリッジとして機能し、チャネルは完全なものです。トランザクション、これにより、送受信時のデータの一貫性。また、任意の数のソースおよびシンクとリンクできます。
•イベントの最大数はパラメータで設定できます
•Flumeは通常、メモリチャネルではなくファイルチャネルを選択します
–メモリチャネルl:メモリストレージトランザクション、スループットレートは非常に高いですが、データ損失のリスクがあります
–ファイルチャネル:データが失われないようにするためのローカルディスクのトランザクション実装モード(WAL実装)先行書き込みログ(ディスクへの先行書き込みログ)
エージェントシンク
•シンクはチャネルからイベントを削除し、外部データメディアにイベントを配置します
-例:スルーFlume HDFSシンクを介してデータをHDFSに配置するか、次の処理FlumeまでソースFlumeの隣に配置します。
–チャネルにキャッシュされたイベントの場合、ソースとシンクは非同期で処理されます
•シンクがイベントを正常に取得したら、チャネルからイベントを削除します
•シンクは正確なチャネルに作用する必要があります
•さまざまなタイプのシンク:
–イベントを最終的な宛先端末に保存します:HDFS、Hbase
–自動消費:ヌルシンク
–エージェント間の通信に使用:Avro
エージェントインターセプト
•インターセプタは、一連のあるインターセプタソースのため、プリセットの順序と、必要な場合に応じてフィルタやイベントをカスタマイズ
処理ロジックの実装
•アプリ(アプリケーションログ)とソースの間で、アプリログが傍受されます。つまり、ログに入力します
ソースの前に、ログのパッキング、更新、フィルタリングなどのアクションを実行します
•公式に提供されている既存の迎撃機は次のとおりです。
–タイムスタンプインターセプター:イベントのヘッダーに次のキーを追加します:タイムスタンプ、値は現在のタイムスタンプです
–ホストインターセプター:次のイベントのヘッダーにキーを追加します:ホスト、値は現在のマシンのホスト名またはIPです
–静的インターセプター:イベントのヘッダーにカスタムキーと値を追加できます
– Regex Extractor Interceptor:正規表現を介してヘッダーに指定されたキーを追加します。値は、正規表現の一部です。
•Flumeのインターセプターもチェーンの形式です。ソースに複数のインターセプターを指定して、それらを順番に処理できます。
エージェントセレクター
•チャネルセレクタには次の2種類があります。
チャネルセレクタの複製(デフォルト):ソースからすべてのチャネルにイベントを送信します
マルチプレックスチャネルセレクター:マルチプレックス は、どのチャネルへのヘアを選択できます
•データソースを選択的に選択するには、分散方法として多重化を使用する必要があることは明らかです。
•問題:多重化では、特定のチャネルに配布することを決定するために、ヘッダーで指定されたキーの値を決定する必要があります。demoとdemo2が同じサーバーで同時に実行されている場合、それらが異なるサーバーで実行されている場合、それをsource1に追加できます。ホストインターセプター。これにより、ヘッダーでホストがイベントを配信するチャネルを決定できます。これは同じサーバー上にあります。ホストはログのソースを区別できません。ログのソースを見つける必要があります。ログのソースを区別するためにヘッダーキーに1つ追加する方法
アップストリームにさまざまなソースを設定することで解決できます
信頼性:
•Flumeは、シングルジャンプの信頼性を保証します。転送が完了すると、イベントはチャネルから削除されます。
•Flumeは、トランザクション方式を使用して、イベントの相互作用の信頼性を確保します。
•プロセス全体で、ネットワークの中断などの理由でステップが強制的に終了した場合、次回はデータが再送信されます。
•水路の信頼性は、データの一時的な保存にも反映されます。ターゲットにアクセスできない場合、データはチャネルに一時的に保存されます。ターゲットにアクセスできるようになると、データは一時的に保存されます。
送信Taildirブレークポイント再送信を実行します
•ソースとシンクは、トランザクションの保存と取得にカプセル化されます。つまり、イベントの配置または提供は、チャネルを介したトランザクションによって個別に提供されます。この保証
ストリーム内のイベントセットの信頼性の高いエンドツーエンド配信を実現するため。
–シンクがトランザクションを開始します
–シンクはチャネルからデータを取得します
–シンクはデータを別のFlumeエージェントのソースに送信します
-ソースがトランザクションを開きます
–ソースはデータをチャネルに送信します
-ソースはトランザクションを閉じます
–シンクはトランザクションを閉じます
水路の練習:
エージェントの名前を変更します:a1
ソース:r1
シンク:k1
チャネル:c1
] #vim flume.conf
flume-ngを実行します
./bin/flume-ng agent --conf conf --conf-file ./conf/flume.conf -name a1 -Dflume.root.logger = DEBUG、console
要件1:netcatをソースとして使用し、シンクをロガーとして使用する
./bin/flume-ng agent --conf conf --conf-file ./conf/example.conf -name a1 -Dflume.root.logger = INFO、console
要件2:netcatをソースとして使用し、シンクをロガーとして使用するようになりました。文字を気にし、数字を除外します。
./bin/flume-ng agent --conf conf --conf-file ./conf/example.conf -name a1 -Dflume.root.logger = INFO、console
要件3:hdfsに書き込むためのソースおよびシンクとしてnetcatを使用する
./bin/flume-ng agent --conf conf --conf-file ./conf/example.conf -name a1 -Dflume.root.logger = INFO、console
小さなファイルが多すぎるのを防ぐために水路を設定するにはどうすればよいですか?
a。ファイルのファイルデータサイズを制限する
a1.sinks.k1.hdfs.rollSize = 200 * 1024 * 1024
b。ファイルに保存できるイベントの数を制限する
a1.sinks.k1.hdfs.rollCount = 10000
要件4:ソースおよびシンクとしてHTTP経由でロガーに書き込む
./bin/flume-ng agent --conf conf --conf-file ./conf/header_test.conf -name a1 -Dflume.root.logger = INFO、console
curl -X POST -d '[{"headers":{"timestamp": "434324343"、 "host": "random_host.example.com"}、 "body": "random_body"}、{"headers":{ "namenode": "namenode.example.com"、 "datanode": "random_datanode.example.com"}、 "body": "badou、badou"}] 'master:50020
ここでは、slave1を介して通常どおりにアクセスすることもできます
要件5:エージェントを直列操作で接続するagent-> agent
1、スレーブ2:
./bin/flume-ng agent -c conf -f conf / pull.conf -n a2 -Dflume.root.logger = INFO、console
2、マスター:
./bin/flume-ng agent -c conf -f conf / push.conf -n a1 -Dflume.root.logger = INFO、console
3.マスターで実行します
telnet localhost 44444
要件5:Flumeを介してログファイルの変更を監視し、最後にロガーにシンクしてjson形式のファイルを取得します
python flume_data_write.py
./bin/flume-ng agent --conf conf --conf-file ./conf/flume_kafka.conf -name a1 -Dflume.root.logger = INFO、console
要件6:flume + kafka
1.最初にzookeeperを起動します
./zkServer.sh start
Zookeeperの構成:1。vimzoo.cfg 2. vim data / myidは、書き込まれた番号の番号です
2.マスターはkafka(ポート9092)を開始します
./bin/kafka-server-start.sh config / server.properties&(バックグラウンドスタート)
プロセスが正常に開始されたかどうかを確認する3つの方法:
jobs -l:バックグラウンドプロセスを表示する
ps -ef | grep 32918:バックグラウンドプロセスを表示する
netstat -anp | grep 9092:ポート番号を表示
-kafkaトピックを表示
bin / kafka-topics.sh --list --zookeeper localhost:2181
-トピックを作成する
bin / kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic badou_for_20
-消費badou_for_20トピック
./bin/kafka-console-consumer.sh --zookeeper master:2181 --topic badou_for_20--from-beginning
3.水路を開始します
./bin/flume-ng agent --conf conf --conf-file ./conf/flume_kafka.conf -name a1 -Dflume.root.logger = INFO、console
4.ログファイルをクリアします
エコー ''> flume_exec_test.txt
5. python flume_data_write.pyを実行して、バックエンドログのログファイルへの書き込みをシミュレートします
# -*- coding: utf-8 -*-
import random
import time
import pandas as pd
import json
writeFileName="/usr/local/src/badou_code/flume/data/flume_exec_test.txt"
cols = ["order_id","user_id","eval_set","order_number","order_dow","hour","day"]
df1 = pd.read_csv('/usr/local/src/badou_code/hive/data/orders.csv')
df1.columns = cols
df = df1.fillna(0)
with open(writeFileName,'a+')as wf:
for idx,row in df.iterrows():
d = {}
for col in cols:
d[col]=row[col]
js = json.dumps(d)
wf.write(js+'\n')
# rand_num = random.random()
# time.sleep(rand_num)