研究flume-hdfs-sink

159 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情

研究flume-hdfs-sink

背景

因为项目需要,需要写一个flume-ftp-sink,而flume官方不支持ftp sink所以,我要先研究一下原来架构使用的flume-hdfs-sink,在自定义的写一个flume-ftp-sink。

原来架构

原来架构是ogg把binlog信息吐到kafka上,flume接收kafka消息通过flume-hdfs-sink,实现每分钟突出一个文件,来进行伪实时的数据传输,在通过hive自动将数据load到hive上,实现数据查询加工的使用。

image.png 大体就是这个样子

改变

因为后续数据需要从hive导入PG数据库,这步比较麻烦,而且大部分hive数据不会被使用,load数据会造成一定的数据延迟,所以客户的要求是直接到一个文件,pg库load文件不走hive了是吧,乍一看,是不是就是kafka到pg,直接用flink cdc就行了,但是我们还没有丁莹的产品,也没有界面化的操作,所以就先不这么搞,想先整个ftp-sink,我个人觉得没必要,走好直接用flinkcdc是吧,小胳膊整不过大腿,硬着头皮上。

flume-hdfs-sink

源码github

先看HDFSEventSink.java

private long rollInterval;
rollInterval = context.getLong("hdfs.rollInterval", defaultRollInterval);
@VisibleForTesting
  BucketWriter initializeBucketWriter(String realPath,
      String realName, String lookupPath, HDFSWriter hdfsWriter,
      WriterCallback closeCallback) {
    HDFSWriter actualHdfsWriter = mockFs == null ? hdfsWriter : mockWriter;
    BucketWriter bucketWriter = new BucketWriter(rollInterval,
        rollSize, rollCount,
        batchSize, context, realPath, realName, inUsePrefix, inUseSuffix,
        suffix, codeC, compType, actualHdfsWriter, timedRollerPool,
        privExecutor, sinkCounter, idleTimeout, closeCallback,
        lookupPath, callTimeout, callTimeoutPool, retryInterval,
        tryCount);
    if (mockFs != null) {
      bucketWriter.setFileSystem(mockFs);
    }
    return bucketWriter;
  }

为啥把这段单独拿出来,因为rollInterval这个参数决定我多长时间会生成一个文件,所以我写的flink-ftp-sink也要有这个参数,以此实现5分钟生成一个文件

image.png 这个影响我生成文件名,所以我需要有这个,而这里引用了一个类BucketPath.java 所以我也需要引用这个类,因为最后我的jar也是放在flume/lib下,我完全不用使西安这个类,直接import org.apache.flume.formatter.output.BucketPath;就可以了

image.png

flume-hdfs-sink参数说明

flume-ftp-sink源码

注意LICENSE