当前位置: 首页 > 知识库问答 >
问题:

通过HDFS接收器将flume事件写入S3确保事务

巫马昆杰
2023-03-14

我们使用Flume和S3来存储我们的事件。我认识到,只有当HDFS接收器滚动到下一个文件或Flume优雅地关闭时,事件才会传输到S3。

在我看来,这可能会导致潜在的数据丢失。Flume文档写道:

...Flume使用事务性方法来保证事件的可靠传递。。。

此处是我的配置:

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

我想我只是做错了什么,有什么想法吗?

共有1个答案

裴畅
2023-03-14

经过一些调查,我发现使用S3与水槽和HDFS水槽的主要问题之一。

普通HDFS和S3实现之间的主要区别之一是S3不直接支持重命名。当文件在S3中重命名时,文件将被复制到新名称,旧文件将被删除。(请参阅:如何在Amazon S3中重命名文件和文件夹?)

当文件未满时,Flume默认使用. tmp扩展文件。轮换后,文件将重命名为最终文件名。在HDFS中,这不会有问题,但在S3中,这可能会导致此问题:https://issues.apache.org/jira/browse/FLUME-2445

由于S3的HDFS接收器接缝不完全可靠,因此我更喜欢将所有文件保存在本地并使用aws工具S3 sync同步/删除完成的文件的更安全的方法(http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html)

在更糟糕的情况下,文件不同步或本地磁盘已满,但这两个问题都可以通过无论如何都应该使用的监控系统轻松解决。

 类似资料:
  • 我使用cdh3 update 4 tarball进行开发。我已经安装并运行了hadoop。现在,我还从cloudera viz 1.1.0下载了等效的flume tarball,并尝试使用hdfs-sink将日志文件的尾部写入hdfs。当我运行flume代理时,它开始正常,但当它试图将新的事件数据写入hdfs时,却以错误结束。我找不到比stackoverflow更好的小组来发布这个问题。这是我正在

  • 如果Flume代理在HDFS文件写入过程中被杀死(比如使用Avro格式),有人能解释一下会发生什么吗?文件会被破坏,所有事件都会丢失吗? 我了解Flume数据链的不同元素之间存在交易(来源-

  • 尝试运行水槽作业时,我收到下面给出的错误。我正在云时代设置上运行它。 Kafka是来源 Morphline用作拦截器,从中创建avro记录 接收器为HDFS 完全相同的文件(morphline,avro schema等。水槽配置)。但是在另一个环境中,它会抛出这个错误。 我能够在水槽上找到相关代码:https://github.com/apache/flume/blob/trunk/flume-n

  • 我是Flume的新手。我有一个大的 CSV 文本文件,其中包含记录,每个记录的长度约为 50 个字符,CR-LF 终止了这些行。我想使用Flume将这些数据摄取到HDFS中。结果是只有文件的一行被写入HDFS(如果该线索有帮助,它是文件的第二行)。 我在输出中没有看到任何错误。谢谢。详情如下。 这是我的执行命令: Flume-ng代理--conf--conf文件example.conf--name

  • 我正在使用Flume从我的本地文件系统写一些CSV文件到HDFS。 我想知道HDFS水槽的最佳配置是什么,这样本地系统上的每个文件都会在HDFS以CSV格式准确复制。我希望Flume处理的每个CSV文件都是单个事件,作为单个文件刷新和写入。尽可能多地,我希望文件是完全一样的,没有标题的东西等。 我需要在这些值上加什么来模拟我想要的行为? 如果还有其他Flume代理配置变量需要更改,请提供。 如果这

  • 在HDFS中写入日志文件的最佳方式是什么?我正在尝试配置Apache Flume,并尝试配置能够为我提供数据可靠性的源。我试图配置“exec”,后来也查看了“spooldir”,但flume.apache上的以下文档。org对我的意图表示怀疑- 执行来源: 最常请求的功能之一是像“tail -F file_name”这样的用例,其中应用程序写入磁盘上的日志文件,Flume 尾随文件,将每一行作为事