Flume: データ収集メカニズム

1.水路とは

  • データの送信元やデータの大きさに関係なく、Flume を導入することで、データが安全かつタイムリーにビッグ データ プラットフォームに確実に到達し、ユーザーはデータに関する洞察を得る方法に集中できます。
水路の定義
  • Cloudera によって開発された Flume は、大量のログを収集、集約、送信するための、信頼性と可用性の高い分散型システムです。
  • Flume は、データ収集のためのログ システムのさまざまなデータ送信者のカスタマイズをサポートしています。
  • Flume は、データを単純に処理し、さまざまなデータ レシーバーに書き込む機能を提供します。
  • 簡単に言うと、Flume はリアルタイムでログを収集するデータ収集エンジンです。

Flume には 3 つの重要なコンポーネントがあります。
  • ソース
  • チャネル
  • シンク
特徴:
  • 分散: Flume 分散クラスター展開、優れたスケーラビリティ
  • 優れた信頼性: ノードに障害が発生した場合でも、ログは失われることなく他のノードに転送できます。
  • 使いやすさ: Flume の設定と使用は面倒であり、ユーザーには高度な専門スキルが必要です。
  • リアルタイム収集: リアルタイム データ収集用の Flume 収集フロー モード
該当するシーン:
  • ログファイルのリアルタイム収集に適しています
その他のデータ収集ツール
  • dataX: Alibaba オープン ソース ソフトウェアの異種データ ソース オフライン同期ツール、インターフェイスなし、実行スクリプト モードで実行
  • Xkettle: オープンソース ETL ツール、視覚的な操作のためのビジュアル デザイナーを備え、使いやすい
  • Logstash: アプリケーション ログとイベントの送信、処理、管理、検索のためのプラットフォーム。アプリケーション ログを一元的に収集および管理するために使用でき、クエリと統計のための Web インターフェイスを提供します。
  • Scribe: Facebook のオープンソース ログ収集システム。さまざまなログ ソースからログを収集し、中央ストレージ システム (NFS、分散ファイル システムなど) に保存して、集中的な統計分析と処理を容易にします。
  • スクープ: 更新予定

2. 水路アーキテクチャ

点線の内側はエージェントであり、本質的には JVM です。

内部组件: source、channel、sink
  • Flume アーキテクチャのコンポーネント:
エージェント:
  • --本質的に、これは、外部ログ プロデューサーから宛先 (または次のエージェント) へのイベント データ フローの送信を制御する JVM プロセスです。
  • 完全なエージェントには、ソース、チャネル、シンクの 3 つのコンポーネントが含まれています。ソースはデータのソースとメソッドを指し、チャネルはデータのバッファ プールで、シンクはデータ出力のメソッドと宛先を定義します。
ソース:
  • -- Flume エージェントへのデータの受信を担当するコンポーネントです。
  • Source コンポーネントは、avro、exec、spooldir、netcat など、さまざまなタイプと形式のログ データを処理できます。
チャネル:
  • -- はソースとシンクの間のバッファーです。
source内存肯定是有限的,大批量数据压进去,需要一个缓冲区
  • チャネルでは、ソースとシンクを異なるレートで動作させることができます
  • チャネルはスレッドセーフであり複数のソースからの書き込み操作と複数のシンクからの読み取り操作を同時に処理できます
  • 一般的に使用されるチャネルには次のものがあります。
-- Memory Channel 
Memory Channel是内存中的队列。Memory Channel在允许数据丢失的情景下适用。
如果不允许数据丢失,应该避免使用Memory Channel,
因为程序死亡、机器宕机或者重启都可能会导致数据丢失;

--File Channel
File Channel将所有事件写到磁盘。
因此在程序关闭或机器宕机的情况下不会丢失数据

-- kafka Channel:见kafka部分
シンク
  • チャネルから継続的にデータを取得し、宛先に送信します。
-- 不断地轮询Channel中的事件且批量地移除它们,
并将这些事件批量写入到 存储或索引系统、或者被发送到另一个Flume Agent。 
  • シンクは完全にトランザクションです
在从Channel批量删除数据之前,每个Sink用Channel启 动一个事务。
批量事件一旦成功写出到存储系统或下一个Flume Agent,Sink就 利用Channel提交事务。
  • -- トランザクションがコミットされると、チャネルは内部バッファからイベントを削除します。
イベント:
  • これは、Flume によって定義されたデータ フロー送信の小さな単位です。

3. 水路トポロジー

3.1 シリアルモード

  • 最初のソースから開始して、最終シンクが転送する宛先ストレージ システムまで、複数のフロームを順番に接続します。
  • このモードは、多すぎる水路をブリッジする場合には推奨されません。水路が多すぎると、伝送速度に影響を与えるだけでなく、送信プロセス中にノードの水路がダウンすると、伝送システム全体にも影響します。

3.2 レプリケーション モード (単一ソース複数チャネル、シンク モード)

  • イベントを 1 つ以上の宛先にストリーミングします。このモードではデータ ソースが複数のチャネルにコピーされ、各チャネルには同じデータが含まれ、シンクは異なる送信先を選択できます。

3.3 負荷分散モード (単一ソース、チャネル複数シンク)

  • 複数のシンクは論理的に 1 つのシンク グループに分割され、flume は主にロード バランシングとフェイルオーバーの問題を解決するために、異なるシンクにデータを送信します。
第一个失败了就往第二个发

