我正在使用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
答案 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文件。 这是否也没有发生?您能确认吗?
希望这会有所帮助!