flume Channel选择器

Flume选择器 前言 Channel选择器是决定Source接受的特定事件写入到哪个Channel的组件,他们告诉Channel处理器,然后由其将事件写入到Channel。 Agent中各个组件的交互 由于Flume不是两阶段提交,事件被写入到一个Channel,然后事件在写入下一个Channel之前提交,如果写入一个Channel出现异常,那么之前已经写入到... 阅读详情

简介

channel处理器用于决定source接收的时间写入哪个channel,由其通知channel,并将时间写入。

选择器类型

flume自带两种选择器:
1.relicating(复制选择器),默认使用
2.multiplexing(多路复用选择器)

1.复制选择器

复制选择器会复制每个source接收的事件,将事件复制并分发到所有channel,可通过配置参数,控制分发的channel。

配置参数
参数描述
typereplicating
optionalchannel名(即channel可选,失败时不会再次发送)
配置示例:
agent.sources.s1.type=avro
agent.sources.s1.channels = c1 c2 c3
agnet.sources.s1.selector.type=relicating
agent.sources.s1.selector.optional= c3

按上面配置,当source写c3失败时,不会抛出ChannelException异常,因此c3也不会导致source发送重试。

源码分析:

/**
 * Replicating channel selector. This selector allows the event to be placed
 * in all the channels that the source is configured with.
 */
public class ReplicatingChannelSelector extends org.apache.flume.channel.AbstractChannelSelector {

  /**
   * Configuration to set a subset of the channels as optional.
   */
  public static final String CONFIG_OPTIONAL = "optional";
  List<Channel> requiredChannels = null;
  List<Channel> optionalChannels = new ArrayList<Channel>();

  @Override
  //返回所有除option的channel列表
  public List<Channel> getRequiredChannels(Event event) {
    /*
     * Seems like there are lot of components within flume that do not call
     * configure method. It is conceiveable that custom component tests too
     * do that. So in that case, revert to old behavior.
     */
    if (requiredChannels == null) {
      return getAllChannels();
    }
    return requiredChannels;
  }

  @Override
  //返回所有option channel列表
  public List<Channel> getOptionalChannels(Event event) {
    return optionalChannels;
  }

  @Override
  public void configure(Context context) {
    String optionalList = context.getString(CONFIG_OPTIONAL);
    requiredChannels = new ArrayList<Channel>(getAllChannels());
    Map<String, Channel> channelNameMap = getChannelNameMap();
    if (optionalList != null && !optionalList.isEmpty()) {
      for (String optional : optionalList.split("\\s+")) {
        Channel optionalChannel = channelNameMap.get(optional);
        //如channel在channels后配置了,也在option配置了,则应从去除,只作为option channel
        requiredChannels.remove(optionalChannel);
        if (!optionalChannels.contains(optionalChannel)) {
          optionalChannels.add(optionalChannel);
        }
      }
    }
  }
}

2.多路复用选择器

多路复用选择器常通过报头的某个值来选择写入哪一个channel。

配置参数
参数描述
typemultiplexing
header报头
mapping.<header.value>报头映射列表,由报头的值匹配
optional.<header.value>与mapping一样,但写入失败会被忽略

配置示例:

agent.sources.s1.type=avro
agent.sources.s1.channels = c1 c2 c3 c4 c5
agnet.sources.s1.selector.type= multiplexing
agent.sources.s1.selector.header= priority
agent.sources.s1.selector.mapping.1 = c1 c2
agent.sources.s1.selector.mapping.2 = c2
agent.sources.s1.selector.optional.1= c3 
agent.sources.s1.selector.optional.2= c4 
agent.sources.s1.selector.optional.3= c4
agent.sources.s1.selector.default= c5

如按上配置,选择器会根据header里面的键priority(键)进行选择。
当值为1时,会写入c1,c2,c3,若写入c3出错,不会重试。
当值为2时,会写入c2和c4,写入c4,出错不会重试。
当值为3时,只写入c4,c5,应为没有mapping映射c3, 故会写如c5,且c4出错不重试。
当值不为1,2,3时,则会写入c5

源码阅读:
public class MultiplexingChannelSelector extends org.apache.flume.channel.AbstractChannelSelector {

