Flume-1.9.0のインストール、ポートの監視、ローカルファイルの監視とHDFSのアップロード、ディレクトリ内の新しいファイルの監視とHDFSのアップロード、追加ファイルの監視(再開されたアップロード)

Flume-Flume構造、単一のデータソースと複数のアウトレット、フェイルオーバー(フェイルオーバー)、ロードバランシング、集約など。

Flumeカスタムインターセプター、MySQLからデータを読み取るカスタムソース、カスタムシンク

Flumeのインストール

  1. 公式サイトからFlumeをダウンロード:http : //flume.apache.org/download.html
  2. -:Tar -zxvf apache-flume-1.9.0-bin.tar.gz
  3. ディレクトリの名前を変更します:mv apache-flume-1.9.0-bin flume-1.9.0
  4. confディレクトリのflume-env.sh.templateの名前を変更します。mv flume-env.sh.template flume-env.sh
  5. flume-env.shを変更します。
    ここに画像の説明を挿入
  6. / etc / profileを変更します。
    ここに画像の説明を挿入
  7. ソース/ etc / profile

ここに画像の説明を挿入

ケース1:リスニングポート

    構成ファイルに必要なパラメーターは公式Webサイトで確認でき、太字のオプションが必要です。
ここに画像の説明を挿入

ケース分析

  1. netcatツールを介してマシンのポート44444にデータを送信する
  2. Flumeはマシンのポート44444を監視し、ソースからデータを読み取ります
  3. Flumeは取得したデータをシンクを介してコンソールに書き込みます

ケースステップ

  1. 各ホストにnetcatをインストールします:yum install -y nc

  2. ポート44444が使用されているかどうかを確認します:netstat -tunlp | grep 44444

  3. Netcatの使用法:サーバーとしてnc -lk 44444入力し、相互に通信できるクライアントとしてnc host 44444を入力します。
    ここに画像の説明を挿入

  4. 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つの部分があります

    1. エージェントのコンポーネントに名前を付けますa1はエージェント名、r1はソース名、c1はチャネル名、k1はシンク名です。単語は複数形であり、複数のコンポーネントが存在する可能性があることを示しています。
    2. ソースを設定しますr1のソースタイプはnetcat、リスニングホストはlocalhost、リスニングポート番号は44444です。
    3. シンクを設定しますk1のタイプはloggerで、コンソールに出力されます。
    4. チャネルを構成しますチャネルc1のタイプはメモリーであり、バッファー容量は1000イベント(Flumeはイベントを送信単位として使用します)、トランザクション容量は100イベント(一度に送信されるデータ)です。
    5. 3つのコンポーネントをバインドします複数のソース、チャネル、シンクが存在する可能性があるため、バインドする必要があります。INFOはINFO以上のメッセージを指します。複数のチャネルに注意してください。1つのソースは複数のチャネルにバインドでき、1つのチャネルは複数のシンクにバインドでき、1つのシンクは1つのチャネルにのみバインドできます
  5. 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
    
  6. 新しい端末を起動してnc localhost 44444と入力し、文字列を入力します
    ここに画像の説明を挿入
    ここに画像の説明を挿入

  7. Ctrl + cで閉じます。killは使用できますが、kill -9は使用しないでください。kill-9はフックプログラムを実行しません(仕上げ作業)。

ケース2:ローカルファイルの監視

ケース分析

  1. Flumeがローカルファイルの変更を監視する
  2. crontabを介してタイムリーにファイルを変更する
  3. Flumeはデータをコンソールに出力します

ケースステップ

  1. Flumeディレクトリに空のファイルを作成します。touch date.txt

  2. 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
    
  3. Flumeを起動する

     bin/flume-ng agent -c conf -f exec-flume-logger.conf -n a1 -Dflume.root.logger=INFO,console
    
  4. 新しい端末を起動し、crontab -eと入力して、時間指定タスクを編集し、毎分ファイルを変更して保存します
    ここに画像の説明を挿入

  5. 最終的な効果は次のとおりです。
    ここに画像の説明を挿入

  6. crontab -rと入力して、現在のユーザータイミングタスク削除します。

