2017-06-08 79 views
0

我是Flume的新用戶,請把我當作絕對noob。我正在爲一個特定用例配置Flume這個小問題,並希望你能提供幫助。請注意,我沒有使用HDFS,這就是爲什麼這個問題與您在論壇上看到的其他問題不同。Apache Flume - 只發送新文件內容

我有兩臺虛擬機(VM)通過Oracle Virtual Box上的內部網絡相互連接。我的目標是讓一個虛擬機監視一個只有一個文件的特定目錄。當文件改變時,我希望Flume只發送新的行/數據。我希望其他虛擬機接收這些數據並將數據更新/連接到一個特定目錄中的單個文件。

到目前爲止,我有這個過程非常接近工作。每當在VM1中進行更改時,都會在VM2上進行更新。但是,VM1上的整個文件每次都發送到VM2,而不是新行。例如,如果我寫「測試1」,然後過了一會兒底下寫了「Test2的」關於VM1文件,對VM2輸出將是:

Test1的

Test1的

的Test2

我想看到的是:

  Test1 

      Test2 

我不知道如何實現這一點,透後我這封電子郵件是檢查水槽用戶指南documentatio n和大多數相關的文章在stackoverflow/stackexchange上。以下是目前的配置(它們以我上面提到的方式工作)供您參考。

VM1 configuration

VM2 configuration

我意識到另一個解決辦法是繼續VM1配置和覆蓋檢測到新的內容上VM2每次文件。但是,我也不確定如何實現這一點。

您可以提供的任何援助非常感謝!

+0

請忽略我的代碼中的一些評論,我正在嘗試。忘了那裏:) –

+0

我現在想,我也可以通過定期刪除最終目錄中的文件來解決這個問題。 –

+0

作爲另一種可能的解決方法,我正在考慮使用假脫機目錄源和file_roll接收器將目標目錄附加到代理,同時file_roll的目標是相同的目錄。通過這種方式,我將基本上執行刷新操作,因爲假脫機目錄源允許您在將文件讀入通道後刪除文件。 –

回答

1

使用Flume中提供的TailDir源代碼,它週期性地寫入位置文件中讀取的最後位置,並且它比exec源更可靠,因爲即使代理程序崩潰或由於某種原因停止,它也會從保存在位置的最後位置開始讀取文件。

agent1.sources.src1.type = TAILDIR 
agent1.sources.src1.channels = ch1 
agent1.sources.src1.filegroups =f1 
agent1.sources.src1.filegroups.f1= //path to log file 
agent1.sources.src1.maxBackoffSleep = 10000 

設置maxBackoffSleep值根據自己的需要就意味着多一次最大代理應如何投票之前等待在日誌文件中的變化,當它沒有找到在做最後的嘗試任何改變。

+0

由於項目推遲,我還沒有檢查過這個線程。我現在要試試這個。這隻適用於.json格式嗎?如果我想傳輸.txt或.csv,該怎麼辦? –

+0

因此它適用於.txt格式。但是,每次我只向該文件添加一行時,它仍然在文件中發送所有內容。我誤解了嗎?所以在VM1上,我有一個TAILDIR源代碼和avro接收器。在VM2上,我有一個avro源和一個file_roll接收器。 –

+0

請檢查位置是否正在寫入文件\t〜/ .flume/taildir_position.json –