Flume不写入HDFS,除非被杀死

时间:2013-12-17 15:44:17

标签: hadoop hdfs flume

我按照link设置了TwitterSource和HDFS接收器。

用于启动代理的命令:

bin/flume-ng agent -n TwitterAgent -c conf -f conf/flume-conf.properties -Dflume.root.logger=DEBUG,console

我成功地做到了这一点,但现在有一个问题。 在停止水槽剂之前,输出不会被写入。一旦我杀死我的水槽代理,就会写入HDFS。

我在这里有两个问题:

1)如何阻止水槽代理 - 除了执行CTRL + C之外还有其他方法。

2)我可以随时随地将水槽代理写入HDFS,而不必杀死代理。

注意:在终止进程后,写入的文件的扩展名为.tmp。是预期的吗?

修改

TwitterAgent.sinks.HDFS.hdfs.rollSize = 0
TwitterAgent.sinks.HDFS.hdfs.rollCount = 10000
TwitterAgent.sinks.HDFS.hdfs.rollInterval = 600

2 个答案:

答案 0 :(得分:7)

写了多少数据?我打赌它不写,因为你没有收集足够的东西来触发使用默认配置参数刷新HDFS。有一个number of ways to configure the HDFS sink,以便以可预测的方式刷新。您可以设置它以便在一系列事件(hdfs.rollCount),间隔(hdfs.rollInterval)或大小(hdfs.rollSize)上刷新。发生的事情就是当你杀死代理人时,它会清理它当前正在做的事情并冲洗......所以基本上你是通过杀死它来强迫它。

您也可以尝试降低hdfs.batchSize

请记住,Hadoop喜欢更大的文件。一般来说,你应该尽量避免使用大量的小文件。因此,请务必小心滚动。


像你一样在前台运行它,ctrl + c或kill是阻止它的唯一真正方法。在生产中,您应该使用init脚本,它们具有启动/停止/重启。

答案 1 :(得分:1)

谢谢唐纳德和普拉文:

我可以通过在我的flume-conf文件中设置以下内容来解决问题

TwitterAgent.sinks.HDFS.hdfs.batchSize = 1000
TwitterAgent.sinks.HDFS.hdfs.rollSize = 0
TwitterAgent.sinks.HDFS.hdfs.rollCount = 10000

并删除此条目

TwitterAgent.sinks.HDFS.hdfs.rollInterval = 600

现在,flume正在写信给HDFS。