我在公司为POC实施了一个小型的hadoop集群。我试图用Flume将文件导入HDFS。每个文件都包含这样的JSON对象(1"长"每个文件行):
{ "objectType" : [ { JSON Object } , { JSON Object }, ... ] }
"的objectType"是数组中对象的类型(例如:events,users,...)。
稍后将根据" objectType"处理这些文件。
我正在使用spoolDir源和HDFS接收器。
我的问题是:
当水槽写入HDFS时,是否可以保留源文件名(文件名是唯一的,因为它们包含时间戳和名称中的UUID)
有没有办法设置" deserializer.maxLineLength"到无限值(而不是设置一个高值)?
我真的不想丢失数据。哪个渠道最好,JDBC还是文件? (我没有高吞吐量的流程)
我的约束是我必须尽可能地使用水槽(没有自定义元素)。
感谢您的帮助!
答案 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
有没有办法设置" 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。如果您有一个具有弹性的持久文件系统,那么请转到文件。