3.4 集約モード

  • このモデルは一般的であり、非常に実用的であり、毎日の Web アプリケーションは通常、数百台のサーバー、大きな場合には数千台または数万台のサーバーに分散されます。生成されたログの処理も非常に面倒です。この組み合わせは、この問題を非常にうまく解決できます。各サーバーは、ログを収集するために Flume をデプロイし、ログを一元的に収集する Flume に転送し、その後、flume から hdfs、hive、hbase、およびメッセージ キューにアップロードします。

最後に、それを Flume で集約し、HDFS に入れます。

4. Flume の内部原則

总体数据流向:Souce => Channel => Sink
  • チャネル: プロセッサ、インターセプタ、セレクタ

図中の数字は実行順序を示します。赤はチャネル処理の内部プロセスであり、複数のチャネルおよび複数のシンクが存在する場合があります。

具体的なプロセス
  • ソースはイベントを受信し、それをチャネル プロセッサに渡してイベントを処理します。
  • プロセッサがインターセプタを渡す インターセプタ
拦截器不止一个,可能是多个串联,对事件一些处理,比如压缩解码,正则拦截,时 间戳拦截,分类等
  • インターセプターによって処理されたイベントはチャネル セレクターに渡され、イベントは対応するチャネルに書き込まれます。
  • チャネル セレクターセレクターには 2 つのタイプがあります。
  1. チャネル セレクターの複製(デフォルト)を複製する
会将source过来的Event发往所有 Channel(比较常用的场景是,用多个Channel实现冗余副本,保证可用性) 

2. 多重化チャネルセレクターの選択

根据配置分发event。
此selector会根据 event中某个header对应的value来将event发往不同的channel 
  • 最後に、シンク プロセッサは各チャネルのイベントを処理します。

5. 基本的なアプリケーション

  • Flume は、ディレクトリ、http、kafka などを含む、さまざまなタイプのデータ ソースをサポートしています。Flume は、データ ソースを収集するための Source コンポーネントを提供します。
  • ログ収集とは、ビジネスニーズに応じて適切なSource、Channel、Sinkを選択し、組み合わせることです。

5.1 一般的なソース

アブロ出典:

--Avro ポートをリッスンして、外部 avro クライアントからイベント ストリームを受信します。avro-source が受信するのは avro-serialized データであり、その後、deserialized データが送信され続けます。avro ソースの場合、ソース データは avro シリアル化データである必要があります。Avro ソースを使用すると、マルチレベル フロー、ファンアウト フロー、ファンイン フロー、その他の効果を実現できます。flume が提供する avro クライアントを通じて送信されたログ情報を受信します。

実行ソース:

-- コマンドによって生成された出力はソースとして使用できます。ping 192.168.234.163、tail -f hive.log など。

ネットキャットソース

-- NetCat ソースは、指定されたポートをリッスンし、監視されたデータを受信するために使用されます。

スプールディレクトリソース:

---指定したファイルを「自動収集」ディレクトリに追加します。Flume は引き続きこのディレクトリを監視し、ファイルをソースとして処理します。注: ファイルをディレクトリに配置すると、変更することはできません。変更すると、Flume はエラーを報告します。また、同じ名前のファイルは存在できません。

Taildir 出典:

--指定された複数のファイルを監視します。ファイルに新しく書き込まれたデータがあると、指定されたシンクに書き込まれます。このソースは信頼性が高く、データが失われることはありません。追跡されたファイルは処理されず、名前の変更や削除も行われず、いかなる変更も行われません。現在、Windows システムはサポートされておらず、バイナリ ファイルの読み取りもサポートされておらず、テキスト ファイルの 1 行ずつの読み取りもサポートされています。

5.2 チャネルコンポーネント: キャッシュデータ

  • 収集されたログはキャッシュする必要があり、Flume はデータをキャッシュするための Channel コンポーネントを提供します。共通チャネルには次のものが含まれます。

(1) メモリチャネル: メモリにキャッシュされます (共用)

(2) ファイルチャネル: ファイルへのキャッシュ

(3) JDBC チャネル: JDBC を通じてリレーショナル データベースにキャッシュされます。

(4) kafka チャネル: kafka にキャッシュされます

5.3 シンクコンポーネント

  • キャッシュされたデータは最終的に保存する必要があり、Flume はデータを保存するための Sink コンポーネントを提供します。一般的なシンクには次のものがあります。

(1) ロガーシンク: 標準出力に情報を表示し、主にテストに使用されます。

(2) avro シンク: Flume イベントはシンクに送信され、Avro イベントに変換され、構成されたホスト名/ポートに送信されます。設定されたバッチサイズに従って、設定されたチャネルからイベントをバッチで取得します

(3) null シンク: 受信したイベントをすべて破棄します。

(4) HDFS シンク: イベントを HDFS に書き込みます。テキスト ファイルとシーケンス ファイルの作成をサポートし、両方のファイル タイプの圧縮をサポートします。データの経過時間、サイズ、イベント数に基づいてファイルを定期的にスクロールできます。

(5) Hive シンク: このシンク ストリームは、分割テキストまたは JSON データを含むイベントを Hive テーブルまたはパーティションに直接送信します。Hive トランザクションを使用してイベントを書き込みます。一連のイベントが Hive に送信されると、Hive によってすぐにクエリを実行できます。

(6) HBase シンク: HBase に保存

(7) kafka シンク: kafka に保存

ログ収集とは、ビジネスニーズに応じて適切なSource、Channel、Sinkを選択し、組み合わせることです。

6. 入門ケース

  • 中国語の Flume ヘルプドキュメント:  Flume 1.9 ユーザーマニュアル中国語版
  • ビジネス要件: ローカル ポート 8888 を監視すると、Flume は監視されたデータをリアルタイムでコンソールに表示します。

