通过 HDFS Sink 将带有 flume 的事件写入 S3 确保事务
Write event with flume to S3 via HDFS Sink ensure transaction
我们正在使用 flume 和 S3 来存储我们的事件。
我认识到只有当 HDFS 接收器滚动到下一个文件或 flume 正常关闭时,事件才会传输到 S3。
在我看来,这可能会导致潜在的数据丢失。 Flume 文档写道:
...Flume uses a transactional approach to guarantee the reliable
delivery of the Events...
这是我的配置:
agent.sinks.defaultSink.type = HDFSEventSink
agent.sinks.defaultSink.hdfs.fileType = DataStream
agent.sinks.defaultSink.channel = fileChannel
agent.sinks.defaultSink.serializer = avro_event
agent.sinks.defaultSink.serializer.compressionCodec = snappy
agent.sinks.defaultSink.hdfs.path = s3n://testS3Bucket/%Y/%m/%d
agent.sinks.defaultSink.hdfs.filePrefix = events
agent.sinks.defaultSink.hdfs.rollInterval = 3600
agent.sinks.defaultSink.hdfs.rollCount = 0
agent.sinks.defaultSink.hdfs.rollSize = 262144000
agent.sinks.defaultSink.hdfs.batchSize = 10000
agent.sinks.defaultSink.hdfs.useLocalTimeStamp = true
#### CHANNELS ####
agent.channels.fileChannel.type = file
agent.channels.fileChannel.capacity = 1000000
agent.channels.fileChannel.transactionCapacity = 10000
我假设我只是做错了什么,有什么想法吗?
经过一番调查后,我发现使用带有 flume 和 HDFS 接收器的 S3 的主要问题之一。
普通 HDFS 和 S3 实现之间的主要区别之一是 S3 不直接支持重命名。当在 S3 中重命名文件时,文件将被复制并使用新名称,旧文件将被删除。 (参见:How to rename files and folder in Amazon S3?)
Flume 默认情况下在文件未满时使用 .tmp 扩展文件。旋转后,文件将重命名为最终文件名。在 HDFS 中,这没有问题,但在 S3 中,根据这个问题,这可能会导致问题:
https://issues.apache.org/jira/browse/FLUME-2445
因为带有 HDFS 接收器接缝的 S3 不是 100% 可信的,我更喜欢将所有文件保存在本地和 sync/delete 使用 aws 工具 s3 sync (http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html)
在更糟糕的情况下,文件未同步或本地磁盘已满,但这两个问题都可以通过无论如何都应该使用的监控系统轻松解决。
我们正在使用 flume 和 S3 来存储我们的事件。 我认识到只有当 HDFS 接收器滚动到下一个文件或 flume 正常关闭时,事件才会传输到 S3。
在我看来,这可能会导致潜在的数据丢失。 Flume 文档写道:
...Flume uses a transactional approach to guarantee the reliable delivery of the Events...
这是我的配置:
agent.sinks.defaultSink.type = HDFSEventSink
agent.sinks.defaultSink.hdfs.fileType = DataStream
agent.sinks.defaultSink.channel = fileChannel
agent.sinks.defaultSink.serializer = avro_event
agent.sinks.defaultSink.serializer.compressionCodec = snappy
agent.sinks.defaultSink.hdfs.path = s3n://testS3Bucket/%Y/%m/%d
agent.sinks.defaultSink.hdfs.filePrefix = events
agent.sinks.defaultSink.hdfs.rollInterval = 3600
agent.sinks.defaultSink.hdfs.rollCount = 0
agent.sinks.defaultSink.hdfs.rollSize = 262144000
agent.sinks.defaultSink.hdfs.batchSize = 10000
agent.sinks.defaultSink.hdfs.useLocalTimeStamp = true
#### CHANNELS ####
agent.channels.fileChannel.type = file
agent.channels.fileChannel.capacity = 1000000
agent.channels.fileChannel.transactionCapacity = 10000
我假设我只是做错了什么,有什么想法吗?
经过一番调查后,我发现使用带有 flume 和 HDFS 接收器的 S3 的主要问题之一。
普通 HDFS 和 S3 实现之间的主要区别之一是 S3 不直接支持重命名。当在 S3 中重命名文件时,文件将被复制并使用新名称,旧文件将被删除。 (参见:How to rename files and folder in Amazon S3?)
Flume 默认情况下在文件未满时使用 .tmp 扩展文件。旋转后,文件将重命名为最终文件名。在 HDFS 中,这没有问题,但在 S3 中,根据这个问题,这可能会导致问题: https://issues.apache.org/jira/browse/FLUME-2445
因为带有 HDFS 接收器接缝的 S3 不是 100% 可信的,我更喜欢将所有文件保存在本地和 sync/delete 使用 aws 工具 s3 sync (http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html)
在更糟糕的情况下,文件未同步或本地磁盘已满,但这两个问题都可以通过无论如何都应该使用的监控系统轻松解决。