flume传输日志文件到hdfs笔记

1、flume官网

https://flume.apache.org/

2、安装kerberos客户端

由于我在hdfs开启了kerberos认证,所以要先装kerberos客户端:
yum install krb5-devel krb5-workstation -y
再将kerberos server端的/etc/krb5.conf配置文件复制过来放到flume服务器的/etc/krb5.conf

如何部署kerberos服务端请看我这篇文档:https://www.cnblogs.com/zhangzhide/p/17452093.html

3、部署flume

将从官网下载的flume安装包解压到/usr/local目录下

tar xvf apache-flume-1.11.0-bin.tar.gz -C /usr/local/

4、定义flume配置文件

vim /usr/local/flume/conf/flume-hdfs.conf
#agent section (v2)
tier1.sources = src
tier1.channels = ch
tier1.sinks = sinkhdfs

#source section-v2
tier1.sources.src.type = TAILDIR  # 来源类型,监视指定的文件。
tier1.sources.src.positionFile = /usr/local/flume/data/taildir_position.json  # JSON格式的文件,用于记录索引节点
tier1.sources.src.filegroups = f1  # 文件组名称
tier1.sources.src.filegroups.f1 = /var/log/nginx/access.log  # 需要监听的文件路径
Tier1.sources.src.batchSize = 1000  # 每次从通道读取并发送的最大行数
tier1.sources.src.backoffSleepIncrement = 1000  # 重试时间间隔(毫秒)
tier1.sources.src.maxBackoffSleep = 5000  # 每一次重试的最大时间间隔(毫秒)
tier1.sources.src.inputCharset = ISO-8859-1  # 指定字符集
tier1.sources.src.deserializer.maxLineLength = 20480  # 单个事件中包含的最大字符数。如果行超过此长度,则会被截断,并且剩余行将在随后的事件中出现。
tier1.sources.src.fileHeader = true  # 表示在Flume任务中包含文件头部信息。在这种情况下,Flume会将每个文件的文件头部信息包含在每个批次的数据流中,文件头部信息通常包括文件名、文件路径、文件大小等信息。
tier1.sources.src.maxBatchCount = 1000  # 用于控制Flume任务批量大小的参数。它指定了在单个批次中可以处理的任务数。
tier1.sources.src.interceptors = i1 # 定义拦截器的名称
tier1.sources.src.interceptors.i1.type = host # 拦截器类型为host
tier1.sources.src.interceptors.i1.useIP = true # 如果是true则host使用ip地址,如果是fasle则host使用主机名
tier1.sinks.sinkhdfs.type = hdfs  # # sink类型
tier1.sinks.sinkhdfs.hdfs.path = hdfs://cdh-master:8020/nginx/stzy/%Y%m%d  # # hdfs NameNode地址
tier1.sinks.sinkhdfs.hdfs.filePrefix = nginx-access.log.%{host}.%Y%m%d%H  # hdfs中存放名称的前缀。%{host}表示引用source定义的拦截器
tier1.sinks.sinkhdfs.hdfs.writeFormat = Text  # 序列文件记录格式
tier1.sinks.sinkhdfs.hdfs.fileType = CompressedStream  # 使用压缩
tier1.sinks.sinkhdfs.hdfs.codeC = gzip  # 压缩编码为gzip
tier1.sinks.sinkhdfs.hdfs.rollInterval = 300  # 当前文件写入达到该值时间后触发滚动创建新文件(0表示不按照时间来分割文件),单位:秒
tier1.sinks.sinkhdfs.hdfs.useLocalTimeStamp=true  # 使用日期时间转义符时是否使用本地时间戳
tier1.sinks.sinkhdfs.hdfs.rollSize = 134217728  # 当前文件写入达到该大小后触发滚动创建新文件(0表示不根据文件大小来分割文件),单位:字节
tier1.sinks.sinkhdfs.hdfs.rollCount = 0  # 当前文件写入Event达到该数量后触发滚动创建新文件(0表示不根据 Event 数量来分割文件)
tier1.sinks.sinkhdfs.hdfs.idleTimeout = 300  # 关闭非活动文件的超时时间(0表示禁用自动关闭文件),单位:秒
tier1.sinks.sinkhdfs.hdfs.callTimeout = 300000  # 允许HDFS操作文件的时间,比如:open、write、flush、close。如果HDFS操作超时次数增加,应该适当调高这个这个值。(毫秒)
tier1.sinks.sinkhdfs.hdfs.closeTries = 10 # 尝试重命名文件的次数,如果设置为1则不重试;0为无限制重试,此时flume日志中会有"Closing file: hdfs://xxx.tmp failed. Will retry again in 180 seconds."如果不指定数量则会一直重试下去。 tier1.sinks.sinkhdfs.hdfs.batchSize = 100 # 向 HDFS 写入内容时每次批量操作的 Event 数量 tier1.sinks.sinkhdfs.hdfs.minBlockReplicas=1 # 指定每个HDFS块的最小副本数。 tier1.sinks.sinkhdfs.hdfs.kerberosPrincipal = stzy/cdh-master@KRBCDH.COM # 用于安全访问 HDFS 的 Kerberos 用户主体 tier1.sinks.sinkhdfs.hdfs.kerberosKeytab = /usr/local/flume/conf/hdfs.keytab # 用于安全访问 HDFS 的 Kerberos keytab 文件 # Each channel's type is defined. tier1.channels.ch.type = SPILLABLEMEMORY # 当内存队列已满时,其他传入的事件将存储在文件通道中,官方提示目前还在实验中,不建议在生产环境使用。 tier1.channels.ch.memoryCapacity = 10000 # 在内存队列中存储事件的最大数量。将此设置为零可以禁用内存队列。 #tier1.channels.ch.memoryCapacity = 0 tier1.channels.ch.overflowCapacity = 100000 # 缓冲区外存储事件的最大数量(即文件通道(File channel))。将此设置为零可以禁用缓冲区外存储。 tier1.channels.ch.checkpointDir = /usr/local/flume/checkpoint/common # 指定数据处理过程中检查点文件的目录。在数据处理过程中,flume会定期将处理的数据写入检查点文件,以便在发生错误或异常时,可以回滚到之前的数据点,以便重新处理这些数据。 tier1.channels.ch.dataDirs = /usr/local/flume/data/common # 用逗号分隔的用于存储日志文件的目录列表。在不同的磁盘上使用多个目录可以提高文件通道的性能 #Specify the channel the sink should use tier1.sources.src.channels = ch tier1.sinks.sinkhdfs.channel = ch

