修改Flume-NG的hdfs sink解析时间戳源码大幅提高写入性能

转自: http://www.cnblogs.com/lxf20061900/p/4014281.html

Flume-NG中的hdfs sink的路径名(对应参数"hdfs.path",不允许为空)以及文件前缀(对应参数"hdfs.filePrefix")支持正则解析时间戳自动按时间创建目录及文件前缀。

  在实际使用中发现Flume内置的基于正则的解析方式非常耗时,有非常大的提升空间。如果你不需要配置按时间戳解析时间,那这篇文章对你用处不大,hdfs sink对应的解析时间戳的代码位于org.apache.flume.sink.hdfs.HDFSEventSink的process()方法中,涉及两句代码:  

1 // reconstruct the path name by substituting place holders
2         String realPath = BucketPath.escapeString(filePath, event.getHeaders(),
3             timeZone, needRounding, roundUnit, roundValue, useLocalTime);
4         String realName = BucketPath.escapeString(fileName, event.getHeaders(),
5           timeZone, needRounding, roundUnit, roundValue, useLocalTime);

  其中,realPath是正则解析时间戳之后的完整路径名,filePath参数就是配置文件中的"hdfs.path";realName就是正则解析时间戳之后的文件名前缀,fileName参数就是配置文件中的"hdfs.filePrefix"。其他参数都相同,event.getHeaders()是一个Map里面有时间戳(可以通过interceptor、自定义、使用hdfs sink的useLocalTimeStamp参数三种方式来设置),其他参数是时区、是否四舍五入以及时间单位等。

  BucketPath.escapeString这个方法就是正则解析时间戳所在,具体代码我们不再分析,现在我们编写一个程序测试一下BucketPath.escapeString这个方法的性能,运行这个测试类要么在源码中:

public class Test {
  
