flume-1.7.0将源码修改为按文件读取数据

flume-1.7.0在配置source的时候,默认是按行读取,每行的数据作为一个事件,发送到channel。但是有时候,我们需要整个文件作为flume发送的一个事件。如果监控文件目录下的文件,这个时候就需要按文件读取,但是flume并没有提供按文件读取的配置。

如果想要实现相应的功能就需要修改源码。我只写简要的过程,并将修改以后的jar包上传上来。其中的过程不做详细说明,期间的步骤不复杂,不懂的地方可以直接去网上搜索。

在这里,我只修改了读取行的方法的地方,源文件中的类和方法的名字,都没有做修改。

1.下载flume1.7.0源码.

2.将其导入idea或eclipse.

3.编辑flume-ng-core项目的源码。更改org.apache.flume.serialization包下面的LineDeserializer类。

4.需要更改的地方是:

//原来的值是2048,因为我们的文件大小在3-10k,最大的文件是30k左右,所以更改为100k的大小。自己需要多大可以自己去调整。
public static final int MAXLINE_DFLT = 102400;

//更改readLine方法
private String readLine() throws IOException {
  StringBuilder sb = new StringBuilder();
  int c;
  int readChars = 0;
  while ((c = in.readChar()) != -1) {
    readChars++;
    sb.append((char)c);
    if (readChars >= maxLineLength) {
      logger.warn("Line length exceeds max ({}), truncating line!",
          maxLineLength);
      break;
    }
  }

  if (readChars > 0) {
    return sb.toString();
  } else {
    return null;
  }
}

原来的时候每遇到“\n”就会发送一个事件,现在是读完一个文件才发送一个事件。

其余的所有东西都不需要更改。

5.在flume-ng-core项目的pom文件中的项目g-a-v(项目坐标)的位置加上
jar
因为,我们只需要编译这一个项目就可以了。源码中的pom文件是没有打包方式的,所以需要添加。

6.打开cmd,进入flume-ng-core的目录,使用mvn package命令即可。为了方便,可以直接跳过测试。

7.用新生成的jar包替换集群上flume安装目录下面的lib文件夹中的相对应的jar包即可。重新启动flume。就可以正常使用了。

你可能感兴趣的:(flume-1.7.0将源码修改为按文件读取数据)