6.1 要件分析:

  • Telnet ツールを使用してデータをポート 8888 に送信します
  • ポートデータをリッスンし、netcat ソースを選択します
(5.1中的netcat source:) 
  • チャネルはリアルタイム表示用のメモリ データを選択し、ロガー シンクを選択します

6.2 実装手順:

  • 1. Telnet ツールをインストールする
yum install telnet1
  • 2. ポート 8888 が占有されているかどうかを確認します。ポートが占有されている場合は、別のポートを使用してタスクを完了することを選択できます
lsof -i:8888

ポートが占有されていることが初めてわかった場合は、プロセスをシャットダウンして再度確認し、占有されていないことがわかった場合は、kill を使用してポートを占有しているプロセスを強制終了します。

  • 3. Flume エージェント構成ファイルを作成します。flume-netcat-logger.conf
通过查阅文档,找到设置参数,没有默认值(缺省值)的一定要进行设置

-- 具体参数设置看前面6.1的需求分析,选择source channel sin类型,配置端口号

netcat を検索します。デフォルト値がない場合は、設定に記述する必要があります。デフォルト値がある場合は、デフォルト値を使用できます。

# a1是agent的名称。source、channel、sink的名称分别为:r1  c1  k1 
a1.sources = r1 
a1.channels = c1 
a1.sinks = k1

# source 
a1.sources.r1.type = netcat     # type组件类型,这次选用netcat型的source
a1.sources.r1.bind = 192.168.10.103   # bind: 要监听的主机名hostname或IP地址
a1.sources.r1.port = 8888      # port: 监听的端口号:根据需求要监听8888端口 

# channel 
a1.channels.c1.type = memory     # type组件类型,这次选用memory型的channel
a1.channels.c1.capacity = 10000    #capacity:内存中存储Event的最大数,默认值100太小,手动设置为10000
a1.channels.c1.transactionCapacity = 100   #  transactionCapacity source或者sink 每个事务中存取 Event的操作数量(不能比capacity大)

# sink 
a1.sinks.k1.type = logger       # type组件类型,这次选用logger 型的sink
 
# source、channel、sink之间的关系 
a1.sources.r1.channels = c1   #sources.r1 的 channel 是 c1
a1.sinks.k1.channel = c1      #sink k1 的 channel 是 c1
  • うまくいかない場合は、コメントを削除し、設定ファイルが正しく貼り付けられているかどうかをよく確認してください。

-- メモリ チャネルは、メモリ バッファリングされたイベントを使用するチャネル実装です。速度は比較的速いですが、容量は jvm メモリ サイズによって制限され、信頼性は十分に高くありませんデータ損失は許容されるものの、高いパフォーマンス要件が必要なログ収集サービスに適しています。

  • 4. Flume エージェントを開始する
$FLUME_HOME/bin/flume-ng agent --name a1 \              
--conf-file $FLUME_HOME/conf/flume-netcat-logger.conf \ 
-Dflume.root.logger=INFO,console

-- 写成一行
flume-ng agent --name a1 --conf-file flume-netcat-logger.conf -Dflume.root.logger=INFO,console
  • コマンド説明
* 反斜杠表示一行命令还没输完,告诉命令行先不要执行,另起一行输命令
1. flume-ng 说明是新一代的flume引擎
2. agent --name a1:  表示 name。定义agent的名字,要与参数文件一致 
3. conf-file。指定参数文件位置 
4.-D表示flume运行时动态修改 flume.root.logger 参数属性值,并将控制台日志 打印级别设置为INFO级别。
6. 在屏幕上显示的日志,日志的级别是什么,日志显示在什么地方(console即命令窗口)
7. 日志级别包括:log、info、warn、error
  • 5. Telnet を使用して、このマシンの 8888 ポートにメッセージを送信します。
telnet 192.168.10.103 8888
  • 6. Flume監視ページでデータ受信状況を確認する

-- ここに入力し、そこで更新します

INFO sink.LoggerSink: Event: { headers:{} body: 68 65 6C 6C 6F 20 77 6F 72 6C 64 0D
             hello world. } 
INFO sink.LoggerSink: Event: { headers:{} body: 41 72 65 20 79 6F 75 20 6F 6B 3F 0D
             Are you ok?. }

6.3 メッセージなしの解決

  • 1 つの小さなバグがメッセージを受信しませんでした

00:00 / 00:07

倍速

HD

00:07

  • 設定ファイルが正しく書き込まれていない

行を書かないでください

  • 構成を修正した後、正常に実行されました

00:00 / 00:50

倍速

HD

00:50

7. 先進事例

7.1 HDFS へのログ ファイル情報の監視

  • ビジネス要件: ローカル ログ ファイルを監視し、収集したコンテンツをリアルタイムで HDFS にアップロードします
需要分析:
  • tail -F コマンドを使用して、ローカル ログ ファイルによって生成された情報ソースを検索し、[exec] を選択します。
  • exec は、指定されたコマンドをリッスンし、コマンドの結果をデータ ソースとして取得します。
  • ソース コンポーネントは、このコマンドの結果からデータを取得します。エージェント プロセスがハングして再起動されると、データが失われる可能性があります。
  • チャンネルセレクトメモリー
  • シンク選択 HDFS
tail -f
等同于--follow=descriptor,根据文件描述符进行追踪,
当文件改名或被删除,追踪停止

