【ビッグデータのFlume】 2. Flumeの紹介

1 Flume のインストールと展開

1.1 Flume の設置住所

(1) Flume 公式サイトアドレス http://flume.apache.org/
(2) 資料閲覧アドレス http://flume.apache.org/FlumeUserGuide.html
(3) ダウンロードアドレス http://archive.apache.org / 距離/水流/

1.2 インストールと展開

(1) apache-flume-1.9.0-bin.tar.gzをLinuxの/opt/softwareディレクトリにアップロードします。
(2) apache-flume-1.9.0-bin.tar.gz を /opt/module/ ディレクトリに解凍します。

tar -zxf /opt/software/apache-flume-1.9.0-bin.tar.gz -C /opt/module/

(3) apache-flume-1.9.0-bin の名前を flume-1.9.0 に変更します。

mv /opt/module/apache-flume-1.9.0-bin /opt/module/flume-1.9.0

(4) flume-1.9.0/conf にある flume-env.sh.template ファイルを flume-env.sh に変更し、flume-env.sh ファイルを構成します。

 mv flume-env.sh.template flume-env.sh
 vim flume-env.sh
 export JAVA_HOME=/opt/module/jdk1.8.0_271

2 Flume を始める

2.1 ポートデータ監視の公式事例

(1) 要件: Flume を使用してポートを監視し、ポートからデータを収集し、コンソールに出力します。
(2) 分析:
  netcat ツールを介してマシンのポート 44444 にデータを送信 –> Flume はマシンのポート 44444 を監視し、Flume のソース側を介してデータを読み取ります –> 取得したデータを Flume の SInk 側を介してコンソールに書き込みます。
手順:
(1) netcat を使用してインストールします。

//下载netcat
sudo yum install -y nc

//开启服务端端口
nc -lk 9999

//开启服务端进行通信
nc localhost 9999

(2) ポート 44444 が占有されているかどうかを確認します。

sudo netstat -nlp | grep 44444

(3) flume-1.9.0 の下にジョブ フォルダーを作成し、ジョブの下に Flume エージェント設定ファイル netcat-flume-logger.conf を作成し (flume を介してシンクへのデータ ソースを表す)、次の内容を追加します。


# Name the components on this agent 
#组件声明
a1.sources = r1
a1.sinks = k1 
a1.channels = c1

# 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 whichbuffers 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

ここに画像の説明を挿入
(4) 水流リスニングポートを開きます

//方式一
bin/flume-ng agent --conf conf/ --name a1 --conf-file job/netcat-flume-logger.conf -Dflume.root.logger=INFO,console

//方式二
bin/flume-ng agent -c conf/ -n a1 -f job/netcat-flume-logger.conf -Dflume.root.logger=INFO,console

パラメータの説明:
(i) –conf/-c: 設定ファイルは conf/ ディレクトリにあります。
(ii) –name/-n: エージェントの名前が a1 であることを示します。
(iii) –conf-file/-f: 今回 flume によって読み取られる設定ファイルは、ジョブ ディレクトリ内の netcat-flume-logger.conf ファイルです。
(iv) -Dflume.root.logger-INFO,console: -D は、flume の実行中に flume.root.logger パラメーターの属性値が動的に変更され、コンソールのログ出力レベルが INFO レベルに設定されることを示します。ログ レベルには、ログ、情報、警告、エラーが含まれます。

(5) netcat を使用して、このマシンのポート 44444 にコンテンツを送信します。

nc localhost 44444
hello

(6) Flume監視ページで受信データを確認する

2.2 単一の追加ファイルのリアルタイム監視

(1) 要件: Hive ログをリアルタイムで監視し、HDFS にアップロードします。
(2) 分析:
ここに画像の説明を挿入
手順:
(1) ジョブディレクトリにファイルを作成します: file-flume-hdfs.conf
  Linux システム内のファイルを読み取りたい場合は、Linux コマンドの規則に従ってコマンドを実行する必要があります。Hive ログは Linux システムにあるため、読み取るファイルのタイプが選択されます。exec は実行を意味します。ファイルを読み取るための Linux コマンドの実行を示します。
  に追加:

# Name the components on this agent 
a2.sources = r2
a2.sinks = k2
a2.channels = c2

# Describe/configure the source
#定义source类型为exec可执行命令的
a2.sources.r2.type = exec
a2.sources.r2.command = tail -F /opt/module/hive/logs/hive.log

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