  public static final String CONFIG_MULTIPLEX_HEADER_NAME = "header";
  public static final String DEFAULT_MULTIPLEX_HEADER ="flume.selector.header";
  public static final String CONFIG_PREFIX_MAPPING = "mapping.";
  public static final String CONFIG_DEFAULT_CHANNEL = "default";
  public static final String CONFIG_PREFIX_OPTIONAL = "optional";

  @SuppressWarnings("unused")
  private static final Logger LOG = LoggerFactory.getLogger(MultiplexingChannelSelector.class);

  private static final List<Channel> EMPTY_LIST =
      Collections.emptyList();

  //header参数值
  private String headerName;

  //channel映射表
  private Map<String, List<Channel>> channelMapping;
  //option channel映射表
  private Map<String, List<Channel>> optionalChannels;
  //default channel集合
  private List<Channel> defaultChannels;

  @Override
  public List<Channel> getRequiredChannels(Event event) {
    String headerValue = event.getHeaders().get(headerName);
    //header参数值不存在返回default的channel
    if (headerValue == null || headerValue.trim().length() == 0) {
      return defaultChannels;
    }

    //由header的值获取channel
    List<Channel> channels = channelMapping.get(headerValue);

    //header参数值
    if (channels == null) {
      channels = defaultChannels;
    }

    return channels;
  }

  @Override
  public List<Channel> getOptionalChannels(Event event) {
    String hdr = event.getHeaders().get(headerName);
    List<Channel> channels = optionalChannels.get(hdr);

    if (channels == null) {
      channels = EMPTY_LIST;
    }
    return channels;
  }

  @Override
  public void configure(Context context) {
    this.headerName = context.getString(CONFIG_MULTIPLEX_HEADER_NAME,
        DEFAULT_MULTIPLEX_HEADER);
    //获取所有的channel,包括option和mapping,default
    Map<String, Channel> channelNameMap = getChannelNameMap();

    //default Channels
    defaultChannels = getChannelListFromNames(
        context.getString(CONFIG_DEFAULT_CHANNEL), channelNameMap);

    Map<String, String> mapConfig =
        context.getSubProperties(CONFIG_PREFIX_MAPPING);

    // mapping映射的channel
    channelMapping = new HashMap<String, List<Channel>>();

    for (String headerValue : mapConfig.keySet()) {
      List<Channel> configuredChannels = getChannelListFromNames(
          mapConfig.get(headerValue),
          channelNameMap);

      //This should not go to default channel(s)
      //because this seems to be a bad way to configure.
      if (configuredChannels.size() == 0) {
        throw new FlumeException("No channel configured for when "
            + "header value is: " + headerValue);
      }
      //同样的值被配置了两次
      if (channelMapping.put(headerValue, configuredChannels) != null) {
        throw new FlumeException("Selector channel configured twice");
      }
    }
    //If no mapping is configured, it is ok.
    //All events will go to the default channel(s).
    //如果header value没有mapping或者optional任何channel,则写入到default
    Map<String, String> optionalChannelsMapping = context.getSubProperties(CONFIG_PREFIX_OPTIONAL + ".");

    optionalChannels = new HashMap<String, List<Channel>>();

    for (String hdr : optionalChannelsMapping.keySet()) {
      List<Channel> confChannels = getChannelListFromNames(
              optionalChannelsMapping.get(hdr), channelNameMap);
      if (confChannels.isEmpty()) {
        confChannels = EMPTY_LIST;
      }
      //Remove channels from optional channels, which are already
      //configured to be required channels.
      //没有mapping只有option则要加上default的channel
      List<Channel> reqdChannels = channelMapping.get(hdr);
      //Check if there are required channels, else defaults to default channels
      if (reqdChannels == null || reqdChannels.isEmpty()) {
        reqdChannels = defaultChannels;
      }
      for (Channel c : reqdChannels) {
        if (confChannels.contains(c)) {
          confChannels.remove(c);
        }
      }

      if (optionalChannels.put(hdr, confChannels) != null) {
        throw new FlumeException("Selector channel configured twice");
      }
    }

  }

}
flume----复制选择器 分路选择器 file-channel sink处理器默认/负载均衡/失败切换 kafka-source/sink/channel hive-sink 实战练习 配置案例-复制选择器 replicating selector (复制选择器) selector 将event复制,分发给所有下游节点 #下游 a1.sources = r1 a1.channels = c1 a1.sinks = k1 a1.sources.r1.channels = c1 #级联 a1.sources.r1.type = avro #主机名 a1.sources.r1.bind = 0.0.0.0 #端口号 a1.sources.r1.port = 41414 a1.chann 阅读详情

