目录
Apache Hadoop生态-目录汇总-持续更新
一:安装包准备
二:安装与常用配置
2.1:下载解压安装包
2.2:解决guava版本问题
2.3:修改配置
三:修复Taildir问题
3.1:Taildir Source能断点续传的原因
3.2:Taildir Source滚动文件的问题
3.3:修改源码解决滚动文件的问题
修改TailFile.java文件
修改ReliableTaildirEventReader.java文件
3.4:打包重新发布
Apache Hadoop生态-目录汇总-持续更新
系统环境:centos7
Java环境:Java8
一:安装包准备
方式1)官网下载:http://archive.apache.org/dist/flume/
方式2)安装包--百度网盘
链接:https://pan.baidu.com/s/1rF5zGnZ72Yxq32re-hASbQ?pwd=yyds
提取码:yyds
二:安装与常用配置
2.1:下载解压安装包
cd /tmp
wget http://archive.apache.org/dist/flume/1.9.0/apache-flume-1.9.0-bin.tar.gz
或者百度网盘下载,上传到这个目录下
sudo tar -zxf /tmp/apache-flume-1.9.0-bin.tar.gz -C /usr/local/
sudo mv /usr/local/apache-flume-1.9.0-bin /usr/local/flume-1.9.0
2.2:解决guava版本问题
Exception in thread "SinkRunner-PollingRunner-DefaultSinkProcessor" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
# 解决guava版本问题
rm /usr/local/flume-1.9.0/lib/guava-11.0.2.jar
与hadoop统一版本
cp $HADOOP_HOME/share/hadoop/common/lib/guava-27.0-jre.jar /usr/local/flume-1.9.0/lib/
2.3:修改配置
cp /usr/local/flume-1.9.0/conf/flume-env.sh.template /usr/local/flume-1.9.0/conf/flume-env.sh
vim /usr/local/flume-1.9.0/conf/flume-env.sh
export JAVA_HOME=/usr/local/jdk1.8.0
三:修复Taildir问题
所需的文件在百度网盘里都有
3.1:Taildir Source能断点续传的原因
Taildir Source 维护了一个 json 格式的 position File,其会定期的往 position File中更新每个文件读取到的最新的位置,因此能够实现断点续传。
Position File 的格式如下:
[{"inode":52580042,"pos":2,"file":"/tmp/flume/files/files1.txt"}]
解释:inode是linux服务器对文件的标识
注:Linux 中储存文件元数据的区域就叫做 inode,每个inode都有一个号码,操作系统用inode号码来识别不同的文件,Unix/Linux 系统内部不使用文件名,而使用 inode 号码来标记文件
3.2:Taildir Source滚动文件的问题
Taildir Source 使用 inode + 绝对路径的方式记录读取的位置, 一旦遇到文件会定时滚动更新,导致文件被重复读取。
比如 hive.log每晚会更新为hive.log.xx.xx, 重建一个新的hive.log,就导致新产生的hive.log.xx.xx文件会被再次上传一次(修改文件名称 inode不变,但是文件路径变了)
3.3:修改源码解决滚动文件的问题
解决思路:修改源码,只监控inode
下载flume的源码包:http://archive.apache.org/dist/flume/1.9.0/
目录:apache-flume-1.9.0-src\apache-flume-1.9.0-src\flume-ng-sources\flume-taildir-source
修改TailFile.java文件
修改flume-ng-sources\flume-taildir-source\src\main\java\org\apache\flume\source\taildir\TailFile.java文件
修改TailFile.java文件 122行
public boolean updatePos(String path, long inode, long pos) throws IOException {
// if (this.inode == inode && this.path.equals(path)) { # 原先的
if (this.inode == inode) { // 修改为
setPos(pos);
updateFilePos(pos);
logger.info("Updated position, file: " + path + ", inode: " + inode + ", pos: " + pos);
return true;
}
return false;
}
修改ReliableTaildirEventReader.java文件
修改flume-ng-sources\flume-taildir-source\src\main\java\org\apache\flume\source\taildir\ReliableTaildirEventReader.java文件
修改ReliableTaildirEventReader.jar 254行
TailFile tf = tailFiles.get(inode);
// if (tf == null || !tf.getPath().equals(f.getAbsolutePath())) { 原先的
if (tf == null) { // 修改为
long startPos = skipToEnd ? f.length() : 0;
tf = openFile(f, headers, inode, startPos);
} else {
3.4:打包重新发布
重新发布
把原来的jar包改个名字备份一下
mv /usr/local/flume-1.9.0/lib/flume-taildir-source-1.9.0.jar /usr/local/flume-1.9.0/lib/flume-taildir-source-1.9.0.jar.bak
进入服务器客户端flume安装位置进入lib目录,把打包好的flume-taildir-source-1.9.0.jar包上传上去