ケース3:ローカルファイルを監視してHDFSをアップロードする

ケース分析

  1. FlumeはHiveログファイルを監視します
  2. Hiveを起動してログを生成する
  3. Flumeは取得したデータをHDFSに書き込みます

ケースステップ

  1. データをHDFSにアップロードする必要があるため、Hadoop関連のjarパッケージを準備する必要があります。jarパッケージはHadoopインストールディレクトリの下のshare / hadoopディレクトリにあります
    ここに画像の説明を挿入

  2. これらのjarパッケージをFlumeディレクトリの下のlibディレクトリにコピーします。Flumeが起動すると、libの下のjarパッケージがメモリにロードされます:mv tempjar / * /opt/flume-1.9.0/lib

  3. HDFSとYarnを開始します:start-dfs.shstart-yarn.sh

  4. 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
    
  5. Flumeを起動する

     bin/flume-ng agent -c conf -f exec-flume-hdfs.conf -n a1 -Dflume.root.logger=INFO,console
    
  6. 新しいターミナルを開始し、ハイブを開始し、クエリ操作を実行します
    ここに画像の説明を挿入
    ここに画像の説明を挿入

異常な問題

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にアップロードする

ケース分析

  1. Flumeは指定されたディレクトリを監視し、監視されたフォルダは500ミリ秒ごとにファイルの変更をスキャンします
  2. ディレクトリに新しいファイルを追加する
  3. Flumeは取得したデータをHDFSに書き込みます。アップロードされたファイルのローカルサフィックスは、デフォルトで.COMPLETEDですアップロードされていないファイルには、HDFS では.tmpのサフィックス付いています

    Flumeは上記の方法を使用して新しいファイルがあるかどうかを判断しますが、ディレクトリにアップロードされていない.COMPLETEDサフィックスを持つファイルがある場合、Flumeはファイルをアップロードしません。
    同時に、接尾辞が.COMPLETEDのファイルが変更された場合、そのファイルには.COMPLETEDの接尾辞が付いているため、FlumeはそのファイルをHDFSにアップロードしません
    したがって、この方法で変化するデータを動的に監視できません。

ケースステップ

  1. 新しいディレクトリmkdir directoryを作成します

  2. 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
    
  3. Flumeを起動する

     bin/flume-ng agent -c conf -f spooldir-flume-hdfs.conf -n a1 -Dflume.root.logger=INFO,console
    
  4. ディレクトリdirectoryにファイルを作成します:date> one.txtdate> two.txtdate> three.txt
    ここに画像の説明を挿入
    ここに画像の説明を挿入
    ここに画像の説明を挿入

異常な問題

    既存のファイルをディレクトリにスローすると、Flumeはエラーを報告します。たとえば、私はそれにone.txtを投げます、date> one.txtFlumeは、ディレクトリ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は、ブレークポイント再開可能な送信を実現できるだけでなく、データが失われないようにし、リアルタイムの監視も実行できます。

ケースステップ

  1. 新しいディレクトリmkdir fileを作成します

  2. ファイルディレクトリに2つのファイルを作成します:touch one.txttouch two.txt

  3. 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
    
  4. Flumeを起動します。

     bin/flume-ng agent -c conf -f taildir-flume-logger.conf -n a1 -Dflume.root.logger=INFO,console
    
  5. 新しい端末を起動し、エコーA >> one.txtエコーB >> two.txt
    ここに画像の説明を挿入

  6. Ctrl + cで Flume 閉じ、echo C >> one.txtecho D >> two.txtと入力し、Flumeを再起動します
    ここに画像の説明を挿入

  7. 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を使用します。

おすすめ

転載: blog.csdn.net/H_X_P_/article/details/106542199