相关推荐

Flume之常用选择器

Flume中的选择器主要是用于决定source进入哪个channel中,主要有两种选择器: replicating selector:将event复制到该source对应的所有channel中。 multiplexing selector:指定特定header的值进入某个channel。 如果没有指定选择器,默认使用replcating selector。 案例-replicating selector: 这里配置一个source,两个channel,两个sink。 创建自定义conf文件

QYHuiiQ 1574

【Flume】高级组件之Channel Selectors及项目实践

通俗来讲,Channel Selectors组件控制Source采集到的数据分别流向哪些Channels。组件包括Replicating Channel Selector、Load Balancing Channel Selector和Multiplexing Channel Selector,其中Replicating Channel Selector是默认的Channel选择器,它会将Source采集过来的Event发往所有Channel;

ccql's Blog 1417

大数据学习笔记51:Flume Channel Selectors(Flume通道选择器)

文章目录一、Flume Channel Selectors用户指南二、多路复用通道选择器(一)用户指南网址(二)master节点接收数据,按路由规则发送到slave1与slave2节点1、在master节点上flume配置目录创建selector-multiplexing.conf2、在slave1节点上flume配置目录创建selector-multiplexing.conf3、在slave2节...

howard2005的专栏 1083

[flume]组成|source|channel|事务|拦截器|选择器|处理器|监控器|数据丢失问题|如何保证数据的完整性

1)实现Intercepter2)重写四个方法:处理单个Event处理多个event,在这个方法中调用Event intercept(Event event)【4】close方法3)静态内部类,实现Interceptor.BuilderChannel Selectors可以让不同的项目日志通过不同的Channel到不同的Sink中去。

胖胖的博客 1004

Mplus实战:如何用交叉滞后面板模型(CLPM)分析心理学纵向数据?

本文提供了在Mplus软件中应用交叉滞后面板模型(CLPM)分析心理学纵向数据的实战指南。文章详细拆解了CLPM的核心概念、Mplus语法框架,并涵盖从基础的两变量模型到多变量、潜变量建模的扩展,以及结果解读与常见陷阱规避,旨在帮助研究者利用这一经典工具有效探索变量间的动态预测关系。

weixin_29253711的博客 405

【题解-洛谷】B3644 【模板】拓扑排序 / 家谱树

有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。给出每个人的后代的信息。输出一个序列,使得每个人的后辈都比那个人后列出。输出一个序列,使得每个人的后辈都比那个人后列出。如果有多种不同的序列,输出任意一种即可。),表示家族的人数。

写代码的犄角旮瘩 1065

flume ChannelSelector -- channel 选择器

首先是flume中三个组件的单词的意思,flume:水道;笕槽;引水槽,source:水源,channel:水渠,sink:水槽。见文知意,就是水从源头流出来,经过水渠或者管道,最终流到终点,也就是水槽了。之前总是flume的叫着,也不知道是啥意思,今天查了一下,再看其他几个组件的意思,这个工具的功能不言而喻了,就是针对像水一样的数据流处理的。 flume channel selectors允许给一个source可以配置多个channel的能力。这种模式有两种方式,一种是用来复制(Replication),

请叫我大师兄 3207

Axure RP9汉化+授权全攻略:从下载到激活一步到位(附最新授权码)

本文提供Axure RP9从下载安装到界面汉化的完整指南,帮助设计师和产品经理快速上手这款原型设计工具。详细讲解了如何安全获取软件、执行汉化操作、理解核心界面布局,并介绍了创建交互原型和生成HTML文件的基础步骤,助力用户高效开展设计工作。

cuda7parallel的博客 1139

07_Flume之Channel的selector

