2017-06-08 53 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 –