問題に遭遇の記述、ログ収集時刻同期、2Mサイズよりも単一のログ(ログファイル内のログの行)、データはカフカへの同期を収集することはできませんが、分析した後、次のようにいくつかのピットを踏んました。
1、ログシェル+ EXEC(テール-Fのxxx.log方式)により取得された収集水路、より単一の大きなログ1M未満、ソース端子がイベントログから取得することができない源。
2、より多くの1M、メッセージは表示されませカフカ、カフカの失敗にログを送信するためにプロデューサーとしてカフカシンクの水路よりも後のログ。
これら二つの以下の分析では、ピット上のステップを行い、私はバージョン1.9.0を使用してい水路。カフカ2.11-2.0.0バージョンを使用して
一つの問題は、ログのシェル+ EXEC(テール-Fのxxx.log方式)により取得し、収集水路、より多くの単一の大きなログ1Mよりも、ソース端子は、イベントへのログから取得することができないソース、。次のように水路は以下のとおりです。
...... agent.sources = seqGenSrc ...... #ソースのそれぞれについて、タイプが定義されています agent.sources.seqGenSrc.type =幹部 #agent.sources.seqGenSrc.command =尾-F /opt/logs/test.log|grep businessCollection | awkの-F ' - {' '{印刷 "{" $ 2}' agent.sources.seqGenSrc.command =尾-F /opt/logs/test.log|grep businessCollection agent.sources.seqGenSrc.shell = / binに/ bashの-c agent.sources.seqGenSrc.batchSize = 1 agent.sources.seqGenSrc.batchTimeout = 90000 ......
理由:シェル+ EXECモード時、水路ソースは、ログを取得するために次のように使用されています
プライベートプロセスプロセス= NULL; //このメソッドを使用してコマンドを実行します。 プロセス= Runtime.getRuntime()EXEC(commandArgs)。 //ログを読んで リーダー=新しいBufferedReaderの(新しいInputStreamReaderの(process.getInputStream()、文字セット))。
複数行1Mをログに記録した後、このコードは死を装うだろう、とライブ一顧されている、それが不可能なデータを得ることができます。
:この問題に対処するためのアプローチ
のソースコードの実装を変更します。オプション1。(ソースコードの対応における1.9.0のソースコードは、プロジェクトorg.apache.flume.source.ExecSource.javaクラス-NG-コア水路)
//コードの行を変更するには、以下の方法を取得するプロセス。 プロセス=新しいProcessBuilderを(commandArgs).redirectErrorStream(真).start();
そして、その結果を、編集、再パッケージ、コンパイル、および後の瓶の代わりに、元の古い瓶パッケージ。
第二の方法:TAILDIRソースを使用し、EXECSourceをあきらめます。このソースを使用する場合、以下のように、対応する構成です。
...... agent.sources = seqGenSrc ...... #ソースのそれぞれについて、タイプが定義されています agent.sources.seqGenSrc.type = TAILDIR agent.sources.seqGenSrc.positionFile = ./taildir_position.json agent.sources.seqGenSrc.filegroups = seqGenSrc agent.sources.seqGenSrc.filegroups.seqGenSrc = /opt/logs/test.log agent.sources.seqGenSrc.fileHeader =偽 agent.sources.seqGenSrc.batchSize = 1 ......
ログ収集が繰り返されないように推奨TAILDIRソースは優れている、これは、監視され、複数のログの収集と収集ログ収集positionFileに位置を記録しますすることができます。買収を再起動する際にEXEC SOURCEデータ収集が繰り返されますが、他の方法は、コレクションの重複を避けるために、
カフカ以上1Mよりログインした後、質問2、カフカの失敗にログを送信するためにプロデューサーとしてカフカシンクの水路、メッセージの受信できない
理由:カフカデフォルトでは、唯一のカスタム設定を行うことなく、1Mのサイズ内のメッセージを受け取ることができます時間。したがって、単一のメッセージが1Mを超える処理することはできません。
アプローチは次のよう:
1)、カフカserver.propertiesファイルサーバを変更し)サイズの制限を変更するために(以下の設定を行います
ソケット・サーバによって使用される#送信バッファ(SO_SNDBUF) socket.send.buffer.bytes = 502400 ソケット・サーバによって使用される#受信バッファ(SO_RCVBUF) socket.receive.buffer.bytes = 502400 #要求の最大サイズは、ソケットサーバは、(OOMに対する保護を)受け入れること socket.request.max.bytes = 104857600 message.max.bytes = 5242880 replica.fetch.max.bytes = 6291456
2))サイズの制限を変更するために(以下の設定を行い、producer.propertiesを変更します
#バイト単位で要求の最大径
max.request.size = 9242880
初期カフカ生産で3)、Javaコードはmax.request.size = 9242880を指定する必要が
プロパティプロパティ=新しいプロパティ(); ... properties.put( "max.request.size"、5242880); ... KafkaProducer <オブジェクト、オブジェクト> kafkaProducer =新しいKafkaProducer <オブジェクト、オブジェクト>(プロパティ)。
4)、消費者カフカデータの消費者は、また、消費者のセットメッセージサイズの制限に注意を払うに必要
プロパティプロパティ=新しいプロパティ(); ... properties.put(ConsumerConfig.FETCH_MAX_BYTES_CONFIG、6291456)。 ... KafkaConsumer <文字列、文字列>消費者=新しいKafkaConsumer <>(プロパティ)。