复制方式可以将最前端的数据源复制多份,分别传递到多个Channel中,每个Channel接收到的数据都是相同的。前面介绍过,一个souce可以向多个channel同时写数据,所以也就产生了以何种方式向多个channel写的问题(比如自带的。如果没有手动配置,source的默认channel选择器类型是replicating(复制),当然这个选择器只针对source配置了多个channel的时候。就可以通过配置来按照一定的规则进行分发,听起来很像负载均衡),channel选择器也就应运而生。

weixin_40727028的博客 257

计算机毕业设计springboot基于微信平台的二次元手办商场小程序【附源码】

选题背景: 随着二次元文化的兴起和普及,越来越多的人开始对二次元角色产生了浓厚的兴趣和喜爱。手办作为二次元文化的重要载体之一,成为了许多二次元爱好者收藏和展示的对象。然而,在传统的线下手办商场中,消费者往往面临着时间、空间和选择的限制。因此,基于微信平台的二次元手办商场小程序应运而生。 选题意义: 首先,基于微信平台的二次元手办商场小程序能够打破地域限制,使得用户可以随时随地通过手机进行购物。无论是在家中、上班途中还是旅行中,用户都能够方便地浏览和购买自己喜欢的手办,极大地提高了购物的便利性和灵活性。

拉期程序 452

RTC 实时时钟实验

如果在 RTC_CR 寄存器中设置了相应的允许位,则在每个TR_CLK 周期中 RTC 产生一个中断(秒中断)。void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data) // 往备份区域写用户数据的函数 (这个函数的第一个参数就是寄存器的标号了,这个是通过宏定义定义的)存储在 RTC_ALR 寄存器中的可编程时间相比较,如果 RTC_CR 控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。寄存器操作完成,并同步之后,设置秒钟中断。

m0_55996456的博客 1205

Flume Channel选择器深度解析:多通道数据流分发实战指南

