一.flume自定义sink.
public class MySink extends AbstractSink implements Configurable {
//定义两个属性 前后缀
private String prefix;
private String subfix;
//获取Log对象
Logger logger = LoggerFactory.getLogger(MySink.class);
@Override
public void configure(Context context) {
//读取配置文件给前后缀赋值
prefix = context.getString("prefix");
subfix = context.getString("subfix", "atguigui");
}
@Override
public Status process() throws EventDeliveryException {
//1定义返回值
Status status = null;
//2获取channal
Channel channel = getChannel();
//3从channel中获取事务
Transaction transaction = channel.getTransaction();
//4开启事务
transaction.begin();
try {
//5从channel中获取数据
Event event = channel.take();
if(event != null){
//6处理事件
byte[] body = event.getBody();
String value = new String(body);
//System.out.println(value);
logger.info(prefix+value+subfix);
//7.提交事务
}
transaction.commit();
status = Status.READY;
} catch (ChannelException e) {
e.printStackTrace();
//9提交事务失败 回滚
transaction.rollback();
//10 修改状态
status = Status.BACKOFF;
}finally {
transaction.close();
}
//返回状态信息
return status;
}
}
Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
Describe the sink
a1.sinks.k1.type = com.atguigu.sink.MySink
a1.sinks.k1.prefix = sleep–
a1.sinks.k1.subfix = --fengyoujing
Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
bin/flume-ng agent -c conf/ -f job/mysink.conf -n a1 -Dflume.root.logger=INFO,console