Flume_Channel

来源:互联网 发布:开淘宝店到底怎么样 编辑:程序博客网 时间:2024/06/10 08:12
  1. 事务工作流

    Flume Channel是事务性的,由于性能的原因总是推荐每个事务有相当大数量的事件,批量写入Channel是很重要的,尤其是持久的Channel。如果sink读取完一个事件,该事件对于其他sink就是不可用的,除非回滚该sink事务。单个事务不能同时写入和读取事件。这保证了source只能往channel中放入事件,sink只能从channel中取走事件。

  2. flume自带的channel

    flume自带两种channel:memory channel和file channel。两种channel都是线程安全的,并且可以操作多个source和sink。

  3. memory channel:

    在堆上存储写入的事件。实际上,memory channel是内存中的队列——source从它的尾部写入,sink从它的头部读取。memory channel支持很高的吞吐量,因为它在内存中保存所有的数据。由于线程安全,它可以同时处理几个source的写入操作和几个sink的读取操作。

    尽管flume不能保证顺序性,但是memorychannel能保证事件以它们被写入的顺序进行读取。然而,当某些事务回滚,后写入的事件有可能更早写出到目的地。

    这里写图片描述

  4. file channel:

    ① 它被设计为高并发且可以同时处理多个source和sink,file channel通过把多个磁盘挂载到不同的挂载点,允许用户配置多个磁盘的使用。建议为file channel检查点使用一个单独的磁盘。检查点反映了检查点写出瞬间channel的确切状态。file channel无须读取所有的数据文件,就能使用检查点迅速重启。

    这里写图片描述
    这里写图片描述
    ② 因为多个source可以写入到一个channel,channel将以不同的线程并行写到不同的数据目录,因此并行磁盘的使用会有更好的性能。

    ③ dataDirs设置多个数据目录。即使一个磁盘或有限数量的磁盘,每个磁盘可以使用多个数据目录以获得更好的性能。file channel定期写出到检查点以快速重启和恢复。checkpointDir参数的值指定了检查点写入的目录。如果channel正在写入检查点时停止,检查点可能是不完整或损坏的,损坏或不完整的检查点会导致channel重启得非常慢,因为channel需要从所有的数据文件读取和重新进行。

    ④ 如果写入磁盘失败,file channel会丢失数据。即使很多磁盘中的一块盘channel写入数据失败,channel可能也不会恢复任何数据——即使磁盘上没有失败的事件也可能不会恢复。为了避免这种情况,filechannel使用RAID-ed磁盘是一个好主意。

    ⑤ file channel使用NFS-mounted磁盘不是一个好主意,因为NFS不能提供像本地磁盘一样的保证。特别是,文件同步系统调用不能保证数据持久化到物理磁盘上,所以如果机器或Agent宕机,file channel可能会丢失数据。

    ⑥ file channel的设计和实现:
    file channel持久化每个事件到磁盘,同时也持久化每个执行到磁盘的操作。file channel维护了两个独立的数据结构:flume事件队列和write-ahead日志。通过读取WAL并以实际发生的顺序执行每条操作,我们可以在任何时候重新构建channel的文件状态。当channel通过读取所有的数据文件被完整重构,这称为全回放。全回放通常是消耗时间和破坏性的,因为需要读取所有的数据文件,WAL中的每个操作必须执行。
    在启动时,flume开始一个被称为回放的程序,可以让channel回到之前停止时的确切状态。启动仅仅通过内存映射检查点文件,队列就可以被加载到内存。然后从检查点的时刻从偏移量读取数据文件(偏移量被记录在检查点时刻数据文件的元数据中),并且写入和读取操作将按顺序应用到队列。
    一旦回放完成,channel就为正常操作做好了准备。当没有队列存在或当他是不完整时,channel就进行全回放。channel可以在检查点完成之后立即备份,所以如果现在的检查点损坏,或者agent在完成之前被杀死,那么可以加载备份检查点来避免全回放。

原创粉丝点击