Flume+Kafka+HDFS综合运用
实验内容
如下图所示:
在某一实际应用中,有一个的数据源(可用Source类型为Exec Source或NetCat Source的Agent a1来用模拟),
为方便后期数据分析,需要记录事件的产生IP、时间(格式:年月日时分秒)以及事件类型(事件类型根据事件Body中包含WARNING:、ERROR:、**INFO:**来确定为WARNING、ERROR、INFO,如不包含,则无需记录事件类型)事件经处理后汇总到Agent a2。
Agent a2根据事件类型,将事件分别送入不同通道进行下一步处理,并将事件类型为WARNING、ERROR写入Kafka集群,并最终被消费者和Agent a3进行消费。
步骤分析
先分析a1,a1需要输出产生IP、时间、事件类型,这里就需要用到拦截器,产生IP使用Host Interceptor,产生时间使用Timestamp Interceptor,产生事件类型需要我们自定义拦截器。
然后分析a2,a2要将正常信息输出,把WARNING、ERROR作为生产者消息传到Kafka集群中,这里需要用到多路 Channel选择器
最后分析a3,a3的Source要作为消费者接收Kafka的消息,再把消息输出到HDFS
还要另外写一个消费者,把错误信息输出到控制台中。
a1的配置信息
自定义拦截器
package flume.zhz.com;
import org.apache.commons.codec.Charsets;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @author zhz
* @date 2021/4/29 16:32
* 备注:
*/
public class MyFlumeInterceptor implements Interceptor {
//自定义属性hostIP
private String hostIP=null;
private MyFlumeInterceptor(String hostIP){
this.hostIP=hostIP;
}
@Override
public void initialize() {
}
@Override
public Event intercept(Event event) {
String[] statuses = {
"WARNING","ERROR","INFO"};
/**
* 处理body
*/
StringBuilder builder = new StringBuilder();