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

业务场景:

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

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

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

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

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

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

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

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

1 下载

flume包下载:程序包下载

flume源码下载:源码下载

2 导入IDEA

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

IDEA进行项目的导入

一直点击next,

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

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

3 编译

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

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

源码修改

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

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

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

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

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

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

成功实现。

原文地址:https://www.cnblogs.com/Gxiaobai/p/12230022.html

时间: 2024-10-09 03:13:21

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

【Flume】flume ng中HDFS sink设置按天滚动,0点滚动文件,修改源码实现

HDFS sink里有个属性hdfs.rollInterval=86400,这个属性你设置了24小时滚动一次,它的确就到了24小时才滚动,但是我们的需求往往是到了0点就滚动文件了,因为离线的job因为都会放在夜里执行. 如果flume是早上9点启动的,那么要到明天早上9点,hdfs的文件才会关闭,难道job要等到9点后才执行,这显然不合适,所以通过修改源码使其能够在0点滚动文件. 首先添加一个属性,可配置为day,hour,min private String timeRollerFlag; t

Hadoop 修改源码以及将修改后的源码应用到部署好的Hadoop中

我的Hadoop版本是hadoop-2.7.3, 我们可以去hadoop官网下载源码hadoop-2.7.3-src,以及编译好的工程文件hadoop-2.7.3, 后者可以直接部署. 前者hadoop-2.7.3-src必须mvn之后才能部署. 我们修改代码必须是在hadoop-2.7.3-src源码中进行, 而源码mvn之后才能部署或使用. 所以我们要先了解Maven.     mvn hadoop-2.7.3-src的时候会出现各种问题. 其中hadoop-2.7.3-src源码文件中有个

利用src.rpm包修改源码后重新制作rpm包

1. 下载 .src.rpm包.例:https://repos.fedorapeople.org/repos/openstack/EOL/openstack-grizzly/epel-6/openstack-quantum-2013.1.4-4.el6.src.rpm 2. 使用" rpm -ivh "解压源码包.例:rpm -ivh openstack-quantum-2013.1.4-4.el6.src.rpm  (--root=xxx 指定路径)解压的结果放在 /root/rpm

k8s证书配置过期时间(默认1年,修改源码解决)

参考文档: https://blog.51cto.com/11889458/2323328 下载源码并切换分支 git clone https://github.com/kubernetes/kubernetes.git -b release-1.17 v1.17.3 安装go mkdir /data/soft cd /data/soft/ wget https://dl.google.com/go/go1.13.6.linux-amd64.tar.gz tar zxvf go1.13.6.li

json.net 比jsonIgnore 更好的方法 修改源码

关于 JsonIgnore  问题, EF T4 模板 中 存在主外键关系 namespace WindowsFormsApplication1{    using System;    using System.Collections.Generic;    using Newtonsoft.Json;    public partial class MaterielProcedures    {        public int Kid { get; set; }        publi

Android 修改源码自定义SwipeRefreshLayout样式——高仿微信朋友圈下拉刷新

修改源码自定义SwipeRefreshLayout样式——高仿微信朋友圈下拉刷新 原文地址:https://www.cnblogs.com/zhujiabin/p/8194996.html

测试app 的 webview 页面时候,appium操作不了元素 要修改源码 (没有试过,先记录在此)

使用 chromedriver 来做hybrid的自动化我们有几个前提条件必须解决:1.准备好Android4.4或以上的手机:2.将Webview设置为debug模式:设置方法:在Android SDK API>=19的情况下,在源码中添加 webview.setWebContentsDebuggingEnabled(true) 这一段代码即可.(如果使用的是模拟器,则无需修改源码) 原文地址:https://www.cnblogs.com/kaibindirver/p/8904084.htm

Flume NG源码分析(五)使用ThriftSource通过RPC方式收集日志

上一篇说了利用ExecSource从本地日志文件异步的收集日志,这篇说说采用RPC方式同步收集日志的方式.笔者对Thrift比较熟悉,所以用ThriftSource来介绍RPC的日志收集方式. 整体的结构图如下: 1. ThriftSource包含了一个Thrift Server,以及一个Thrift Service服务的实现.这里的Thrift Service是由ThriftSourceProtocol定义 2. 应用程序调用Thrift Service的客户端,以RPC的方式将日志发送到Th

Mybatis Generator的model生成中文注释,支持oracle和mysql(通过修改源码的方式来实现)

在看本篇之前,最好先看一下上一篇通过实现CommentGenerator接口的方法来实现中文注释的例子,因为很多操作和上一篇基本是一致的,所以本篇可能不那么详细. 首先说一下上篇通过实现CommentGenerator接口的一些不足,毕竟只是实现了CommentGenerator接口,在里面的方法再怎么改,有效的也只是针对model类,并且使用的人大概也发现了,里面的addClassComment方法都知道是在类文件上面生成注释,但是无论我们在这个方法实现里写什么都没有效果,其实因为MGB默认是