多通道选择器 Educoder

328 篇文章 ¥29.90 ¥99.00
本文介绍了多通道选择器的工作原理、应用场景,如数据处理、电子设备控制和信号调度,并提供了一个Python实现的代码示例,展示如何根据条件选择通道。

多通道选择器 Educoder

在软件开发中,多通道选择器是一种常见的工具,用于从多个输入中选择特定的通道或信号。它在数据处理、电子设备控制和信号调度等领域中广泛应用。本文将介绍多通道选择器的原理、应用场景以及使用代码示例。

一、原理概述
多通道选择器是基于条件判断的一种工具,它通过判断指定的条件,从多个输入中选择出满足条件的通道或信号。其基本原理是利用条件语句,对每个输入进行判断,并根据判断结果选择相应的输出。

二、应用场景

  1. 数据处理:在大数据处理领域,多通道选择器可以用于根据不同的条件筛选出需要的数据通道。例如,在一个包含多个传感器数据的数据流中,可以使用多通道选择器选择特定传感器的数据进行处理。

  2. 电子设备控制:在电子设备控制系统中,多通道选择器可以用于选择特定的输入信号。例如,在一个多输入单输出的电路中,可以使用多通道选择器选择特定的输入信号传递给输出。

  3. 信号调度:在通信系统中,多通道选择器可以用于动态调度信号。例如,在一个多路复用器中,可以使用多通道选择器选择需要传输的信号通道。

三、代码示例
下面是一个使用Python语言实现的简单多通道选择器的示例代码:

