1.多级流动
2.扇入流动
3.扇出流动(自定义sink)
package cn.tedu.flume;
import org.apache.flume.*;
import org.apache.flume.conf.Configurable;
import org.apache.flume.sink.AbstractSink;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.Map;
public class AuthSink extends AbstractSink implements Sink, Configurable {
private String path;
private PrintStream ps;
@Override
public void configure(Context context) {
// 获取用户的指定路径
path = context.getString("path");
if (path==null){
throw new IllegalArgumentException("路径不能为空");
}
}
//启动sink
@Override
public synchronized void start() {
try {
//初始化流对象,写出数据
ps = new PrintStream(path+"/"+System.currentTimeMillis());
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
//处理写出流程
@Override
public Status process() throws EventDeliveryException {
Channel c = this.getChannel();
//获取事务
Transaction t = c.getTransaction();
//开启事务
t.begin();
Event e;
try {
while ((e=c.take())!=null){
//获取headers
Map<String,String> headers = e.getHeaders();
ps.println("headers");
for (Map.Entry<String, String> en : headers.entrySet()) {
ps.println("\t"+en.getKey()+"="+en.getValue());
}
//获取body
byte[] body = e.getBody();
ps.println("body:");
ps.println("\t"+new String(body));
t.commit();
return Status.READY;
}
} catch (Exception ex) {
//事务回滚
t.rollback();
return Status.BACKOFF;
}finally {
t.close();
}
return null;
}
@Override
public synchronized void stop() {
if (ps!=null){
ps.close();
}
}
}