flume传输日志文件到hdfs笔记

发布时间 2023-06-06 18:33:51作者: 潇湘神剑

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

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.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.192.168.90.111.%Y%m%d%H  # hdfs中存放名称的前缀
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.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即可恢复正常。