1、用户自定义的sink实现Configurable接口,实际上是实现里面的configure(Context
context)方法,主要是获取用户配置的一些信息,如果我们还有很多的属性需要用户自己设置,那么我们可以在这个方法中将用户定义的参数取出来,context类中提供了很多get方法,例如getString、getLong、getBoolean等
2、核心的处理逻辑是在process方法中,getChannel方法在父类AbstractSink中已经实现,相当于取得输送信息到sink的Channel对象,然后它里面提供事务操作方法:getTransaction()和取出消息Event的方法:take(),这两个方法在其中很重要,取得事物对象可以保证该信息被自定义的sink成功消费,成功消费后,使用commit方法提交事务,那么Event将从channel队列中删除掉,如果没有成功消费,那么使用rollback方法进行回滚,该Event将还会保留在Channel的队列中,以便下次消费,保证消息不会出现遗漏现象
take方法主要是取出消息Event,在flume中也可以叫做事件,然后通过getBody()方法,获得消息的详细内容,就可以进行我们的功能实现了,保存到文件或者插入到数据库等等
3、对比自定义source和自定义sink的process方法:
自定义Source:通过getChannelProcessor方法获得ChannelProcessor对象,然后通过processEvent方法将消息转换为flume的Event对象传递给Channel处理
自定义sink:通过getChannel方法获得Channel对象,然后通过take方法从Channel中取出Event,然后转换为我们需要的消息数据进行处理
source的process方法相当于Event的生产者,不断向Channel中发送Event,而sink的process方法相当于Event的消费者,不断从Channel中取出Event进行处理