#上传文件的前缀
a2.sinks.k2.hdfs.filePrefix = logs- 
#是否按照时间滚动文件夹 
a2.sinks.k2.hdfs.round= true
#多少时间单位创建一个新的文件夹 
a2.sinks.k2.hdfs.roundValue = 1 
#重新定义时间单位 
a2.sinks.k2.hdfs.roundUnit = hour 
#是否使用本地时间戳
a2.sinks.k2.hdfs.useLocalTimeStamp = true 
#积攒多少个Event 才 flush 到 HDFS 一次 
a2.sinks.k2.hdfs.batchSize = 100
#设置文件类型,可支持压缩 
a2.sinks.k2.hdfs.fileType = DataStream
#多久生成一个新的文件(单位s)
a2.sinks.k2.hdfs.rollInterval = 60
#设置每个文件的滚动大小 
a2.sinks.k2.hdfs.rollSize = 134217700 
#文件的滚动与Event 数量无关 
a2.sinks.k2.hdfs.rollCount = 0

# Use a channelwhich buffers eventsin memory 
a2.channels.c2.type = memory 
a2.channels.c2.capacity = 1000
a2.channels.c2.transactionCapacity = 100

# Bind the source and sink to the channel
a2.sources.r2.channels = c2 
a2.sinks.k2.channel = c2

(2) ラン・フリューム

bin/flume-ng agent --conf conf/ --name a2 --conf-file job/file-flume-hdfs.conf
//或用
bin/flume-ng agent -n a2 -c conf/ -f job/file-flume-hdfs.conf

(3) Hadoop と Hive を起動し、Hive を操作してログを生成する
実行ソースは、リアルタイムに追加されたファイルを監視するのに適しています
欠点: tail は最後の 10 個のデータのみを送信でき、ブレークポイントからの送信の再開はサポートしていません。

2.3 ディレクトリ内の複数の新しいファイルのリアルタイム監視

(1) 要件: Flume を使用してディレクトリ全体のファイルを監視し、HDFS にアップロードします
(2) 分析:
ここに画像の説明を挿入
手順:
(1) ジョブ ディレクトリに設定ファイル dir-flume-hdfs.conf を作成し、次の内容を追加します

a3.sources = r3
a3.sinks = k3
a3.channels = c3

# Describe/configure the source 
#定义source类型为目录
a3.sources.r3.type = spooldir
#监控目录
a3.sources.r3.spoolDir = /opt/module/flume-1.9.0/upload
#定义文件上传完的后缀
a3.sources.r3.fileSuffix = .COMPLETED 
#是否有文件头
a3.sources.r3.fileHeader = true
#忽略所有以.tmp结尾的文件,不上传
a3.sources.r3.ignorePattern = ([^ ]*\.tmp)

# Describe the sink 
a3.sinks.k3.type= hdfs
a3.sinks.k3.hdfs.path =hdfs://hadoop102/flume/upload/%Y%m%d/%H
#上传文件的前缀
a3.sinks.k3.hdfs.filePrefix = upload-
#是否按照时间滚动文件夹
a3.sinks.k3.hdfs.round= true
#多少时间单位创建一个新的文件夹
a3.sinks.k3.hdfs.roundValue = 1
#重新定义时间单位
a3.sinks.k3.hdfs.roundUnit = hour
#是否使用本地时间戳
a3.sinks.k3.hdfs.useLocalTimeStamp = true
#积攒多少个 Event 才 flush 到 HDFS 一次
a3.sinks.k3.hdfs.batchSize= 100

#设置文件类型,可支持压缩 
a3.sinks.k3.hdfs.fileType = DataStream
#多久生成一个新的文件
a3.sinks.k3.hdfs.rollInterval = 60
#设置每个文件的滚动大小大概是 128M
a3.sinks.k3.hdfs.rollSize = 134217700
#文件的滚动与Event 数量无关
a3.sinks.k3.hdfs.rollCount = 0

# Use a channel which buffers events in memory
a3.channels.c3.type = memory
a3.channels.c3.capacity = 1000
a3.channels.c3.transactionCapacity = 100

# Bind the source and sink to the channel
a3.sources.r3.channels = c3
a3.sinks.k3.channel = c3

(2) ファイル監視コマンドの起動

bin/flume-ng agent --conf conf/ --name a3 --conf-file job/dir-flume-hdfs.conf

  スプーリング ディレクトリ ソースを使用する場合、監視ディレクトリ内にファイルを作成したり継続的に変更したりしないでください。アップロードされたファイルは .COMPLETED で終わります。監視対象フォルダは 500 ミリ秒ごとにファイルの変更をスキャンします。

(3) アップロードフォルダにファイルを追加し、/opt/module/flumeディレクトリ配下にアップロードフォルダを作成し、以下のファイルを追加します。

touch test.txt
touch text.tmp
touch test.log

ここに画像の説明を挿入
Spooldir Source は、新しいファイルの同期に適しています。
短所: リアルタイムに追加されたログを含むファイルの監視および同期には適していません。