tail -F
等同于--follow=name --retry,根据文件名进行追踪,并保持重试,
即该文件被删除或改名后,如果再次创建相同的文件名,会继续追踪
実装手順
  • 環境整備
Flume要想将数据输出到HDFS,必须持有Hadoop相关jar包。
commons-configuration-1.6.jar 
hadoop-auth-2.9.2.jar 
hadoop-common2.9.2.jar 
hadoop-hdfs-2.9.2.jar commons-io-2.4.jar 
htrace-core4-4.1.0-incubating.jar
-- 拷贝到 $FLUME_HOME/lib 文件夹下
  • ファイルをコピーする
# 在
$HADOOP_HOME/share/hadoop/httpfs/tomcat/webapps/webhdfs/WEBINF/lib 有这些文件
cd
$HADOOP_HOME/share/hadoop/httpfs/tomcat/webapps/webhdfs/WEBINF/lib
-- 要是报错,就用cd 一点一点进到这个目录里,再cp
cp commons-configuration-1.6.jar $FLUME_HOME/lib/
cp hadoop-auth-2.9.2.jar $FLUME_HOME/lib/
cp hadoop-common-2.9.2.jar $FLUME_HOME/lib/
cp hadoop-hdfs-2.9.2.jar $FLUME_HOME/lib/
cp commons-io-2.4.jar $FLUME_HOME/lib/
cp htrace-core4-4.1.0-incubating.jar $FLUME_HOME/lib/
  • 設定ファイル flume-exec-hdfs.conf を作成します。
# Name the components on this agent
a2.sources = r2
a2.sinks = k2
a2.channels = c2


# Describe/configure the source
a2.sources.r2.type = exec
a2.sources.r2.command = tail -F /opt/servers/hive-2.3.7/logs/hive.log

# Use a channel which buffers events in memory
a2.channels.c2.type = memory
a2.channels.c2.capacity = 10000
a2.channels.c2.transactionCapacity = 500

# Describe the sink
a2.sinks.k2.type = hdfs
a2.sinks.k2.hdfs.path = hdfs://192.168.10.101:9000/flume/%Y%m%d/%H%M

# 上传文件的前缀
a2.sinks.k2.hdfs.filePrefix = logs-

# 是否使用本地时间戳
a2.sinks.k2.hdfs.useLocalTimeStamp = true

# 积攒500个Event才flush到HDFS一次
a2.sinks.k2.hdfs.batchSize = 500

# 设置文件类型,支持压缩。DataStream没启用压缩
a2.sinks.k2.hdfs.fileType = DataStream

# 1分钟滚动一次
a2.sinks.k2.hdfs.rollInterval = 60
# 128M滚动一次
a2.sinks.k2.hdfs.rollSize = 134217700

# 文件的滚动与Event数量无关
a2.sinks.k2.hdfs.rollCount = 0
# 最小冗余数
a2.sinks.k2.hdfs.minBlockReplicas = 1
# Bind the source and sink to the channel
a2.sources.r2.channels = c2
a2.sinks.k2.channel = c2

注: 構成ファイル内の 2 つの場所に特に注意してください。
  • 1. hive.logのパス
1. hive.log的路径
hive.log 在我的虚拟机上是存在/opt/servers/hive-2.3.7/logs/hive.log下的, 所以
a2.sources.r2.command = tail -F /opt/servers/hive-2.3.7/logs/hive.log

hive.logの場所を確認する

  • 2. クラスター namenode の hdfs ポートは、hadoop 構成ファイル core-site の xml と一致している必要があります。そうでない場合、hdfs は接続できません。

Diamon: HDF に接続できません。java.net.ConnectException: 接続が拒否されました 2 同意 · 0 コメント 記事編集

00:00 / 00:52

倍速

HD

00:52

  • エージェントの開始
$FLUME_HOME/bin/flume-ng agent --name a2 \
--conf-file ~/conf/flume-exec-hdfs.conf \
-Dflume.root.logger=INFO,console



-- cd 到配置文件的目录 
cd $FLUME_HOME/conf

-- -- 在conf 目录下执行
flume-ng agent --name a2 --conf-file flume-exec-hdfs.conf -Dflume.root.logger=INFO,console
  • HadoopとHiveを起動し、Hiveを操作してログを生成する
start-dfs.sh
start-yarn.sh
# 在命令行多次执行
hive -e "show databases"

00:28 / 00:59

倍速

HD

Flumeアップロードログ

  • hdfs で生成されたログ ファイルを表示する
 hdfs dfs -ls /flume


-- 因为配置中设置了输出路径是
a2.sinks.k2.hdfs.path = hdfs://192.168.10.101:9000/flume/%Y%m%d/%H%M

7.2 監視ディレクトリから HDFS への情報の収集

ビジネスニーズ
  • 指定されたディレクトリを監視して情報を収集し、リアルタイムで HDFS にアップロードします
需要分析
  • ソース選択 spooldir
spooldir 能够保证数据不丢失,且能够实现断点续传
  • チャンネルセレクトメモリー
  • シンク選択 HDFS
-- spooldir Source监听一个指定的目录,
即只要向指定目录添加新的文件,source组件就可以获取到该信息,并解析该文件的内容,写入到channel。

-- sink处理完之后,标记该文件已完成处理,文件名添加 .completed 后缀。

-- 虽然是自动监控整个目录,但是只能监控文件,
如果以追加的方式向已被处理的文件中添加内容,source并不能识别。

--需要注意的是:

