flume传输日志文件到hdfs笔记
1、flume官网
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即可恢复正常。