目次
3.1Hiveログのリアルタイム監視とHDFSへのアップロード
3.2HDFSにアップロードされた複数の新しいファイルを監視する
1.フルームの定義
Fiumeは、Clouderaが提供する可用性と信頼性の高い分散型の大量ログ収集、集約、および送信システムです。Flumeは、柔軟でシンプルなストリーミングアーキテクチャに基づいています。
1.1なぜFlumeを選ぶのですか?
Flumeの主な機能は、サーバーのローカルディスクからデータをリアルタイムで読み取り、HDFSに書き込むことです。
2.フルームインフラストラクチャ
2.1Flumeのコンポーネント
- エージェント
エージェントはJVMプロセスであり、ソースから宛先にイベントの形式でデータを送信します。主に、ソース、チャネル、シンクの3つの部分があります。
- ソース
FlumeAgentへのデータの受信を担当するコンポーネント。ソースコンポーネントは、avro、thrift、exec、jms、spooling、directory、netcat、sequence、generator、syslog、http、legacyなど、さまざまなタイプと形式のログデータを処理できます。
- シンク
Sinkは、チャネル内のイベントを継続的にポーリングしてバッチで削除し、これらのイベントをストレージまたはインデックスシステムにバッチで書き込むか、別のFlume Agentに送信します。シンクコンポーネントの宛先には、hdfs、logger、avro、thrift、Ipc、ファイル、Hbase、solr、カスタム。
- チャネル
チャネルはソースとシンクの間のバッファであるため、チャネルを使用すると、ソースとシンクを異なるレートで動作させることができます。チャネルはスレッドセーフであり、複数のソース書き込み操作と複数のシンク読み取り操作を同時に処理できます。
Flumeには、メモリチャネルとファイルチャネルの2つのチャネルがあります。
メモリチャネルは、メモリ内のキューです。メモリチャネルは、データの損失を気にする必要がない状況で使用されます。データの損失を気にする必要がある場合は、メモリチャネルを使用しないでください。プログラムの停止、マシンのダウンタイム、または再起動によってデータが失われるためです。
ファイルチャネルはすべてのイベントをディスクに書き込むため、プログラムのシャットダウンやマシンのダウンタイムが発生してもデータが失われることはありません。
- イベント
Flumeデータ送信の基本ユニットである送信ユニットは、イベントの形式で送信元から宛先にデータを送信します。イベントは、ヘッダーと本文の2つの部分で構成されます。ヘッダーはイベントの一部の属性を格納するために使用されます。これはkv構造です。本文はバイト配列の形式でデータを格納するために使用されます。
2.1 Flumeのインターセプター(インターセプター)
Flumeでは、インターセプターは送信中のイベントをインターセプトして処理することができます。インターセプターはorg.apache.flume.interceptor.Interceptorインターフェースを実装する必要があります。インターセプターは、開発者の設定に従ってイベントを変更または削除することもできます。Flumeは、複数のインターセプターで構成されるインターセプターチェーンもサポートしています。インターセプター内のインターセプターの順序を指定することにより、イベントはインターセプターによって順番に処理されます。
2.2 Flumeのチャネルセレクター(セレクター)
チャネルセレクタは、ソースコンポーネントが複数のチャネルにイベントを送信するシナリオで使用されます。一般的に使用されるのは、複製(デフォルト)と多重化です。複製は複数のチャネルにイベントを複製する役割を果たしますが、多重化はイベント属性と構成パラメータに基づいています。実行され、一致は指定されたチャネルに正常に送信されます。
2.3 Flumeのシンクプロセッサ(プロセッサ)
ユーザーは複数のシンクを全体(シンクグループ)に形成できます。シンクプロセッサを使用して、グループ内のすべてのシンクに負荷分散機能を提供したり、時間障害が発生した場合に1つのシンクから別のシンクへのフェイルオーバーを実装したりできます。
3.Flumeのリアルタイム監視
Execソースは、リアルタイムで追加されたファイルの監視に適していますが、データが失われないことを保証することはできません。SpooldirSourceは、データが失われないことを保証でき、電源オフの再開可能な送信を実現できますが、遅延が発生します。収集されたディレクトリはオフライン収集に適していますが、Taildir Sourceは電源オフの再開可能な送信を実現できるだけでなく、データが失われないようにするだけでなく、リアルタイムで実行することもできます。監視。オフライン収集またはリアルタイム収集に使用できます。
3.1Hiveログのリアルタイム監視とHDFSへのアップロード
需要分析:
実装手順:
1. FlumeがデータをHDFSに出力する場合は、Hadoop関連のjarパッケージを保持し、それを/ opt / module / flume / libフォルダーにコピーする必要があります。
commons-configuration-1.6.jar、
hadoop-auth-2.7.2.jar、
hadoop-common-2.7.2.jar、
hadoop-hdfs-2.7.2.jar、
commons-io-2.4.jar、
htrace-core-3.1.0-incubating.jar
2. flume-file-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/module/hive/logs/hive.log
a2.sources.r2.shell = /bin/bash -c
# Describe the sink
a2.sinks.k2.type = hdfs
a2.sinks.k2.hdfs.path = hdfs://bigdata02:9000/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.rollInterval = 60
#设置每个文件的滚动大小
a2.sinks.k2.hdfs.rollSize = 134217700
#文件的滚动与Event数量无关
a2.sinks.k2.hdfs.rollCount = 0
# Use a channel which buffers events in memory
a2.channels.c2.type = memory
a2.channels.c2.capacity = 10000
a2.channels.c2.transactionCapacity = 1000
# Bind the source and sink to the channel
a2.sources.r2.channels = c2
a2.sinks.k2.channel = c2
3.Flumeを実行します
bin / flume-ngエージェント--confconf / --name a2 --conf-file job / flume-file-hdfs.conf
4. HadoopとHIveをオンにして、ログを生成します
5.HDFSで表示
3.2HDFSにアップロードされた複数の新しいファイルを監視する
需要分析:
1.構成ファイルflume-dir-hdfs.confを作成します
a3.sources = r3
a3.sinks = k3
a3.channels = c3
# Describe/configure the source
a3.sources.r3.type = spooldir
a3.sources.r3.spoolDir = /opt/module/flume/upload
a3.sources.r3.fileSuffix = .COMPLETED
#忽略所有以.tmp结尾的文件,不上传
a3.sources.r3.ignorePattern = \\S*\\.tmp
# Describe the sink
a3.sinks.k3.type = hdfs
a3.sinks.k3.hdfs.path = hdfs://bigdata02:9000/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 = 10000
a3.channels.c3.transactionCapacity = 1000
# Bind the source and sink to the channel
a3.sources.r3.channels = c3
a3.sinks.k3.channel = c3
2.監視フォルダを起動します
bin / flume-ngエージェント--confconf / --name a3 --conf-file job / flume-dir-hdfs.conf
3.アップロードフォルダにファイルを追加します
/ opt / module / flumeディレクトリにアップロードフォルダを作成します
アップロードフォルダにファイルを追加します
4.HDFSでデータを表示します
5. 1秒待って、アップロードフォルダをもう一度クエリします
4.フルームアドバンス
4.1Flumeトランザクション
トランザクションを置く
- doPut:バッチデータを一時バッファのプットリストに書き込みます
- doCommit:チャネルメモリキューがマージするのに十分かどうかを確認します
- doPollback:不十分なチャネルメモリキュースペース、ロールバックデータ
浮気する
- doTake:データを一時バッファーtakeListに抽出し、HDFSに送信します
- doCommit:すべてのデータが正常に送信されたら、一時バッファーtakeListをクリアします
- doRollback:データ送信中に例外が発生した場合、ロールバックは一時バッファtakeList内のデータをチャネルメモリキューに返します
4.2 FlumeAgentの内部原理
4.2.1重要なコンポーネント
1)ChannelSelector
ChannelSelectorの役割は、イベントの送信先のチャネルを選択することです。複製と多重化の2つのタイプがあります。
ReplicatingSelectorはすべてのチャネルに同じイベントを送信し、Multiplexingは対応する原則に従って異なるチャネルに異なるイベントを送信します。
2)SinkProcessor
SinkProcessorには、DefaultSinkProcessor、LoadBalancingSinkProcessor、FailoverSinkProcessorの3種類があります。
DefaultSinkProcessorは単一のシンクに対応し、LoadBalancingSinkProcessorとFailoverSinkProcessorはシンクグループに対応し、LoadBalancingSinkProcessorは負荷分散の機能を実現でき、FailoverSinkProcessorはフェイルオーバーの機能を実現できます。
5.フルーム構造
5.1シンプルシリーズ
このモードは、最初のソースから最後のシンクの宛先ストレージシステムまで、複数の水路を順番に接続します。このモードは、あまりにも多くの水路量を橋渡しすることはお勧めしません。水路量が多すぎると、伝送速度に影響するだけでなく、伝送プロセス中にノードの水路がダウンすると、伝送システム全体に影響します。
5.2コピーと多重化
Flumeは、1つ以上の宛先へのイベントのフローをサポートします。このモードでは、同じデータを複数のチャネルにコピーしたり、異なるデータを異なるチャネルに配布したり、シンクが異なる宛先に送信することを選択したりできます。
5.3負荷分散とフェイルオーバー
Flumeは、複数のシンクをシンクグループに論理的にグループ化する使用をサポートしています。シンクグループをさまざまなSinkProcessorで使用して、負荷分散とエラー回復を実現できます。
5.4集約
このモデルは私たちの最も一般的で非常に実用的です。毎日のWebアプリケーションは通常、数百のサーバー、さらには数千または数万のサーバーに配布されます。生成されたログも処理が非常に面倒です。この水路の組み合わせにより、この問題をうまく解決できます。各サーバーは、水路を展開してログを収集し、ログを収集する水路に転送し、ログ分析のために水路をhdfs、hive、hbaseなどにアップロードします。
6.問題の要約
6.1水路パラメータの調整
1.ソース
ソースの数を増やすと(Tair Dir Sourceを使用する場合はFileGroupの数を増やすことができます)、ソースがデータを読み取る能力を高めることができます。例:特定のディレクトリで生成されるファイルが多すぎる場合、ファイルディレクトリを複数のファイルディレクトリに分割し、同時に複数のソースを構成して、ソースが新しく生成されたデータを取得するのに十分な機能を備えていることを確認する必要があります。
batchSizeパラメーターは、ソースが一度にバッチでチャネルに転送されるイベントの数を決定します。このパラメーターを適切に増やすと、イベントをチャネルに転送するときのソースのパフォーマンスを向上させることができます。
2.チャネル
タイプとしてメモリを選択した場合、チャネルのパフォーマンスは最高になりますが、Flumeプロセスが予期せずハングした場合、データが失われる可能性があります。ファイルタイプを選択すると、チャネルのフォールトトレランスは向上しますが、メモリチャネルよりもパフォーマンスが低下します。
ファイルチャネルを使用する場合、dataDirsは、パフォーマンスを向上させるために、異なるディスクの下に複数のディレクトリを構成します。
Capacityパラメータは、チャネルが保持できるイベントの最大数を決定します。transactionCapacityパラメーターは、Sourceがチャネルに毎回書き込むイベントの最大数とSinkがチャネルから毎回読み取るイベントの最大数を決定します。transactionCapacityはより大きくする必要がありますバッチサイズののパラメータソースおよびシンク。
3.シンク
シンクの数を増やすと、シンクがイベントを消費する能力を高めることができます。シンクは可能な限り大きくありません。シンクが多すぎると、システムリソースを占有し、システムリソースの不要な浪費を引き起こします。
batchSizeパラメーターは、シンクがチャネルから一度にバッチで読み取るイベントの数を決定します。このパラメーターを適切に増やすと、チャネルからのシンク移動イベントのパフォーマンスを向上させることができます。
6.2水路のトランザクションメカニズム
Flumeのトランザクションメカニズム(データベーストランザクションメカニズムと同様):Flumeは、2つの独立したトランザクションを使用して、SoucrceからChannelへ、およびChannelからSinkへのイベント配信を担当します。たとえば、スプーリングディレクトリソースは、ファイルの各行にイベントを作成します。トランザクション内のすべてのイベントがチャネルに配信され、送信が成功すると、Soucrceはファイルに完了のマークを付けます。同様に、トランザクションはチャネルからシンクへの転送プロセスを同様の方法で処理します。何らかの理由でイベントを記録できない場合、トランザクションはロールバックされます。そして、すべてのイベントはチャンネルに残り、再び配信されるのを待ちます。
6.3 Flumeによって収集されたデータは失われますか?
Flumeのアーキテクチャの原則によれば、Flumeがデータを失うことは不可能です。完全な内部トランザクションメカニズムがあります。ソースからチャネルへはトランザクションであり、チャネルからシンクへはトランザクションです。したがって、これら2つのリンクでデータが失われることはありません。考えられる唯一のデータ損失状況は、チャネルがmemoryChannelを使用している、エージェントがダウンしてデータが失われている、またはチャネルストレージデータがいっぱいであるためにソースが書き込まれなくなり、書き込まれていないデータが失われることです。
Flumeはデータを失うことはありませんが、データの重複を引き起こす可能性があります。たとえば、Sinkがデータを正常に送信したのに応答がない場合、S i nkはデータを再送信し、データの重複を引き起こす可能性があります。