Flume 水槽批量
我的水槽配置是Flume 水槽批量,flume,Flume,我的水槽配置是 agent.sinks.sink.batchSize=10 哪一个水槽处理10次,每批,我得到的所有记录的时间相同 所以,这是一种可能的方法,可以为批处理中的每个记录获取不同的时间。是否用于设置时间戳 让我们看看它的: /** *在适当的位置修改事件。 */ @凌驾 公共事件截获(事件){ Map headers=event.getHeaders(); if(保留现有的&headers.containsKey(时间戳)){ //我们必须保留现有的时间戳 }否则{ long no
agent.sinks.sink.batchSize=10
哪一个水槽处理10次,每批,我得到的所有记录的时间相同
所以,这是一种可能的方法,可以为批处理中的每个记录获取不同的时间。是否用于设置时间戳
让我们看看它的:
/**
*在适当的位置修改事件。
*/
@凌驾
公共事件截获(事件){
Map headers=event.getHeaders();
if(保留现有的&headers.containsKey(时间戳)){
//我们必须保留现有的时间戳
}否则{
long now=System.currentTimeMillis();
headers.put(时间戳,Long.toString(现在));
}
返回事件;
}
/**
*循环中{@link#intercept(Event)}的委托。
*@param事件
*@返回
*/
@凌驾
公共列表截取(列表事件){
对于(事件:事件){
拦截(事件);
}
返回事件;
}
我假设intercept(List events)
方法的执行时间非常小,以至于批处理中的所有事件都在一毫秒内处理。因此,不可能使用此拦截器强制批处理中的事件使用不同的时间戳
若您需要批处理中每个事件的唯一标识符,那个么您可以基于TimestampInterceptor代码编写自己的拦截器,它将批处理中的事件数附加到timestamp。但是,这并不能保证增强剂的全局唯一性,因为有可能在一毫秒内处理两个批次
要获得更具体的建议,请澄清您的要求。其他选项是获取事件的正确时间戳-在生成时设置时间戳标头,或者解析字符串并以这种方式设置时间戳
/**
* Modifies events in-place.
*/
@Override
public Event intercept(Event event) {
Map<String, String> headers = event.getHeaders();
if (preserveExisting && headers.containsKey(TIMESTAMP)) {
// we must preserve the existing timestamp
} else {
long now = System.currentTimeMillis();
headers.put(TIMESTAMP, Long.toString(now));
}
return event;
}
/**
* Delegates to {@link #intercept(Event)} in a loop.
* @param events
* @return
*/
@Override
public List<Event> intercept(List<Event> events) {
for (Event event : events) {
intercept(event);
}
return events;
}