如何使用Flume将数据实时写入HDFS?

时间:2018-10-16 15:38:05

标签: hadoop hive hdfs bigdata flume

我正在使用Flume将传感器数据存储在HDFS中。一旦通过MQTT接收到数据。订阅者将JSON格式的数据发布到Flume HTTP侦听器。它当前工作正常,但问题是直到我停止将水槽写入HDFS文件(否则文件大小达到128MB)。我正在使用Hive在读取时应用架构。不幸的是,生成的配置单元表仅包含1个条目。这是正常现象,因为Flume没有将新的即将写入的数据写入文件(由Hive加载)。

有什么方法可以迫使Flume以近乎实时的方式将新的数据写入HDFS?因此,我不需要重新启动它或使用小文件吗?

  

这是我的水槽配置:

# Name the components on this agent
emsFlumeAgent.sources = http_emsFlumeAgent
emsFlumeAgent.sinks = hdfs_sink
emsFlumeAgent.channels = channel_hdfs

# Describe/configure the source
emsFlumeAgent.sources.http_emsFlumeAgent.type = http
emsFlumeAgent.sources.http_emsFlumeAgent.bind = localhost
emsFlumeAgent.sources.http_emsFlumeAgent.port = 41414

# Describe the sink
emsFlumeAgent.sinks.hdfs_sink.type = hdfs
emsFlumeAgent.sinks.hdfs_sink.hdfs.path = hdfs://localhost:9000/EMS/%{sensor}
emsFlumeAgent.sinks.hdfs_sink.hdfs.rollInterval = 0
emsFlumeAgent.sinks.hdfs_sink.hdfs.rollSize = 134217728
emsFlumeAgent.sinks.hdfs_sink.hdfs.rollCount=0

#emsFlumeAgent.sinks.hdfs_sink.hdfs.idleTimeout=20
# Use a channel which buffers events in memory
emsFlumeAgent.channels.channel_hdfs.type = memory
emsFlumeAgent.channels.channel_hdfs.capacity = 10000
emsFlumeAgent.channels.channel_hdfs.transactionCapacity = 100

# Bind the source and sinks to the channel
emsFlumeAgent.sources.http_emsFlumeAgent.channels = channel_hdfs 
emsFlumeAgent.sinks.hdfs_sink.channel = channel_hdfs

1 个答案:

答案 0 :(得分:0)

我认为这里的棘手问题是您想将数据几乎实时地写入HDFS,但也不希望有小文件(出于明显的原因),这可能很难实现。

您需要在以下两个参数之间找到最佳平衡:

hdfs.rollSize (Default = 1024)-要触发滚动的文件大小,以字节为单位(0:从不基于文件大小滚动)

hdfs.batchSize (Default = 100)-在刷新到HDFS之前写入文件的事件数

如果您的数据在首选的持续时间内不太可能达到128 MB,那么您可能需要减少rollSize,但只需要减少到不会碰到small files problem的程度。

由于您尚未在HDFS接收器中设置任何批处理大小,因此,每100条记录后,您应该会看到HDFS刷新的结果,但是一旦刷新的记录的大小合计达到128 MB,内容将被汇总到128 MB文件。 这是否也没有发生?您能确认吗?

希望这会有所帮助!