1)Flume组成
Flume是由source、channel、sink组成。
开发中经常用到的组件:
Taildir Source:断点续传、多目录。Flume1.6以前需要自己自定义Source记录每次读取文件位置,实现断点续传。
File Channel:数据存储在磁盘,但是传输速率慢。适合对数据传输可靠性要求高的场景,比如,金融行业。
Memory Channel:数据存储在内存中,传输速率快。适合对数据传输可靠性要求不高的场景,比如,普通的日志数据。
Kafka Channel:减少了Flume的Sink阶段,提高了传输效率。
2)Flume拦截器
自定义拦截器步骤:
a)实现 Interceptor
b)重写四个方法
initialize 初始化
public Event intercept(Event event) 处理单个Event
public List<Event> intercept(List<Event> events) 处理多个Event,在这个方法中调用Event intercept(Event event)
close 方法
c)静态内部类,实现Interceptor.Builder
package com.haoxin.flume;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
/**
*
* 来简单的清洗数据
*/
public class LogInterceptor implements Interceptor {
@Override
public void initialize() {
}
/**
*处理多单个event
*/
@Override
public Event intercept(Event event) {
//1.获取数据
byte[] body = event.getBody();
String log = new String(body, Charset.forName("UTF-8"));
此处省略
return null;
}
/**
*处理多个event,判读不为空的event 加入list中
*/
@Override
public List<Event> intercept(List<Event> list) {
ArrayList<Event> events = new ArrayList<>();
for (Event e:list
) {
Event intercept1 = intercept(e);
if (intercept1 != null){
events.add(intercept1);
}
}
return events;
}
@Override
public void close() {
}
/**
* 建静态内部类builder
*/
public static class Builder implements Interceptor.Builder{
@Override
public void configure(Context context) {
}
@Override
public Interceptor build() {
return new LogInterceptor();
}
}
}
3)Flume Channel选择器
channel选择器有replicating和multiplexing。它俩的区别是:replicating会将source过来的events发往所以channel,而multiplexing可以选择发往哪些channel。
4)Flume 监控器
Ganglia可以很好的监控flume的传输。