def multi_channel_selector(channels
任务描述 本关任务:使用自定义拦截器按照文件名分类采集文件。 相关知识 Flume 提供的自带拦截器有时候并不能满足我们的业务所需,因此,我们需要会自定义拦截器; 自定义拦截器基本步骤 自定义类实现Interceptor接口;重写 intercept(Event event)方法,主要拦截逻辑,拦截单个event intercept(List<Event> events)方法,返回event集合,循环拦截单个event initialize()方法,初始化 close()方法 新建一个内部类,实现Interceptor.Builder接口,重写 build()方法,返回一个自定义拦截器对象 configure(Context context)方法,读取配置文件 打成jar包,放到flume的lib目录下,也可以在flume安装目录创建 plugins.d/插件名/lib plugins.d/插件名/libext plugins.d/插件名/native 目录,并将jar包至于plugins.d/插件名/lib目录下; 在配置文件中指定拦截器type为我们自定义的拦截器; 采集示例 接下来让我们通过一个简单的示例来了解本实训 Flume 自定义拦截器案例的编写。 案例分析 案例流程图如下: 案例流程如下: 通过 nc 网络端口发送经过 Flume 自定义拦截器实时发送消息到监控文件中,根据过滤规则 Sink 到不同的文件中,之后再 Sink 到控制台上。 配置文件 1.创建自定义拦截器 代码如下所示: import org.apache.flume.Context; import org.apache.flume.Event; import org.apache.flume.interceptor.Interceptor; import java.util.List; import java.util.Map; public class Typeinterceptor implements Interceptor { @Override public void initialize() { } // 单个event 事件的处理方法 // 1. event 的头信息header 是以k-v形式存储信息 // 2. 所以我们对数据进行过滤清洗, 就是根据body内容的不同往header中写入一些标记信息(k-v), 然后再让多路复用channel选择器读取,缓存到不同的channel中. @Override public Event intercept(Event event) { //1. 得到event 的头信息 Map<String, String> headers = event.getHeaders(); //2. 得到event 的body内容 byte[] bytebody = event.getBody(); //String bodys = new String(bytebody); //把字节数组转为string字符串, 方便我们处理 //3. 根据body的内容, 写入不同发头信息标记 if(bytebody[0] >= '0' && bytebody[0] <= '9'){ //往头信息中做标记 headers.put("type","number"); }else if(bytebody[0] > 'a' && bytebody[0] < 'z'){ headers.put("type","letter"); } return event; } // 多个event的迭代处理 @Override public List<Event> intercept(List<Event> list) { //1.清空集合 addHeaderEvents.clear(); //2.遍历 events for (Event event : events) { //3.给每一个事件添加头信息 addHeaderEvents.add(intercept(event)); } //4.返回结果 return addHeaderEvents; } @Override public void close() { } public static class Builder implements Interceptor.Builder{ @Override public Interceptor build() { return new Typeinterceptor(); } @Override public void configure(Context context) { } } } 2.打包 Maven 项目,把生成的 JAR 包放到Hadoop101的 Flume 安装目录下的lib下。 3.配置 Flume 文件 vim Netcat-Memory-Avro.conf 添加如下内容: AGENT1 # 命名各组件 a1.sources = r1 a1.channels = c1 c2 a1.sinks = k1 k2 # 配置sources (netcat sources) a1.sources.r1.type = netcat a1.sources.r1.bind = localhost a1.sources.r1.port = 1000 ######### 引入自定义并已经打包好的拦截器类, 并把channel选择器设为为多路复用 (注意拦截器的类型是自定义类的全类名$Builder) a1.sources.r1.interceptors = i1 a1.sources.r1.interceptors.i1.type = com.yy.Typeinterceptor$Builder a1.sources.r1.selector.type = multiplexing a1.sources.r1.selector.header = type a1.sources.r1.selector.mapping.letter = c1 a1.sources.r1.selector.mapping.number = c2 #配置channels (memory channel) a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapcity = 100 a1.channels.c2.type = memory a1.channels.c2.capacity = 1000 a1.channels.c2.transactionCapcity = 100 #配置sinks (avro sink) a1.sinks.k1.type = avro a1.sinks.k1.hostname = Hadoop102 a1.sinks.k1.port = 1011 a1.sinks.k2.type = avro a1.sinks.k2.hostname = Hadoop103 a1.sinks.k2.port = 1033 # 绑定各个组件 a1.sources.r1.channels = c1 c2 a1.sinks.k1.channel = c1 a1.sinks.k2.channel = c2 vim Avro-Memory-Logger1.conf 添加如下内容: AGENT2 # 命名各组件 a2.sources = r1 a2.channels = c1 a2.sinks = k1 # 配置sources (avro sources) a2.sources.r1.type = avro a2.sources.r1.bind= Hadoop102 a2.sources.r1.port = 1011 #配置channels (memory channel) a2.channels.c1.type = memory a2.channels.c1.capacity = 1000 a2.channels.c1.transactionCapcity = 100 #配置sinks (logger sink) a2.sinks.k1.type = logger # 绑定各个组件 a2.sources.r1.channels = c1 a2.sinks.k1.channel = c1 vim Avro-Memory-Logger2.conf 添加如下内容: AGENT3 # 命名各组件 a3.sources = r1 a3.channels = c1 a3.sinks = k1 # 配置sources (avro sources) a3.sources.r1.type = avro a3.sources.r1.bind= Hadoop103 a3.sources.r1.port = 1033 #配置channels (memory channel) a3.channels.c1.type = memory a3.channels.c1.capacity = 1000 a3.channels.c1.transactionCapcity = 100 #配置sinks (logger sink) a3.sinks.k1.type = logger # 绑定各个组件 a3.sources.r1.channels = c1 a3.sinks.k1.channel = c1 启动命令 先启动 AGENT2 和 AGENT3 (avro source 是服务端,应该先执行。) [educoder@Hadoop102 flume]$ bin/flume-ng agent -n a1 -c conf/ -f jod/Avro-Memory-Logger1.conf [educoder@Hadoop103 flume]$ bin/flume-ng agent -n a1 -c conf/ -f jod/Avro-Memory-Logger2.conf [educoder@Hadoop101 flume]$ bin/flume-ng agent -n a1 -c conf/ -f jod/Netcat-Memory-Avro.conf 测试: 启动后 在 Hadoop101 上使用 netcat 向 1000 端口发送数字和字母,查看服务端的 logger 控制台日志被打印出来。 编程要求 根据提示,在右侧代码文件补充配置文件,你只需在Begin-End区域内配置配置文件即可,其余步骤后台会自动完成。(目录下有一些命名格式不同的的文件,现要将其按照名称分类采集在hdfs的不同目录,经过自定义拦截器后采集到hdfs后的目录为:) 配置文件要求 : Agent命名为 a1 ; 选择spooldir的 source 采集所有文件; 采集/opt/flume/data目录下所有文件; Channel选用 memory; 文件保存到 hdfs有如下要求 : hdfs路径名称: hdfs://localhost:9000/flume/文件名的前缀/文件名上的日期; 文件格式使用DataStream; 设置roundValue为 2。 测试说明 以上举例的现有拦截器(Regex Ext\fractor Interceptor)实现功能 跟我们的需求非常相似,不过该拦截提取的是event中body的内容,现基于此现成拦截器修改,实现拦截提取event中header内容,完成需求; 根据提示在右侧根据提示修改代码: 根据提示在右侧填写配置文件: 预期输出(后台自动截取采集完后hdfs的某个目录): /flume/ios/2018 /flume/ios/2019
10-25
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值