7

一連のサーバー(主にTomcatインスタンスとApache Httpdを実行している)からさまざまな種類のログを収集し、5ノードのHadoopクラスター上のHDFSにダンプするようにFlume-NGをセットアップしようとしています。セットアップは次のようになります。

Flume-Hadoopのセットアップ

各アプリケーションサーバーは、関連するログをいずれかのExecソース(ログタイプごとに1つ:java、httpd、syslog)にテールし、FileChannelを介してAvroシンクに送信します。各サーバーでは、さまざまなソース、チャネル、およびシンクが1つのエージェントによって管理されます。イベントは、Hadoopクラスター(SecondaryNameNodeとJobtrackerもホストするノード)にあるAvroSourceによって取得されます。ログタイプごとに、異なるポートでリッスンしているAvroSourceがあります。イベントはFileChannelを経由してHDFSシンクに送られ、FlumeEventAvroEventSerializerとSnappy圧縮を使用してイベントが保存されます。

問題:JVMのヒープサイズを変更しなかったため、HDFSシンクを管理するHadoopノード上のエージェント(ここでも、ログタイプごとに1つ)が数時間後に失敗しました。それ以降、HadoopノードのFileChannelが最大容量に達したため、そのノードのFileChannelで、その後はアプリケーションサーバーのFileChannelでも多くのイベントが収集されました。問題を修正したとき、Hadoopノードのエージェントにバックログを十分に迅速に処理させることができなかったため、通常の操作を再開できませんでした。FileChannelがイベントをシンクする前に保存するtmpディレクトリのサイズは、常に大きくなり続けます。また、HDFSの書き込みは非常に遅いようです。新しいイベントを取り込む前に、Flumeに最初にバックログを処理させる方法はありますか?次の構成は最適ですか?多分関連:HDFSに書き込まれるファイルは非常に小さく、約1〜3MB程度です。これは、HDFSのデフォルトのブロックサイズが64MBであり、将来のMR操作に関しては確かに最適ではありません。HDFSブロックサイズに十分な大きさのファイルにイベントを収集するには、どの設定を使用する必要がありますか?Hadoopノードの構成が正しくないと感じています。BatchSize、RollCount、および関連するパラメーターの値がオフになっていると思われますが、最適な値がどうあるべきかわかりません。

アプリケーションサーバーの設定例:

agent.sources=syslogtail httpdtail javatail
agent.channels=tmpfile-syslog tmpfile-httpd tmpfile-java
agent.sinks=avrosink-syslog avrosink-httpd avrosink-java

agent.sources.syslogtail.type=exec
agent.sources.syslogtail.command=tail -F /var/log/messages
agent.sources.syslogtail.interceptors=ts
agent.sources.syslogtail.interceptors.ts.type=timestamp
agent.sources.syslogtail.channels=tmpfile-syslog
agent.sources.syslogtail.batchSize=1

...

agent.channels.tmpfile-syslog.type=file
agent.channels.tmpfile-syslog.checkpointDir=/tmp/flume/syslog/checkpoint
agent.channels.tmpfile-syslog.dataDirs=/tmp/flume/syslog/data

...

agent.sinks.avrosink-syslog.type=avro
agent.sinks.avrosink-syslog.channel=tmpfile-syslog
agent.sinks.avrosink-syslog.hostname=somehost
agent.sinks.avrosink-syslog.port=XXXXX
agent.sinks.avrosink-syslog.batch-size=1

Hadoopノードの設定例

agent.sources=avrosource-httpd avrosource-syslog avrosource-java
agent.channels=tmpfile-httpd tmpfile-syslog tmpfile-java
agent.sinks=hdfssink-httpd hdfssink-syslog hdfssink-java

agent.sources.avrosource-java.type=avro
agent.sources.avrosource-java.channels=tmpfile-java
agent.sources.avrosource-java.bind=0.0.0.0
agent.sources.avrosource-java.port=XXXXX

...

agent.channels.tmpfile-java.type=file
agent.channels.tmpfile-java.checkpointDir=/tmp/flume/java/checkpoint
agent.channels.tmpfile-java.dataDirs=/tmp/flume/java/data
agent.channels.tmpfile-java.write-timeout=10
agent.channels.tmpfile-java.keepalive=5
agent.channels.tmpfile-java.capacity=2000000

...

agent.sinks.hdfssink-java.type=hdfs
agent.sinks.hdfssink-java.channel=tmpfile-java
agent.sinks.hdfssink-java.hdfs.path=/logs/java/avro/%Y%m%d/%H
agent.sinks.hdfssink-java.hdfs.filePrefix=java-
agent.sinks.hdfssink-java.hdfs.fileType=DataStream
agent.sinks.hdfssink-java.hdfs.rollInterval=300
agent.sinks.hdfssink-java.hdfs.rollSize=0
agent.sinks.hdfssink-java.hdfs.rollCount=40000
agent.sinks.hdfssink-java.hdfs.batchSize=20000
agent.sinks.hdfssink-java.hdfs.txnEventMax=20000
agent.sinks.hdfssink-java.hdfs.threadsPoolSize=100
agent.sinks.hdfssink-java.hdfs.rollTimerPoolSize=10
4

1 に答える 1

8

問題を引き起こす可能性のある構成がいくつかあります。

  1. 最初のエージェントには、バッチサイズが1のavroシンクがあるようです。これを少なくとも100以上に増やす必要があります。これは、2番目のエージェントのavroソースがバッチサイズ1のチャネルにコミットするためです。コミットするたびにfsyncが発生し、ファイルチャネルのパフォーマンスが低下します。execソースのバッチサイズも1であるため、そのチャネルも遅くなります。バッチサイズを増やすことができます(またはスプールディレクトリソースを使用します-これについては後で詳しく説明します)。

  2. パフォーマンスを向上させるために、同じチャネルから複数のHDFSシンクを読み取ることができます。複数のHDFSシンクが同じファイルに書き込もうとしないように、各シンクが異なるディレクトリに書き込むか、異なる「hdfs.filePrefix」を持っていることを確認する必要があります。

  3. HDFSシンクのバッチサイズは20000で、これは非常に大きく、callTimeoutはデフォルトの10秒です。このような巨大なバッチサイズを維持したい場合は、「hdfs.callTimeout」を増やす必要があります。バッチサイズを1000程度に減らし、タイムアウトを約15〜20秒にすることをお勧めします。(現在のバッチサイズでは、各ファイルは2つのバッチしか保持しないことに注意してください。したがって、バッチサイズを減らし、rollIntervalとtimeOutを増やします)

tail -Fを使用している場合は、新しいスプールディレクトリソースを試すことをお勧めします。このソースを使用するには、ログファイルをローテーションしてディレクトリに移動します。このディレクトリは、スプールディレクトリソースによって処理されます。このソースは不変のファイルのみを処理するため、ログファイルをローテーションする必要があります。Flumeユーザーガイドに記載されているように、execsourceでtail-Fを使用すると問題が発生します。

于 2013-01-31T00:30:18.260 に答える