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