2.4 ディレクトリ内の複数の追加ファイルのリアルタイム監視

Taildir Source は、追加された複数のファイルをリアルタイムで監視するのに適しており、ブレークポイントからの再開を実現できます。
Taildir 説明:
  Taildir Source は、位置ファイルを json 形式で保持し、位置ファイル内の各ファイルが読み取った最新の位置を定期的に更新することで、ブレークポイントからの継続的なアップロードを実現します。

ポジションファイルの形式は以下のとおりです。

{
    
    "inode":2496272,"pos":12,"file":"/opt/module/flume-1.9.0/files/file1.txt"}
{
    
    "inode":2496275,"pos":12,"file":"/opt/module/flume-1.9.0/files/file2.txt"}

注: Linux でファイルのメタデータが保存される領域は i ノードと呼ばれます。各 i ノードには番号があります。オペレーティング システムは、さまざまなファイルを識別するために i ノード番号を使用します。Unix/Linux システムは内部的にファイル名を使用しませんが、ファイルの識別に i ノード番号を使用します。 。

(1) 要件: Flume を使用して、ディレクトリ全体の追加ファイルをリアルタイムで監視し、HDFS にアップロードします。
(2) 分析:
ここに画像の説明を挿入
手順:
(1) ジョブ ディレクトリに設定ファイル taildir-flume-hdfs.conf を作成し、次の内容を追加します。

a3.sources = r3
a3.sinks = k3
a3.channels = c3

# Describe/configure the source
#定义source类型
a3.sources.r3.type = TAILDIR
#指定position——file的位置
a3.sources.r3.positionFile = /opt/module/flume-1.9.0/tail_dir.json
a3.sources.r3.filegroups = f1 f2
#定义监控目录文件
a3.sources.r3.filegroups.f1 = /opt/module/flume/files/.*file.*
a3.sources.r3.filegroups.f2 = /opt/module/flume/files2/.*log.*

# Describe the sink 
a3.sinks.k3.type= hdfs
a3.sinks.k3.hdfs.path =hdfs://hadoop102/flume/upload2/%Y%m%d/%H
#上传文件的前缀
a3.sinks.k3.hdfs.filePrefix = upload-
#是否按照时间滚动文件夹
a3.sinks.k3.hdfs.round = true
#多少时间单位创建一个新的文件夹 
a3.sinks.k3.hdfs.roundValue = 1
#重新定义时间单位
a3.sinks.k3.hdfs.roundUnit = hour
#是否使用本地时间戳
a3.sinks.k3.hdfs.useLocalTimeStamp = true
#积攒多少个 Event才 flush 到 HDFS 一次 
a3.sinks.k3.hdfs.batchSize= 100
#设置文件类型,可支持压缩
a3.sinks.k3.hdfs.fileType = DataStream
#多久生成一个新的文件 
a3.sinks.k3.hdfs.rollInterval= 60
#设置每个文件的滚动大小大概是 128M
a3.sinks.k3.hdfs.rollSize = 134217700
#文件的滚动与Event 数量无关 
a3.sinks.k3.hdfs.rollCount = 0

# Use a channelwhich buffers eventsin memory 
a3.channels.c3.type= memory
a3.channels.c3.capacity = 1000
a3.channels.c3.transactionCapacity = 100

# Bind the sourceand sink to the channel 
a3.sources.r3.channels = c3
a3.sinks.k3.channel = c3

(2) フォルダ監視コマンドを起動する

bin/flume-ng agent --conf conf/ --name a3 --conf-file job/taildir-flume-hdfs.conf

(3) 追加のコンテンツを files ファイルに追加し、/opt/module/flume-1.9.0 ディレクトリに files および files2 フォルダーを作成し、このフォルダーにファイルを追加します。

#files文件夹下
touch file1.txt
touch file2.txt
echo hello >> file1.txt
echo lyx >> file2.txt

#files2文件夹下
touch file3.log
echo hi >> file3.log

(4) HDFS上のデータを確認します。

上記の問題点として、
  定期的にファイル名を変更し、新しい元のファイル名でファイルを再作成すると、監視・アップロードするデータが更新されたコンテンツデータではなく、蓄積されたファイルコンテンツとなり、データが重複してしまうという問題があります。 。
解決策:
  ソース コードの更新および読み取り操作を変更し、変更したファイルをパッケージ化してローカルにダウンロードし、ソース コードを置換するために lib ディレクトリにアップロードして、監視フォルダー コマンドを再起動します。
  (1) 更新操作: inode の値のみを確認します。
ここに画像の説明を挿入
  (2) 読み取り操作: ファイルが新しいファイルである限り、絶対パスではなく、inode の値のみが参照されます。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_18625571/article/details/131678589