目次
Flume-Flume構造、単一のデータソースと複数のアウトレット、フェイルオーバー(フェイルオーバー)、ロードバランシング、集約など。
Flumeのインストール
- 公式サイトからFlumeをダウンロード:http : //flume.apache.org/download.html
- -:Tar -zxvf apache-flume-1.9.0-bin.tar.gz
- ディレクトリの名前を変更します:mv apache-flume-1.9.0-bin flume-1.9.0
- confディレクトリのflume-env.sh.templateの名前を変更します。mv flume-env.sh.template flume-env.sh
- flume-env.shを変更します。
- / etc / profileを変更します。
- ソース/ etc / profile
ケース1:リスニングポート
構成ファイルに必要なパラメーターは公式Webサイトで確認でき、太字のオプションが必要です。
ケース分析
- netcatツールを介してマシンのポート44444にデータを送信する
- Flumeはマシンのポート44444を監視し、ソースからデータを読み取ります
- Flumeは取得したデータをシンクを介してコンソールに書き込みます
ケースステップ
-
各ホストにnetcatをインストールします:yum install -y nc
-
ポート44444が使用されているかどうかを確認します:netstat -tunlp | grep 44444
-
Netcatの使用法:サーバーとしてnc -lk 44444を入力し、相互に通信できるクライアントとしてnc host 44444を入力します。
-
Flumeエージェント構成ファイルnetcat-flume-logger.confを作成します。
# example.conf: A single-node Flume configuration # Name the components on this agent a1.sources = r1 a1.channels = c1 a1.sinks = k1 # Describe/configure the source a1.sources.r1.type = netcat a1.sources.r1.bind = localhost a1.sources.r1.port = 44444 # Describe the sink a1.sinks.k1.type = logger # Use a channel which buffers events in memory a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # Bind the source and sink to the channel a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1
構成ファイルには、空白行で区切られた5つの部分があります
- エージェントのコンポーネントに名前を付けます。a1はエージェント名、r1はソース名、c1はチャネル名、k1はシンク名です。単語は複数形であり、複数のコンポーネントが存在する可能性があることを示しています。
- ソースを設定します。r1のソースタイプはnetcat、リスニングホストはlocalhost、リスニングポート番号は44444です。
- シンクを設定します。k1のタイプはloggerで、コンソールに出力されます。
- チャネルを構成します。チャネルc1のタイプはメモリーであり、バッファー容量は1000イベント(Flumeはイベントを送信単位として使用します)、トランザクション容量は100イベント(一度に送信されるデータ)です。
- 3つのコンポーネントをバインドします。複数のソース、チャネル、シンクが存在する可能性があるため、バインドする必要があります。INFOはINFO以上のメッセージを指します。複数のチャネルに注意してください。1つのソースは複数のチャネルにバインドでき、1つのチャネルは複数のシンクにバインドでき、1つのシンクは1つのチャネルにのみバインドできます。
-
Flumeを起動します。この時点でサーバーとしてFlumeを起動します。confはFlumeディレクトリーの下のconfディレクトリー、conf-fileはユーザーが作成した構成ファイル、nameはエージェントの名前です。
bin/flume-ng agent --conf conf --conf-file netcat-flume-logger.conf --name a1 -Dflume.root.logger=INFO,console 或者 bin/flume-ng agent --c conf --f netcat-flume-logger.conf --n a1 -Dflume.root.logger=INFO,console
-
新しい端末を起動してnc localhost 44444と入力し、文字列を入力します
-
Ctrl + cで閉じます。killは使用できますが、kill -9は使用しないでください。kill-9はフックプログラムを実行しません(仕上げ作業)。
ケース2:ローカルファイルの監視
ケース分析
- Flumeがローカルファイルの変更を監視する
- crontabを介してタイムリーにファイルを変更する
- Flumeはデータをコンソールに出力します
ケースステップ
-
Flumeディレクトリに空のファイルを作成します。touch date.txt
-
Flumeエージェント構成ファイルexec-flume-logger.confを作成し、ソースタイプはexec、シンクタイプはloggerで、コマンドはtailです。
# Name the components on this agent a1.sources = r1 a1.channels = c1 a1.sinks = k1 # Describe/configure the source a1.sources.r1.type = exec a1.sources.r1.command = tail -F /opt/flume-1.9.0/date.txt # Describe the sink a1.sinks.k1.type = logger # Use a channel which buffers events in memory a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # Bind the source and sink to the channel a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1
-
Flumeを起動する
bin/flume-ng agent -c conf -f exec-flume-logger.conf -n a1 -Dflume.root.logger=INFO,console
-
新しい端末を起動し、crontab -eと入力して、時間指定タスクを編集し、毎分ファイルを変更して保存します
-
最終的な効果は次のとおりです。
-
crontab -rと入力して、現在のユーザータイミングタスクを削除します。
ケース3:ローカルファイルを監視してHDFSをアップロードする
ケース分析
- FlumeはHiveログファイルを監視します
- Hiveを起動してログを生成する
- Flumeは取得したデータをHDFSに書き込みます
ケースステップ
-
データをHDFSにアップロードする必要があるため、Hadoop関連のjarパッケージを準備する必要があります。jarパッケージは、Hadoopインストールディレクトリの下のshare / hadoopディレクトリにあります。
-
これらのjarパッケージをFlumeディレクトリの下のlibディレクトリにコピーします。Flumeが起動すると、libの下のjarパッケージがメモリにロードされます:mv tempjar / * /opt/flume-1.9.0/lib
-
HDFSとYarnを開始します:start-dfs.sh、start-yarn.sh
-
Flumeエージェント構成ファイルexec-flume-hdfs.confを作成します。ソースタイプはexecで、シンクタイプはhdfsです。注:時間に関連するすべてのエスケープシーケンスでは、イベントヘッダーに「timestamp」キーが必要です(hdfs.useLocalTimeStampがtrueに設定されていない限り、このメソッドはTimestampInterceptorを使用してタイムスタンプを自動的に追加します)。
# Name the components on this agent a1.sources = r1 a1.channels = c1 a1.sinks = k1 # Describe/configure the source a1.sources.r1.type = exec a1.sources.r1.command = tail -F /opt/hive-2.3.7/log/hive.log # Describe the sink a1.sinks.k1.type = hdfs # 创建文件的路径 a1.sinks.k1.hdfs.path = hdfs://master:9000/flume/%Y%m%d/%H # 上传文件的前缀 a1.sinks.k1.hdfs.filePrefix = logs # 是否按照时间滚动文件夹 # 下面3个参数一起配置 a1.sinks.k1.hdfs.round = true # 多久创建一个新的文件夹 a1.sinks.k1.hdfs.roundValue = 1 # 定义时间单位 a1.sinks.k1.hdfs.roundUnit = hour # 是否使用本地时间戳(必须配置) a1.sinks.k1.hdfs.useLocalTimeStamp = true # 积累多少个Event才flush到HDFS一次(单位为事件) a1.sinks.k1.hdfs.batchSize = 100 # 设置文件类型,可支持压缩 a1.sinks.k1.hdfs.fileType = DataStream # 多久滚动生成一个新的文件(单位为秒) # 这个参数只是实验用,实际开发需要调大点 # 下面3个参数一起配置 a1.sinks.k1.hdfs.rollInterval = 30 # 设置每个文件的滚动大小(略小于文件块大小128M) a1.sinks.k1.hdfs.rollSize = 134217700 # 文件的滚动与Event数量无关(0则不按照该值) a1.sinks.k1.hdfs.rollCount = 0 # Use a channel which buffers events in memory a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # Bind the source and sink to the channel a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1
-
Flumeを起動する
bin/flume-ng agent -c conf -f exec-flume-hdfs.conf -n a1 -Dflume.root.logger=INFO,console
-
新しいターミナルを開始し、ハイブを開始し、クエリ操作を実行します
異常な問題
2020-06-04 17:53:52,961(conf-file-poller-0)[エラー-org.apache.flume.node.AbstractConfigurationProvider.loadSinks(AbstractConfigurationProvider.java:469)]エラーのため、シンクk1が削除されました構成中
java.lang.InstantiationException:互換性のないシンクとチャネルの設定が定義されています。シンクのバッチサイズは、チャネルのトランザクション容量よりも大きくなります。シンク:k1、バッチサイズ= 1000、チャネルc1、トランザクション容量= 100
理由:チャネルとシンクの設定が一致せず、シンクのバッチサイズがチャネルのトランザクション容量より大きい
解決策:a1.sinks.k1.hdfs.batchSizeを100以下に設定します
ケース4:ディレクトリ内の新しいファイルを監視してHDFSにアップロードする
ケース分析
- Flumeは指定されたディレクトリを監視し、監視されたフォルダは500ミリ秒ごとにファイルの変更をスキャンします
- ディレクトリに新しいファイルを追加する
- Flumeは取得したデータをHDFSに書き込みます。アップロードされたファイルのローカルサフィックスは、デフォルトで.COMPLETEDです。アップロードされていないファイルには、HDFS では.tmpのサフィックスが付いています。
Flumeは上記の方法を使用して新しいファイルがあるかどうかを判断しますが、ディレクトリにアップロードされていない.COMPLETEDサフィックスを持つファイルがある場合、Flumeはファイルをアップロードしません。
同時に、接尾辞が.COMPLETEDのファイルが変更された場合、そのファイルには.COMPLETEDの接尾辞が付いているため、FlumeはそのファイルをHDFSにアップロードしません。
したがって、この方法では、変化するデータを動的に監視できません。
ケースステップ
-
新しいディレクトリmkdir directoryを作成します。
-
Flumeエージェント構成ファイルspooldir-flume-hdfs.confを作成します。ソースタイプはスプールディレクトリで、シンクタイプはhdfsです。
# Name the components on this agent a1.sources = r1 a1.channels = c1 a1.sinks = k1 # Describe/configure the source a1.sources.r1.type = spooldir # 监控的目录 a1.sources.r1.spoolDir = /opt/flume-1.9.0/directory #忽略所有以.tmp 结尾的文件,不上传 a1.sources.r1.ignorePattern = ([^]*\.tmp) # Describe the sink a1.sinks.k1.type = hdfs # 创建文件的路径 a1.sinks.k1.hdfs.path = hdfs://master:9000/flume/%Y%m%d/%H # 上传文件的前缀 a1.sinks.k1.hdfs.filePrefix = logs # 是否按照时间滚动文件夹 a1.sinks.k1.hdfs.round = true # 多久创建一个新的文件夹 a1.sinks.k1.hdfs.roundValue = 1 # 定义时间单位 a1.sinks.k1.hdfs.roundUnit = hour # 是否使用本地时间戳(必须配置) a1.sinks.k1.hdfs.useLocalTimeStamp = true # 积累多少个Event才flush到HDFS一次(单位为事件) a1.sinks.k1.hdfs.batchSize = 100 # 设置文件类型,可支持压缩 a1.sinks.k1.hdfs.fileType = DataStream # 多久滚动生成一个新的文件(单位为秒) a1.sinks.k1.hdfs.rollInterval = 30 # 设置每个文件的滚动大小(略小于文件块大小128M) a1.sinks.k1.hdfs.rollSize = 134217700 # 文件的滚动与Event数量无关(0则不按照该值) a1.sinks.k1.hdfs.rollCount = 0 # Use a channel which buffers events in memory a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # Bind the source and sink to the channel a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1
-
Flumeを起動する
bin/flume-ng agent -c conf -f spooldir-flume-hdfs.conf -n a1 -Dflume.root.logger=INFO,console
-
ディレクトリdirectoryにファイルを作成します:date> one.txt、date> two.txt、date> three.txt
異常な問題
既存のファイルをディレクトリにスローすると、Flumeはエラーを報告します。たとえば、私はそれにone.txtを投げます、date> one.txt。Flumeは、ディレクトリdirectoryに新しいファイルone.txtがあるというエラーを報告しますが、サフィックス.COMPLETEDがなく、HDFSに新しいファイルがあります。新しいファイルthree.txtをディレクトリに再度投げたところ、新しいファイルの名前が変更されたりアップロードされたりせず、1Bエラーファイルがアップロードされました。
2020-06-04 20:22:32,879(pool-5-thread-1)[エラー-org.apache.flume.source.SpoolDirectorySource $ SpoolDirectoryRunnable.run(SpoolDirectorySource.java:296)]致命的:スプールディレクトリソースr1: {spoolDir:/opt/flume-1.9.0/directory}:SpoolDirectorySourceスレッドでキャッチされない例外。Flumeを再起動または再構成して、処理を続行します。
java.lang.IllegalStateException:ファイル名が別のファイルで再利用されました。/opt/flume-1.9.0/directory/one.txt.COMPLETEDに違反するスプーリングの仮定
理由:新しいファイルは、ディレクトリに既に存在するファイル名を使用しています。Flumeは最初にファイルをアップロードしてから名前を変更しましたが、名前の変更中にエラーが発生しました。その後もエラーが続き、新しいファイルをアップロードできませんでした。
解決策:異常なファイルを削除し、Flumeを再起動して、ファイルを再度ディレクトリにスローします
ケース5:追加ファイルの監視(アップロードの再開)
Taildir Sourceは、ブレークポイントの再開可能な送信を実現できるだけでなく、データが失われないようにし、リアルタイムの監視も実行できます。
ケースステップ
-
新しいディレクトリmkdir fileを作成します。
-
ファイルディレクトリに2つのファイルを作成します:touch one.txt、touch two.txt
-
Flumeエージェント構成ファイルtaildir-flume-logger.confを作成します。ソースタイプはtaildirで、シンクタイプはロガーです
# Name the components on this agent a1.sources = r1 a1.channels = c1 a1.sinks = k1 # Describe/configure the source a1.sources.r1.type = TAILDIR a1.sources.r1.filegroups = f1 a1.sources.r1.filegroups.f1 = /opt/flume-1.9.0/file/.*\.txt a1.sources.r1.positionFile = /opt/flume-1.9.0/file/position.json # Describe the sink a1.sinks.k1.type = logger # Use a channel which buffers events in memory a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # Bind the source and sink to the channel a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1
-
Flumeを起動します。
bin/flume-ng agent -c conf -f taildir-flume-logger.conf -n a1 -Dflume.root.logger=INFO,console
-
新しい端末を起動し、エコーA >> one.txt、エコーB >> two.txt
-
Ctrl + cで Flume を閉じ、echo C >> one.txt、echo D >> two.txtと入力し、Flumeを再起動します
-
position.jsonを見ると、ファイルが最後に変更されたファイルの場所を記録しているので、ブレークポイントで再開できます。(Unix / Linuxシステムは内部でファイル名を使用しませんが、ファイルを識別するためにiノードを使用します)
異常な問題
構成ファイルは2つのファイルをf1に割り当て、最後にone.txtは監視できませんが、two.txtは監視できます。
a1.sources.r1.filegroups.f1 = /opt/flume-1.9.0/file/one.txt
a1.sources.r1.filegroups.f1 = /opt/flume-1.9.0/file/two.txt
これは、2つ目が1つ目を上書きするためです。正規表現を使用するか、2つの変数f1、f2を使用します。