  public static void main(String[] args) {
        HashMap<String, String> headers = new HashMap<String, String>();
        headers.put("timestamp", Long.toString(System.currentTimeMillis()));
        String filePath = "hdfs://xxxx.com:8020/data/flume/%Y-%m-%d";
        String fileName = "%H-%M";
        
<think>好的,用户想了解Flume的安装步骤、配置文件编写以及如何通过Flume采集Hadoop日志并验证数据传输。首先,我需要回顾之前提供的指南,确保回答一致。用户提到了环境变量设置、配置文件编写、启动Agent和数据验证,这些都是关键点。 用户可能是在搭建Hadoop日志采集系统,需要详细的步骤指导。他们可能对Flume的配置不太熟悉,特别是Source和Sink的定义,以及如何正确设置HDFS路径。另外,验证数据传输部分需要明确的命令,确保用户能检查是否成功。 要注意引用之前的回答中的内容,比如环境变量配置、配置文件模板,以及常见问题排查。用户可能遇到权限问题或路径错误,所以需要强调这些部分。同时,参考用户提供的引用,比如修改flume-env.sh和配置文件的存放位置,确保步骤准确。 需要分步骤说明安装、配置、启动和验证,结构清晰。可能还需要提醒用户注意版本兼容性,如Hadoop和Flume的版本是否匹配,以及网络连接问题。此外,启动Agent时前台和后台的不同方式,适合调试和生产环境。 在配置文件部分,详细解释每个参数的作用,比如TAILDIR Source的优势,HDFS Sink的滚动策略。用户可能需要了解为什么选择这些配置,以及如何根据实际需求调整。引用之前的例子,比如hadoop-log-to-hdfs.conf,确保一致性。 验证部分要给出具体的HDFS命令,如hdfs dfs -ls和hdfs dfs -cat,以及如何查看Flume日志。用户可能需要确认数据是否按预期写入HDFS,并且日志没有错误。常见问题如权限错误或position file损坏的解决方法也要提到,帮助用户快速排查。 最后,确保回答符合用户的要求,包括安装步骤、配置编写、启动和验证,同时参考之前的引用内容,保持信息的准确性和完整性。语言要简洁明了,步骤详细,方便用户跟随操作。</think>--- ### Hadoop环境下Flume安装配置及日志采集全流程指南 --- ### 一、Flume安装步骤 #### 1. 软件解压与环境变量配置 ```bash # 解压到指定目录(以1.10.1版本为例) tar -zxvf apache-flume-1.10.1-bin.tar.gz -C /opt/module/ mv /opt/module/apache-flume-1.10.1-bin /opt/module/flume # 配置环境变量(/etc/profile) export FLUME_HOME=/opt/module/flume export PATH=$FLUME_HOME/bin:$PATH source /etc/profile # 验证安装 flume-ng version # 应显示版本信息如:Flume 1.10.1 ``` #### 2. 配置文件初始化 ```bash # 初始化环境配置模板 cd $FLUME_HOME/conf cp flume-env.sh.template flume-env.sh # 必须重命名才能生效[^1] vim flume-env.sh # 添加JAVA_HOME:export JAVA_HOME=/usr/java/jdk1.8.0_291 ``` --- ### 二、日志采集配置文件(以Hadoop日志为例) #### 1. 创建配置文件 `hadoop-log-collect.conf` ```properties # 定义Agent组件 agent.sources = tailSource agent.channels = memChannel agent.sinks = hdfsSink # 配置Source(监控Hadoop日志目录) agent.sources.tailSource.type = TAILDIR # 推荐使用TAILDIR实现断点续传[^4] agent.sources.tailSource.filegroups = f1 agent.sources.tailSource.filegroups.f1 = /opt/hadoop/logs/.*.log agent.sources.tailSource.positionFile = /opt/flume/taildir_position.json # 记录读取位置 # 配置Channel(内存缓冲) agent.channels.memChannel.type = memory agent.channels.memChannel.capacity = 10000 # 最大事件数 agent.channels.memChannel.transactionCapacity = 5000 # 事务处理量 # 配置Sink写入HDFS) agent.sinks.hdfsSink.type = hdfs agent.sinks.hdfsSink.hdfs.path = hdfs://hadoop-cluster/tmp/flume_logs/%Y%m%d agent.sinks.hdfsSink.hdfs.filePrefix = hadoop_log agent.sinks.hdfsSink.hdfs.fileType = DataStream # 保持原始格式 agent.sinks.hdfsSink.hdfs.rollInterval = 600 # 10分钟滚动文件 agent.sinks.hdfsSink.hdfs.rollSize = 134217728 # 128MB滚动 agent.sinks.hdfsSink.hdfs.rollCount = 0 # 禁用事件数滚动 agent.sinks.hdfsSink.hdfs.useLocalTimeStamp = true # 使用本地时间戳 # 组件绑定 agent.sources.tailSource.channels = memChannel agent.sinks.hdfsSink.channel = memChannel ``` --- ### 三、启动Agent与验证 #### 1. 启动Flume Agent ```bash # 前台启动(调试模式) flume-ng agent \ --name agent \ --conf $FLUME_HOME/conf \ --conf-file hadoop-log-collect.conf \ -Dflume.root.logger=INFO,console # 实时查看日志 # 后台启动(生产环境) nohup flume-ng agent --name agent --conf-file hadoop-log-collect.conf > flume.log 2>&1 & ``` #### 2. 数据验证方法 **验证点1:HDFS文件生成** ```bash hdfs dfs -ls /tmp/flume_logs/$(date +%Y%m%d) # 查看当天目录 # 预期输出示例: # -rw-r--r-- 3 hadoop supergroup 134217728 2023-10-01 10:00 /tmp/flume_logs/20231001/hadoop_log.1696125600000 ``` **验证点2:日志内容检查** ```bash hdfs dfs -cat /tmp/flume_logs/$(date +%Y%m%d)/hadoop_log.* | head -n 5 # 预期输出示例: # 2023-10-01 09:58:21,123 INFO org.apache.hadoop.hdfs.StateChange: BLOCK* allocate... # 2023-10-01 09:58:22,456 WARN org.apache.hadoop.yarn.ResourceManager: Node... ``` **验证点3:Flume日志监控** ```bash tail -f flume.log | grep "HDFS sink" # 预期看到类似日志: # Sink hdfsSink: Appended 5000 events to hdfs://hadoop-cluster/tmp/flume_logs/20231001/hadoop_log.1696125600000.tmp ``` --- ### 四、关键配置说明 #### 1. TAILDIR Source优势 - **断点续传**:通过`positionFile`记录读取偏移量,Agent重启后自动恢复[^4] - **多文件监控**:支持正则表达式匹配多个日志文件 - **实时性**:相比Exec Source更稳定,不会因日志轮转丢失数据 #### 2. HDFS Sink优化项 ```properties # 启用压缩(需Hadoop支持) agent.sinks.hdfsSink.hdfs.codeC = gzip agent.sinks.hdfsSink.hdfs.fileSuffix = .gz # 设置文件权限 agent.sinks.hdfsSink.hdfs.kerberosPrincipal = flume/_HOST@YOURDOMAIN.COM # Kerberos环境下 agent.sinks.hdfsSink.hdfs.kerberosKeytab = /etc/security/keytabs/flume.keytab ``` --- ### 五、常见问题排查 1. **HDFS权限错误** ```bash hdfs dfs -chmod -R 777 /tmp/flume_logs # 临时开放权限 # 生产环境建议配置专用HDFS用户 ``` 2. **Position File异常** ```bash rm /opt/flume/taildir_position.json # 清空偏移量文件后重启Agent ``` 3. **时区不一致问题** ```properties agent.sinks.hdfsSink.hdfs.useLocalTimeStamp = true # 必须在配置中显式声明[^3] ``` --- ### 六、高阶应用场景 #### 1. 多级Agent架构 ```properties # 边缘节点配置(发送到中心节点) agent.sinks = avroSink agent.sinks.avroSink.type = avro agent.sinks.avroSink.hostname = hadoop-master agent.sinks.avroSink.port = 41414 # 中心节点配置(接收并写入HDFS) agent.sources = avroSource agent.sources.avroSource.type = avro agent.sources.avroSource.bind = 0.0.0.0 agent.sources.avroSource.port = 41414 ``` #### 2. 日志格式转换 通过Interceptor实现字段提取: ```properties agent.sources.tailSource.interceptors = i1 agent.sources.tailSource.interceptors.i1.type = regex_extractor agent.sources.tailSource.interceptors.i1.regex = (ERROR|WARN|INFO) agent.sources.tailSource.interceptors.i1.serializers = s1 agent.sources.tailSource.interceptors.i1.serializers.s1.name = log_level ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值