我是使用Apache Flume的新手,我很难理解它是如何工作的。为了解释我的问题,我解释了我的需要以及我所做的事情。
我想在csv文件目录(这些文件每5分钟构建一次)和HDFS集群之间配置一个流。
我发现"假脱机目录"源和HDFS接收器是我需要的。那给了我这个flume.conf文件
agent.sources = seqGenSrc
agent.channels = memoryChannel
agent.sinks = hdfsSink
# For each one of the sources, the type is defined
agent.sources.seqGenSrc.type = spooldir
agent.sources.seqGenSrc.spoolDir = /home/user/data
# The channel can be defined as follows.
agent.sources.seqGenSrc.channels = memoryChannel
# Each sink's type must be defined
agent.sinks.hdfsSink.type = hdfs
agent.sinks.hdfsSink.hdfs.path = hdfs://localhost/Flume/data
agent.sinks.hdfsSink.hdfs.fileType = DataStream
agent.sinks.hdfsSink.hdfs.writeFormat=Text
#Specify the channel the sink should use
agent.sinks.hdfsSink.channel = memoryChannel
# Each channel's type is defined.
agent.channels.memoryChannel.type = memory
# Other config values specific to each type of channel(sink or source)
# can be defined as well
# In this case, it specifies the capacity of the memory channel
agent.channels.memoryChannel.capacity = 100
结果是输入文件被重命名为" .complete"在我的本地文件系统和数据上传到HDFS上的新名称我认为是独特的并由Flume生成。
这几乎是我所需要的。
但在上传之前,我想做一些特定于文件的操作(删除标题,转义逗号..)。我不知道该怎么做,我想使用拦截器。但是当数据流入时,它会在事件中发生转变,并且它会在事件中发生变化。流。在他看来,没有文件知识。
否则,原始时间事件将写入文件名,因此我希望这次与我的事件而不是当前日期相关联。
我还想在hdfs中保留orignal文件名(其中有一些有用的信息)。
有人建议帮助我吗?
答案 0 :(得分:1)
如果指定
,原始文件名可以保留为标题agent.sources.seqGenSrc.fileHeader=true
然后可以在你的接收器中检索。
如果您想操纵文件中的数据,请使用拦截器。您应该知道事件基本上是假脱机目录中文件的一行。
最后但并非最不重要的是,您希望使用fileHeader属性将事件传递回正确的文件。这可以通过在接收器中指定路径来实现,如下所示:
agent.sinks.hdfsSink.hdfs.path = hdfs://localhost/Flume/data/%{file}
您可以使用Prefix和Suffix进一步配置文件名:
hdfs.filePrefix FlumeData Name prefixed to files created by Flume in hdfs directory
hdfs.fileSuffix – Suffix to append to file (eg .avro - NOTE: period is not automatically added)