拷贝到spool目录下的文件不可以再打开编辑
无法监控子目录的文件夹变动
被监控文件夹每500毫秒扫描一次文件变动
适合用于同步新文件,但不适合对实时追加日志的文件进行监听并同步
成し遂げる
  • 設定ファイルを作成します。flume-spooldir-hdfs.conf
# Name the components on this agent
a3.sources = r3
a3.channels = c3
a3.sinks = k3

# Describe/configure the source
a3.sources.r3.type = spooldir
a3.sources.r3.spoolDir = /root/upload
a3.sources.r3.fileSuffix = .COMPLETED
a3.sources.r3.fileHeader = true

# 忽略以.tmp结尾的文件,不上传
a3.sources.r3.ignorePattern = ([^ ]*\.tmp)
# Use a channel which buffers events in memory
a3.channels.c3.type = memory
a3.channels.c3.capacity = 10000
a3.channels.c3.transactionCapacity = 500
# Describe the sink
a3.sinks.k3.type = hdfs
a3.sinks.k3.hdfs.path = hdfs://192.168.10.101:9000/flume/upload/%Y%m%d/%H%M

# 上传文件的前缀
a3.sinks.k3.hdfs.filePrefix = upload-
# 是否使用本地时间戳
a3.sinks.k3.hdfs.useLocalTimeStamp = true
# 积攒500个Event,flush到HDFS一次
a3.sinks.k3.hdfs.batchSize = 500
# 设置文件类型
a3.sinks.k3.hdfs.fileType = DataStream
# 60秒滚动一次
a3.sinks.k3.hdfs.rollInterval = 60
# 128M滚动一次
a3.sinks.k3.hdfs.rollSize = 134217700
# 文件滚动与event数量无关
a3.sinks.k3.hdfs.rollCount = 0
# 最小冗余数
a3.sinks.k3.hdfs.minBlockReplcaticas = 1
# Bind the source and sink to the channel
a3.sources.r3.channels = c3
a3.sinks.k3.channel = c3 
  • エージェントの開始
$FLUME_HOME/bin/flume-ng agent --name a3 \
--conf-file ~/conf/flume-spooldir-hdfs.conf \
-Dflume.root.logger=INFO,console

-- cd 到配置文件的目录 
cd $FLUME_HOME/conf

-- -- 在conf 目录下执行
flume-ng agent --name a3 --conf-file flume-spooldir-hdfs.conf -Dflume.root.logger=INFO,consoleki 
  • アップロードフォルダーにファイルを追加する
cp /root/wc.txt f.log
-- 复制一份,重命名为f.log

  • HDFS 上のデータを表示する
hdfs dfs -ls /flume/upload

00:00 / 00:59

倍速

HD

00:59

HDFS シンク
  • 通常、HDFS シンクを使用すると、ローリング ファイルが生成されます。ローリング ファイルの戦略は次のとおりです。
基于时间
hdfs.rollInterval
缺省值:30,单位秒
0禁用
基于文件大小
hdfs.rollSize
缺省值:1024字节
0禁用
基于event数量
hdfs.rollCount
10
0禁用
基于文件空闲时间
hdfs.idleTimeout
缺省值:0。禁用
基于HDFS文件副本数
hdfs.minBlockReplicas
默认:与HDFS的副本数一致
要将该参数设置为1;否则HFDS文件所在块的复制会引起文件滚动
その他の重要な構成
hdfs.useLocalTimeStamp
使用本地时间,而不是event header的时间戳
默认值:false
hdfs.round
时间戳是否四舍五入
默认值false
如果为true,会影响所有的时间,除了t%
hdfs.roundValue
四舍五入的最高倍数(单位配置在hdfs.roundUnit),但是要小于当前时间
默认值:1
hdfs.roundUnit
可选值为:second、minute、hour
默认值:second
  • HDFS シンクが小さなファイルを生成しないようにするには、次のパラメーター設定を参照してください。
a1.sinks.k1.type=hdfs
a1.sinks.k1.hdfs.useLocalTimeStamp=true
a1.sinks.k1.hdfs.path=hdfs://linux121:9000/flume/events/%Y/%m/
%d/%H/%M
a1.sinks.k1.hdfs.minBlockReplicas=1
a1.sinks.k1.hdfs.rollInterval=3600
a1.sinks.k1.hdfs.rollSize=0
a1.sinks.k1.hdfs.rollCount=0
a1.sinks.k1.hdfs.idleTimeout=0

7.3 カスケードエージェント

  • ログ ファイルを監視して HDFS およびローカル ファイル システムにデータを収集します
ビジネスニーズ
  • ログ ファイルを監視し、情報を収集し、HDFS およびローカル ファイル システムにアップロードします。
需要分析:
  • 複数のエージェント カスケード実装が必要
要有两个agent分别向 hdfs 和 本地输送日志信息 
  • ソース選択テールディレクトリ
  • チャンネルセレクトメモリー
  • 最後のシンクは、それぞれ hdfs と file_roll を選択します。
taildir ソース
  • Flume 1.7.0 で追加された新しいソースは、spooldir ソース + exec ソースと同等です。
  • 複数のディレクトリを監視し、正規表現を使用してディレクトリ内のファイル名を照合し、リアルタイム収集を行うことができます。
  • ファイルのバッチをリアルタイムで監視し、各ファイルの最新の使用場所を記録します。エージェント プロセスの再起動後にデータが失われることはありません
 目前不适用于Windows系统;其不会对于跟踪的文件有任何处理,不会重命名也不
会删除,不会做任何修改。不支持读取二进制文件,支持一行一行的读取文本文件。

