自定義flume 攔截器(interceptor)

自定義Interceptor

自定義過濾器類:

新建Maven項目,新建類,實現Interceptor接口,重寫intercept方法,如:將header添加到body中,

  1. 重寫父類方法:close(),intiialize()

代碼如下

	@Override
	public void close() {

	}

	@Override
	public void initialize() {

	}

2.重寫父類方法:intercept()
自定義攔截器,這裏是將header中的數據加入到body中,中間用Tab鍵分隔。

@Override
	public Event intercept(Event ev) {
		Map<String, String> event = ev.getHeaders();

		ByteArrayOutputStream baos = new ByteArrayOutputStream();

		try {

			if (event.containsKey("timestamp")) {
				timestampHeaderName = "timestamp=" + event.get("timestamp");
			}
			if (event.containsKey("host")) {
				hostHeaderName = "host=" + event.get("host");
			}

			baos.write(ev.getBody());

			baos.write("\t".getBytes(charsetName));
			baos.write(timestampHeaderName.getBytes(charsetName));

			baos.write("\t".getBytes(charsetName));
			baos.write(hostHeaderName.getBytes(charsetName));

			ev.setBody(baos.toByteArray());
		} catch (IOException e) {

			e.printStackTrace();
		}

		return ev;
	}

3.重寫方法intercept()
這裏寫的代碼幾乎是固定了的,主要實現攔截的方法在上邊的方法中已經定義好了,這裏只是實現了一下,多條數據的時候的實現
代碼如下:

@Override
	public List<Event> intercept(List<Event> event) {
		List<Event> result = new ArrayList<>();

		for (Event ev : event) {
			result.add(ev);
		}
		return result;
	}

4.自定義類種類:Builder

在builder的最後調用了主方法,但是在集羣中調用的是這個方法。

public static class Builder implements Interceptor.Builder {

		@Override
		public void configure(Context arg0) {

		}

		@Override
		public Interceptor build() {

			return new MyApp();
		}

	}

5.導出jar包到集羣中
在flume的安裝目錄下依次創建如下文件夾:plugins.d/自定義名稱/lib/這裏放jar包
總的路徑如:
/usr/share/flume/plugins.d/intercept/lib/intercept.jar

6啓動自定義properties文件,
啓動命令:flume-ng agent -f properties配置文件名稱 -n properties文件中的名稱 -Dflume.root.logger=Info,console
如果不需要打印日誌,-Dflume.root.logger=Info,console不需要添加。
properties配置文件見上篇博客:blog.csdn.net/James_JR10/article/details/78255910

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章