• flume修改源码实现source文件名前后缀的更改


    业务场景:

    需求:通过flume进行数据采集,将本地(windows服务器)不断产生的csv文件采集到hdfs上。

    问题:本地文件在生成的过程中,会出现文件名重复的现象。也就是说,在前一秒生成文件名为aaa.csv,该文件经过flume进行处理之后会进行文件名的更改,默认情况下文件名会更改为aaa.csv.COMPLATED,但是在第二秒的时候,接着又生成了aaa.csv文件,此时flume将该文件处理完进行更名的过程中,就会报错,例如:

    ED1C3E2B-E2D0-4a01-9DC5-240D660057AA

    解决:为了避免文件名重复导致flume程序挂的问题,此时有两种解决方案:

    1:在生成aaa.csv的过程中对该文件名增加唯一标识

    2:flume在采集文件结束后,更改文件名的时候,对其做唯一标识

    这里主要介绍第二种方式,通过修改源码的方式。

    一、flume源码的下载,导入,编译

    这里我使用的是flume1.9版本

    1 下载

        flume包下载:程序包下载

        flume源码下载:源码下载

    2 导入IDEA

    将源码包进行解压,解压之后,解压之后,目录结果如下:

    image

    IDEA进行项目的导入

    image

    image

    一直点击next,

    image

    导入成功之后,项目结构如下所示:

    image

    可以看到项目结构式通过各个model来构成的。

    3 编译

    执行命令:mvn clean install -Dmaven.test.skip=true

    image

    看到BUILD SUCCESS则代表编译成功,可进行下一步

    源码修改

    这里需要找到flume在采集完数据之后进行移动目录的那个类,这个类一般都是在flume-ng-core这个model下,但是具体是那个类,我们可以从flume采集日志中进行寻找,

    image

    从这个日志中可以看到,flume在采集完文件后需要对源文件进行一个移动操作,而也就是在此时进行对文件更名,所以我们可以在源码中找到这个类,通过全局搜索

    image

    红框这里就是flume采集完数据之后对源文件进行更改名称的地方,默认的名称是”.COMPLATED”,此时我们如果为了给文件进行唯一性区分,我这里采用增加时间戳的方式:

    image

    添加完成之后,对该类进行重新编译,唉对应target文件中找到对应的class文件,将其复制,拷贝替换到线上flume的lib目录下的flume-ng-core.jar包中即可。当然也可以对整个项目进行重新编译打包,只不过那样的话比较麻烦一点而已。

    image

    将上面这个jar包使用360压缩一起其他的压缩工具打开,将编译好的class文件覆盖进去即可

    然后从新运行flume,可以看到,此时文件名的后缀就会变成:

    image

    成功实现。

  • 相关阅读:
    Thinkphp注释
    THINKPHP5 如何在 控制器内调用model模型
    thinkphp5路由定义
    Thinkphp5读取当前config配置文件
    thinkphp5计算代码块的性能
    thinkphp的执行流程
    php filter过滤器
    nginx在收到stop信号后的处理
    寻找重复数
    奶牛和公牛
  • 原文地址:https://www.cnblogs.com/Gxiaobai/p/12230022.html
Copyright © 2020-2023  润新知