単一のログデータがもたらすにピット同期の失敗に非常に大きなステップであるため、カフカを考えるために、ログ水路のexecソース取得

問題に遭遇の記述、ログ収集時刻同期、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 <>(プロパティ)。

  

  

おすすめ

転載: www.cnblogs.com/laoqing/p/11813554.html