5、下载hadoop包

hadoop官网:https://hadoop.apache.org/

  由于flume的运行需要依赖hadoop的一些jar包,如果你明确知道flume要依赖hadoop的哪些jar包,你可以将hadoop的jar包复制一份到flume的lib库目录下(/usr/local/flume/lib),如果不知道,那就干脆下载一个hadoop的安装包,并且解压到相应的目录,给它配置上环境变量即可。这样flume就能引用hadoop的jar包。 

cat /etc/profile.d/hadoop.sh
export HADOOP_HOME=/usr/local/hadoop-3.3.5
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

6、启动flume

/usr/local/flume/bin/flume-ng agent --name tier1 --conf conf --conf-file /usr/local/flume/conf/flume-hdfs.conf

  此时,会在/usr/local/flume目录下产生一个flume.log的日志文件。

查看flume日志:

 查看hdfs:

 7、总结

7.1、flume启动报错"Can't get Kerberos realm"

   如果出现上述错误,不用怀疑,flume主机未安装kerberos客户端,亦或者安装了但是没有同步krb5.conf,解决方法就是安装kerberos客户端,同步krb5.conf配置。

7.2、flume启动报错"HDFS IO error"

   这种情况会在hdfs侧生成很多空的gz文件,这个报错原因很多,有可能是hdfs那边的问题,需要先排查hdfs的问题手动去验证hdfs的读写,如果hdfs没有问题,就需要清空“/usr/local/flume/data/”目录下的所有文件,然后重启flume即可恢复正常。

posted @ 2023-06-06 18:25  潇湘神剑  阅读(167)  评论(0编辑  收藏  举报