需求:将小写字母转换成大写字母
配置Pom.xml文件
<dependencies>
<!-- flume核心依赖 -->
<dependency>
<groupId>org.apache.flume</groupId>
<artifactId>flume-ng-core</artifactId>
<version>1.8.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 打包插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass></mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!-- 编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
代码实现
1.首先,在java包里创建一个Package--flume,再在这个包里创建一个类-MyInterceptor(自定义拦截器)
2.代码实现
package flume;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;
import java.util.ArrayList;
import java.util.List;
public class MyInterceptor implements Interceptor {
@Override
public void initialize() {
}
/**
* 拦截器实现方法
* @param event 一个事件 ,封装一行的数据 ,有header和body(具体的数据)
* @return
*/
@Override
public Event intercept(Event event) {
//获取数据body
byte[] oldbody = event.getBody();
//将数据转换为大写
byte[] bytes = new String(oldbody).toUpperCase().getBytes();
//封装-setBody()没有返回值,所以不能在return里面写
event.setBody(bytes);
// 返回
return event;
}
@Override
public List<Event> intercept(List<Event> list) {
ArrayList<Event> eventArrayList = new ArrayList<>();
//循环将每个事件的数据转换成大写
for(Event event:list){
eventArrayList.add(intercept(event));
}
return eventArrayList;
}
/**
* 关闭资源
*/
@Override
public void close() {
}
//定义一个内部类
public static class Builder implements Interceptor.Builder{
@Override
public Interceptor build() {
return new MyInterceptor();
}
@Override
public void configure(Context context) {
}
}
3.目前还不能运行,因为要调用flume的底层配置。
所以接下来要对该代码进行打包:
1)使用Maven做成Jar包:
(1)点击右侧竖条的Maven--》选择里面的Lifecycle中的clean
(2)然后再点击下面的package进行打包
(3)包打完之后看log找到包的所在位置:
[INFO]Buildingjar:D:\idealC\JavaProject\zookeeper\target\zookeeper-1.0-SNAPSHOT.jar
或者看IDEA左侧target/maven-archiver里,那也有刚打好的包。
2)上传jar包
(1)跳到此目录下:/opt/module/flume-1.8.0/lib
(2)上传此jar到此jar目录中,拖拽上传即可
3)配置新的自定义的拦截器
(1)转到/opt/module/flume-1.8.0/myconf/目录下
(2)创建配置文件
[root@bigdata111 myconf]# vi flume-myInterceptor.conf
(3)添加配置(配置文件如下)、保存离开
#1 agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
#2 source
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /opt/plus
#定义拦截器
a1.sources.r1.interceptors = i1
#拦截器类型-IDEA里定义的内部类Builder--右键--》Copy Reference复制--》粘贴(全类名)
#注意:下面自定义类名前面符号应该是$,而不是"."
#就是粘贴之后要检查并将其改过来
a1.sources.r1.interceptors.i1.type = flume.MyInterceptor$Builder
a1.sinks.k1.type = logger
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
4.执行:
[root@bigdata111 myconf]# flume-ng agent -c ../conf/ -n a1 -f flume-myInterceptor.conf -Dflume.root.logger==INFO,console
5.看到正确结果:
(1)查看检测的plus文件内容:
(2)执行后的logger:
(3)分析:
从这可以看出,通过自定义拦截器已经可以实现:将小写字母转换成大写。
纯数字的Event也会被接收:
比如这里再向plus文件里添加数据:999
[root@bigdata111 opt]# echo 999 >> plus
从logger里能够看到,接收成功。
6.易出现的问题-类找不到,logger报错
查看日志发现问题-类找不到:
这是因为配置文件的全类名前面的符号$被粘贴成了"."因此找不到类,报错。比如下面的例子:
#定义拦截器 a1.sources.r1.interceptors = i1 #拦截器类型-IDEA里定义的内部类Builder--右键--》Copy Reference复制--》粘贴(全类名) #注意:下面自定义类名前面符号应该是$,此处是错误的 #就是粘贴之后要检查并将其改过来 a1.sources.r1.interceptors.i1.type = flume.MyInterceptor.Builder |
接下来解决:
(1)打开.jar包的所在位置-并用压缩软件打开此jar压缩包
(2)按照全类名找到最终的文件,并将其名字复制一下,再重新粘贴到配置文件中。
(3)删除原来上传的jar包、再次生成jar包并重新上传,然后启动执行。