Channel选择器是Flume Source组件的核心配置项,它负责决定每个事件(Event)被发送到哪些Channel。数据复制:一份数据同时写入多个Channel数据路由:根据事件内容分发到不同Channel数据过滤:选择性写入特定Channel负载隔离:不同业务数据走不同通道路由逻辑复杂,需要基于多个Header字段需要动态的路由规则需要集成外部配置中心特殊的过滤需求import org/*** 自定义Channel Selector。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 2163

ENVI+SARscape实战:从哨兵一号数据到地震形变制图全流程解析

本文详细解析了使用ENVI和SARscape软件从哨兵一号数据生成地震形变图的全流程,包括数据获取、干涉处理、相位解缠等关键步骤。通过实战技巧和参数设置建议,帮助用户高效处理SAR数据,提升地震形变监测的精度和可视化效果。

weixin_30460489的博客 385

Flume Channel选择器

因为一个Souce可以向多个Channel同时写数据,所以也就产生了以何种方式向多个Channel写的问题(比如自带的复制选择器,会把数据完整地发送到每一个Channel,而多路分发选择器就可以通过配置来按照一定的规则进行分发,听起来很像负载均衡),Channel选择器也就应运而生。负载平衡通道选择器提供了在多个通道上进行负载平衡流的能力,这有效地允许在多个线程上处理传入的数据,它维护一个活动通道的索引列表,负载必须分布在这些通道上,实现支持通过round_robin或随机选择机制来分配负载。

zjjcchina的博客 191

手把手教你用STM32F429+FreeRTOS搭建开源SIP电话(附代码与避坑指南)

本文详细介绍了如何使用STM32F429和FreeRTOS搭建开源SIP电话系统,涵盖硬件选型、FreeRTOS任务划分、PJSIP协议栈移植、音频系统优化及安全实践。通过实战案例和代码示例,帮助开发者快速实现嵌入式VoIP通信,特别适合物联网和音视频通信领域的应用开发。

weixin_33582311的博客 356

51单片机 DHT11温湿度传感器LCD显示+串口打印+Proteus仿真

DHT11+LCD1602+串口输出+Proteus仿真

perseverance51博客 7198

关于flume的采集数据源类型、channel的类型、拦截器、选择器使用

sources exec类型执行一条命令 a1.sources.s1.type = exec a1.sources.s1.command = tail -f /export/datas/shells/access.log channel memory类型存到内存中 agent.channels.c1.type = memory #channel的容量最多能存多少个event agent.chann...

qq_38655865的博客 1379

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【Flume-04】选择器的使用

Flume中的Channel选择器作用于source阶段 ,是决定Source接受的特定事件写入到哪个Channel的组件,他们告诉Channel处理器,然后由其将事件写入到Channel。

关注我!菜鸟进阶站 364

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

flume-Channel选择器副本机制

本文介绍了一个基于Flume的双路数据采集方案,用于实时监控文件变更并同步保存到HDFS和本地文件系统。架构采用三层设计:数据采集层(Flume1)通过exec source监控文件变化,使用replicating selector将数据分发到两个channel;数据处理层由Flume2(HDFS输出)和Flume3(本地文件输出)组成,通过Avro协议实现节点间通信。文中详细解析了三个Flume节点的配置参数,包括source、sink和channel的设置,并提供了关键注意事项:路径权限检查、参数优化建

小张的博客 530

03-flume channel选择器

flume channel选择器

huaxing_ba的博客 311

Flume中Multiplexing Channel Selector(分类选择器)的使用

1.需求: 在102机器启动agent1(netcatsource—memorychannel—avrosink) ​ agent2(execsource—memorychannel—avrosink) ​ 在103机器启动agent3( avrosouce---- 2 memorychannel—2sink(loggersink,hdfssink)) ​ ​ logg...

YellowXiuHui的博客 1255

优化数据流传输之Flume Channel选择器

"Multiplexing Channel Selector"的优点是可以根据事件的属性将事件动态地分发到不同的Channel中,以实现更灵活和精确的事件路由。因为一个Souce可以向多个Channel同时写数据,所以也就产生了以何种方式向多个Channel写的问题(比如自带的复制选择器,会把数据完整地发送到每一个Channel,而多路分发选择器就可以通过配置来按照一定的规则进行分发,听起来很像负载均衡),Channel选择器也就应运而生。因此,Channel允许Source和Sink运作在不同的速率上。

zjjcchina的博客 274

Flume(4)flume1.8 Channel类型介绍

1. Flume Channel Channels是events在agent上进行的存储库。Source添加events,Sink移除events。 1.1 Memory Channel(内存Channels) events存储在配置最大大小的内存队列中。对于流量较高和由于agent故障而准备丢失数据的流程来说,这是一个理想的选择。 agent a1示例: 1.2 JDBC Channel ...

cowbin2012的专栏 1万+

任务21:21_Flume高级_Channel选择器副本机制(需求分析)

这里暂时还演示不了多路复用,因为多路复用需要结合拦截器一起。 所以多路服用的案例放到了自定义拦截器那里 监控文件的变动使用exec source和taildir均可。 但是优先使用taildir,毕竟挂了还可以再用。 监控文件的变动,将内容传给flume-2 flume1给flume2使用阿波罗sink和source 看avro sink /source 和 roll sink 最终的目的把hive实时更新的日志数据上传到hdfs,同时在本地还做一个备份。 采集hive数据的flume1使用两个.

有上进心的阿龙 178

Flume Source、Channel处理器、拦截器和Channel选择之间的交互

接收事件; 处理事件; 将事件传递给拦截器链; 将每个事件传递给Channel选择器; 返回写入事件的Channel列表; 将所有事件写入每个必需的Channel,只有一个事务被打开;对于每个Channel,所有事件都写为事务的一部分; 利用可选Channel重复相同动作。 Flume本身不限制Agent中Source、Channel和Sink的数量。因此Flume Sour...

qq_43193797的博客 984

Flume之ChannelSelector源码分析

Flume中channel选择器(selector.type配置)必须实现ChannelSelector接口,实现了该接口的类主要作用是告诉Source中接收到的Event应该发送到哪些Channel,在Flume中主要由两个实现方式: 1,复用,实现类:MultiplexingChannelSelector 2,复制,实现类:ReplicatingChannelSelector 如下: ...

qianshanding0708的博客 4100
上一篇: Hive权限管理
下一篇: Hive数据类型
SW_LCC
博客等级 码龄11年 4粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值