Agent1 のセレクターは、情報を 2 つのコピーにコピーし、ローカルと HDFS に配布する必要があり、同時に、Avro シンクから送信されたメッセージは、反対側の Avro ソースで受信される必要があります。

最初の構成ファイルを作成します: Agent1
  • Agent1 には以下が含まれます。
1个 taildir source 
2个 memory channel
2个 avro sink 
  • flume-taildir-avro.conf
# Name the components on this agent
a1.sources = r1
a1.sinks = k1 k2
a1.channels = c1 c2

# 将数据流复制给所有channel
a1.sources.r1.selector.type = replicating

# source
a1.sources.r1.type = taildir

# 记录每个文件最新消费位置
a1.sources.r1.positionFile = /root/flume/taildir_position.json
a1.sources.r1.filegroups = f1

# 备注:.*log 是正则表达式;这里写成 *.log 是错误的
a1.sources.r1.filegroups.f1 = /opt/servers/hive-2.3.7/logs/.*log

# sink
a1.sinks.k1.type = avro
a1.sinks.k1.hostname = 192.168.10.103
a1.sinks.k1.port = 9091

a1.sinks.k2.type = avro
a1.sinks.k2.hostname = 192.168.10.103
a1.sinks.k2.port = 9092

# channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 10000
a1.channels.c1.transactionCapacity = 500

a1.channels.c2.type = memory
a1.channels.c2.capacity = 10000
a1.channels.c2.transactionCapacity = 500


# Bind the source and sink to the channel
a1.sources.r1.channels = c1 c2
a1.sinks.k1.channel = c1
a1.sinks.k2.channel = c2
2 番目の構成ファイルを作成します: Agent2
  • Agent2 はデータを HDFS に転送します
1个 avro source
1个 memory channel
1个 hdfs sink
  • flume-avro-hdfs.conf
# Name the components on this agent
a2.sources = r1
a2.sinks = k1
a2.channels = c1

# Describe/configure the source
a2.sources.r1.type = avro
a2.sources.r1.bind = 192.168.10.103
a2.sources.r1.port = 9091

# Describe the channel
a2.channels.c1.type = memory
a2.channels.c1.capacity = 10000
a2.channels.c1.transactionCapacity = 500
# Describe the sink
a2.sinks.k1.type = hdfs
a2.sinks.k1.hdfs.path = hdfs://192.168.10.103:9000/flume2/%Y%m%d/%H

# 上传文件的前缀
a2.sinks.k1.hdfs.filePrefix = flume2-

# 是否使用本地时间戳
a2.sinks.k1.hdfs.useLocalTimeStamp = true
# 500个Event才flush到HDFS一次
a2.sinks.k1.hdfs.batchSize = 500

# 设置文件类型,可支持压缩
a2.sinks.k1.hdfs.fileType = DataStream

# 60秒生成一个新的文件
a2.sinks.k1.hdfs.rollInterval = 60
a2.sinks.k1.hdfs.rollSize = 0
a2.sinks.k1.hdfs.rollCount = 0
a2.sinks.k1.hdfs.minBlockReplicas = 1

# Bind the source and sink to the channel
a2.sources.r1.channels = c1
a2.sinks.k1.channel = c1
3 番目の構成ファイルを作成します: Agent3
  • Agent3 には次のものが含まれます。
1个 avro source
1个 memory channel
1个 file_roll sink
  • flume-avro-file.conf
# Name the components on this agent
a3.sources = r1
a3.sinks = k1
a3.channels = c2

# Describe/configure the source
a3.sources.r1.type = avro
a3.sources.r1.bind = 192.168.10.103
a3.sources.r1.port = 9092
# Describe the sink
a3.sinks.k1.type = file_roll

# 目录需要提前创建好
a3.sinks.k1.sink.directory = /root/flume/output
# Describe the channel
a3.channels.c2.type = memory
a3.channels.c2.capacity = 10000
a3.channels.c2.transactionCapacity = 500

# Bind the source and sink to the channel
a3.sources.r1.channels = c2
a3.sinks.k1.channel = c2
3 つのエージェントを開始する
  • 最初にローカル出力ディレクトリを作成します。そうしないと、エラーが報告されます。
 mkdir /root/flume/output
  • 後ろから前へ、3、2、1 から始めます
-- cd 到配置文件的目录 
cd $FLUME_HOME/conf

-- -- 在conf 目录下执行
flume-ng agent --name a3 --conf-file flume-avro-file.conf -Dflume.root.logger=INFO,consoleki &

flume-ng agent --name a2 --conf-file flume-avro-hdfs.conf -Dflume.root.logger=INFO,consoleki &

flume-ng agent --name a1 --conf-file flume-taildir-avro.conf -Dflume.root.logger=INFO,consoleki &
  • & 関数
& 放在命令后面表示设置此进程为后台进程

默认情况下,进程是前台进程,这时此进程(命令执行相当于本质是开启一个进程)就把Shell给占据了,我们无法进行其他操作,
对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个'&'实现这个目的。

Linux command_shen_zhu のブログ - CSDN blog_& の後に Linux コマンドの後にシンボルを追加 blog.csdn.net/shen_zhu/article/details/80413830Edit

hiveコマンドを実行してログを生成する
执行hive命令产生日志
 hive -e "show databases"
HDFS ファイル、ローカル ファイル、および消費場所ファイルを個別に確認する
  • ローカルファイルを確認する
cd /root/flume

ローカルログファイルへの出力

  • HDFS の出力を確認する
hdfs dfs -ls /flume2

# 3种监控日志文件Source的对比

