使用flume将文件从假脱机目录移动到HDFS

时间:2014-12-23 13:47:25

标签: hadoop hdfs flume

我在公司为POC实施了一个小型的hadoop集群。我试图用Flume将文件导入HDFS。每个文件都包含这样的JSON对象(1"长"每个文件行):

{ "objectType" : [ { JSON Object } , { JSON Object }, ... ] }

"的objectType"是数组中对象的类型(例如:events,users,...)。

稍后将根据" objectType"处理这些文件。

我正在使用spoolDir源和HDFS接收器。

我的问题是:

  • 当水槽写入HDFS时,是否可以保留源文件名(文件名是唯一的,因为它们包含时间戳和名称中的UUID)

  • 有没有办法设置" deserializer.maxLineLength"到无限值(而不是设置一个高值)?

  • 我真的不想丢失数据。哪个渠道最好,JDBC还是文件? (我没有高吞吐量的流程)

我的约束是我必须尽可能地使用水槽(没有自定义元素)。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

  

当水槽写入HDFS时,是否可以保留源文件名(文件名是唯一的,因为它们的名称中包含时间戳和UUID)

是。使用spooldir源,确保fileheader属性设置为true。这将包括带有记录的文件名。

agent-1.sources.src-1.fileHeader = true

然后,对于您的接收器,使用avro_event序列化器捕获avro flume事件记录标题中的文件名。

agent-1.sinks.snk-1.serializer = avro_event

avro记录符合此架构。 https://github.com/apache/flume/blob/trunk/flume-ng-core/src/main/java/org/apache/flume/serialization/FlumeEventAvroEventSerializer.java#L30

  

有没有办法设置" deserializer.maxLineLength"到无限值(而不是设置一个高值)?

deserializer.maxLineLength没有无限制的配置。 https://github.com/apache/flume/blob/trunk/flume-ng-core/src/main/java/org/apache/flume/serialization/LineDeserializer.java#L143

  

我真的不想丢失数据。哪个渠道最好,JDBC还是文件? (我没有高吞吐量的流程)

这可能取决于您对数据库或文件系统的弹性选项。如果您有备份的冗余数据库,那么JDBC。如果您有一个具有弹性的持久文件系统,那么请转到文件。