exec Source:适用于监控一个实时追加的文件,但不能保证数据不丢失;
spooldir Source:能够保证数据不丢失,且能够实现断点续传,但延迟较高,不能
实时监控;
taildir Source:既能够实现断点续传,又可以保证数据不丢失,还能够进行实时监
控。

7.5 バグ: HDFS に接続できない

  • hdfs のアドレスは namenode ノードですが、flume コンポーネントのアドレスは flume のノード アドレスであるため、設定ファイル内でよく比較してください。

8. 高度な機能

8.1 インターセプター

  • Flume は、インターセプターを通じて実装される実行時のイベントの変更または破棄をサポートしています。
Flume里面的拦截器是实现了org.apache.flume.interceptor.Interceptor 接口的类;
拦截器可以根据配置 修改 甚至 丢弃 event;
Flume也支持链式的拦截器执行方式,在配置文件里面配置多个拦截器就可以了;
拦截器的顺序取决于它们配置的顺序,Event 按照顺序经过每一个拦截器;
 
タイムスタンプインターセプタ
  • このインターセプターは、各イベントのヘッダーにタイムスタンプ属性を追加します。
ホストがインターセプターを追加
  • このインターセプターは、現在のエージェントのホスト名または IP アドレスをイベント ヘッダーに書き込みます。
正規表現フィルターインターセプター
  • このインターセプターはイベント本体を文字列として処理し、構成された正規表現と照合します。一致したイベントを破棄するか、不一致のイベントを破棄するかを設定できます。

8.2 セレクター

  • ソースは同時に複数のチャネルにデータを書き込むことができるため、複数のチャネルにどのように書き込むかという問題が生じます。
replication(复制,缺省)。数据完整地发送到每一个channel;
multiplexing(多路复用)。通过配置来按照一定的规则进行分发;  
カスタムセレクター
  • カスタム セレクターは、org.apache.flume.ChannelSelector インターフェイスの実装クラスを開発します。実装クラスと依存する jar パッケージは、起動時に Flume のクラスパスに配置する必要があります。

8.3 シンクグループ論理プロセッサ

  • 複数のシンクをグループに分割することができ、シンク グループ論理プロセッサは、同じグループ内の複数のシンクで負荷分散を実行したり、シンクの 1 つが故障した後にイベントを出力するタスクを他のシンクに転送したりできます。
N个sink将Event输出到对应的N个目的地的,
通过 Sink组逻辑处理器 可以把这N个sink配置成负载均衡或者故障转移的工作方式:

-- 负载均衡是将channel里面的Event,按照配置的负载机制(比如轮询)分别发
送到sink各自对应的目的地

--故障转移是这N个sink同一时间只有一个在工作,其余的作为备用,
工作的sink,挂掉之后备用的sink顶上
 
デフォルト
  • デフォルトのグループ論理プロセッサはシンクが 1 つだけの場合であり、この場合はシンク グループを構成する必要はありません。前の例はすべて、ソース、チャネル、シンクの 1 対 1、単一シンクです。
フェイルオーバー
  • フェールオーバー グループの論理プロセッサは、イベントの送信に失敗したシンクのリストを維持し、シンクがイベントの送信に使用できることを確認します。
故障转移机制的工作原理是将故障sink降级到一个池中,在池中为它们分配冷却期
(超时时间),在重试之前随顺序故障而增加。 Sink成功发送事件后,它将恢复到
实时池。sink具有与之相关的优先级,数值越大,优先级越高。 如果在发送Event时
Sink发生故障,会继续尝试下一个具有最高优先级的sink。

例如,在优先级为80的
sink之前激活优先级为100的sink。如果未指定优先级,则根据配置中的顺序来选取。 
負荷分散
  • 負荷分散シンク セレクターは、複数のシンク間でトラフィックを負荷分散する機能を提供します。負荷分散を実装するためにアクティブ シンク リストへのインデックスを維持します。負荷を割り当てるために、round_robin [デフォルト値] とランダム (ランダム) の 2 つの選択メカニズムをサポートします。
工作时,此选择器使用其配置的选择机制选择下一个sink并调用它。 如果所选sink无
法正常工作,则处理器通过其配置的选择机制选择下一个可用sink。 此实现不会将
失败的Sink列入黑名单,而是继续乐观地尝试每个可用的Sink。
  
  • すべてのシンク呼び出しが失敗した場合、セレクターは失敗をシンクのランナーにスローします。
如果 backoff 设置为true则启用了退避机制,失败的sink会被放入黑名单,达到一定
的超时时间后会自动从黑名单移除。 如从黑名单出来后sink仍然失败,则再次进入
黑名单而且超时时间会翻倍,以避免在无响应的sink上浪费过长时间。 如果没有启
用退避机制,在禁用此功能的情况下,发生sink传输失败后,会将本次负载传给下一
个sink继续尝试,因此这种情况下是不均衡的。
 

左側はロード バランシングです。各シンクが可能な限り作業できるように、データが整理されます。右側はフェールオーバーです。一度に 1 つだけが動作します。残りはバックアップです。最初のシンクに障害が発生した場合、そのシンクはバックアップされます。次へ

8.4 トランザクションのメカニズム

  • トランザクションに関して最初に思い浮かぶのは、リレーショナル データベースのトランザクションです。トランザクションの典型的な機能は、一連の操作をアトミックにし、すべてが成功するかすべてが失敗することです。
Flume には 2 つのトランザクションがあります。
  • トランザクションを入れます。ソースとチャンネルの間
  • トランザクションを取ります。チャネルとシンクの間
从 Source 到 Channel 过程中,
数据在 Flume 中会被封装成 Event 对象,也就是一 批 Event ,
把这批 Event 放到一个事务中,
把这个事务也就是这批event一次性的放 入Channel 中。

同理,Take事务的时候,也是把这一批event组成的事务统一拿出来 到sink放到HDFS上。
Flume にトランザクションを入れる
  • トランザクションが開始されると、doPut メソッドが呼び出され、データのバッチを putList に入れます。
putList在向 Channel 发送数据之前先检查 Channel 的容量能否放得下,
如果放不下一个都不放,只能doRollback;

数据批的大小取决于配置参数 batch size 的值;

putList的大小取决于配置 Channel 的参数 transaction capacity 的大小,该
参数大小就体现在putList上;(Channel的另一个参数 capacity 指的是 Channel 的容量);
   
  • データが putList に正常に配置された後、doCommit メソッドを呼び出して、putList 内のすべてのイベントをチャネルに配置できます。配置が成功すると、putList はクリアされます。
在doCommit提交之后,事务在向 Channel 存放数据的过程中,事务容易出问题。
如 Sink取数据慢,而 Source 放数据速度快,容易造成 Channel 中数据的积压,如
果 putList 中的数据放不进去,会如何呢?

此时会调用 doRollback 方法,doRollback方法会进行两项操作:将putList清空;
抛出 ChannelException异常。source会捕捉到doRollback抛出的异常,然后source
就将刚才的一批数据重新采集,然后重新开始一个新的事务,这就是事务的回滚。 

トランザクションの入力: データの入力

Flume でトランザクションを取得する
  • Take トランザクションにも takeList があります。HDFS シンクはバッチ サイズで構成されています。このパラメータは、チャネルからデータをフェッチするときにシンクが一度にフェッチするデータの数を決定します。したがって、バッチ サイズは、 takeList のサイズはトランザクション容量のサイズに依存し、チャネル内のパラメータについても同様です。
トランザクション処理を実行します: トランザクション開始後:
  • doTake メソッドは、チャネル内のイベントを takeList に切り取ります。
如果后面接的是HDFS
Sink的话,在把Channel中的event剪切到takeList中的同时也往写入HDFS的IO
缓冲流中放一份event(数据写入HDFS是先写入IO缓冲流然后flush到HDFS);
  • バッチ サイズのイベント数が takeList に格納されると、doCommit メソッドが呼び出され、次の 2 つの操作が実行されます。
1. 针对HDFS Sink,手动调用IO流的flush方法,将IO流缓冲区的数据写入到
HDFS磁盘中;
2、 清空takeList中的数据
  • グループを HDFS にフラッシュするときに問題が発生する傾向があります。
flush到HDFS的时候,可能由于网络原因超时导 致数据传输失败,
这个时候调用doRollback方法来进行回滚,回滚的时候由于 takeList 中还有备份数据,
所以将takeList中的数据原封不动地还给channel,这时候就完成了事务的回滚


但是,如果flush到HDFS的时候,数据flush了一半之后出问题了,这意味着已经有
一半的数据已经发送到HDFS上面了,现在出了问题,同样需要调用doRollback方法
来进行回滚,回滚并没有“一半”之说,它只会把整个takeList中的数据返回给
channel,然后继续进行数据的读写。这样开启下一个事务的时候容易造成数据重复
的问题。

トランザクションを取る: データを取得する

8.5 信頼性

  • Flume がデータを収集および送信する場合、データの重複が発生する可能性がありますが、データが失われることはありません。
agent 内部传输如果不成功就rollback
  • Flume がデータ送信プロセス中に信頼できるかどうかは、使用されるソース、チャネル、シンクの特定のタイプも考慮する必要があります。
-- 分析Source
       exec Source ,后面接 tail -f ,这个数据也是有可能丢的

      TailDir Source ,这个是不会丢数据的,它可以保证数据不丢失

--- 分析sink

Hdfs Sink,数据有可能重复,但是不会丢失

-- 分析channel。
理论上说:要想数据不丢失的话,还是要用 File channel;
memory channel 在 Flume 挂掉的时候是有可能造成数据的丢失的。
 
  • TailDir ソースと HDFS シンクを使用する場合、データは複製されますが、失われることはありません。

9. 高可用性ケース - フェイルオーバー

フェイルオーバー
  • フェールオーバー グループの論理プロセッサは、イベントの送信に失敗したシンクのリストを維持し、シンクがイベントの送信に使用できることを確認します。
  • フェイルオーバー メカニズムは、失敗したシンクをプールに降格させることによって機能します。そこで、再試行するまでの一連の失敗に応じて増加する冷却期間 (タイムアウト) が割り当てられます。シンクがイベントを正常に送信すると、リアルタイム プールに戻ります。シンクには優先度が関連付けられており、値が大きいほど優先度が高くなります。 イベントの送信中にシンクが失敗した場合、シンクは優先度の高い次のシンクを試行し続けますたとえば、優先度 80 の場合
  • 優先度 100 のシンクがシンクよりも前にアクティブ化されました。優先順位が指定されていない場合は、設定内の順序が使用されます。
  • フェールオーバー セレクターを使用するには、シンク グループのセレクターをフェールオーバーに設定するだけでなく、各シンクに一意の優先順位の値も設定します。maxpenalty 属性を使用して、フェールオーバー時間の上限をミリ秒単位で設定できます。

おすすめ

転載: blog.csdn.net/TangYuG/article/details/132755265