Flume是开源日志系统。是一个分布式、可靠性和高可用的海量日志聚合系统,支持在系统中定制各类数据发送方,用于收集数据;同时,FLume提供对数据进行简单处理,并写到各种数据接收方(可定制)的能力。
Flume是流式日志采集工具,FLume提供对数据进行简单处理并且写到各种数据接收方(可定制)的能力,Flume提供从本地文件(spooling directory source)、实时日志(taildir、exec)、REST消息、Thift、Avro、Syslog、Kafka等数据源上收集数据的能力。
Flume是收集、聚合事件流数据的分布式框架。
Flume分布式系统中最核心的角色是 agent ,Flume采集系统就是由一个个agent所连接起来形成
每一个agent相当于一个数据传递员 ,内部有三个组件:
Source 到Channel 到Sink之间传递数据的形式是Event事件; Event事件是一个数据流单元 。
Flume基础架构:Flume可以单节点直接采集数据,主要应用于集群内数据。
Flume多agent架构:Flume可以将多个节点连接起来,将最初的数据源经过收集,存储到最终的存储系统中。主要应用于集群外的数据导入到集群内。
各组件具体介绍如下:
Source负责接收events或通过特殊机制产生events,并将events批量放到一个或多个Channels。有驱动和轮询2中类型的Source。
Source必须至少和一个channel关联。
Source的类型如下:
Channel位于Source和Sink之间,Channel的作用类似队列,用于临时缓存进来的events,当Sink成功地将events发送到下一跳的channel或最终目的,events从Channel移除。
不同的Channel提供的持久化水平也是不一样的:
Channels支持事物,提供较弱的顺序保证,可以连接任何数量的Source和Sink。
Sink负责将events传输到下一跳或最终目的,成功完成后将events从channel移除。
必须作用于一个确切的channel。
Sink类型:
Flume支持将集群外的日志文件采集并归档到HDFS、HBase、Kafka上,供上层应用对数据分析、清洗数据使用。
Flume支持将多个Flume级联起来,同时级联节点内部支持数据复制。
这个场景主要应用于:收集FusionInsight集群外上的节点上的日志,并通过多个Flume节点,最终汇聚到集群当中。
Flume级联节点之间的数据传输支持压缩和加密,提升数据传输效率和安全性。
在同一个Flume内部进行传输时,不需要加密,为进程内部的数据交换。
Source接收的数据量,Channel缓存的数据量,Sink写入的数据量,这些都可以通过Manager图形化界面呈现出来。
Flume在传输数据过程中,采用事物管理方式,保证数据传输过程中数据不会丢失,增强了数据传输的可靠性,同时缓存在channel中的数据如果采用了file channel,进程或者节点重启数据不会丢失。
Flume在传输数据过程中,如果下一跳的Flume节点故障或者数据接收异常时,可以自动切换到另外一路上继续传输。
Flume在传输数据过程中,可以见到的对数据简单过滤、清洗,可以去掉不关心的数据,同时如果需要对复杂的数据过滤,需要用户根据自己的数据特殊性,开发过滤插件,Flume支持第三方过滤插件调用
安装地址:
安装部署:
本地使用的是CDH 6.3.1 版本,已安装Flume,此处略过安装步骤
使用 Flume 监听一个端口,收集该端口数据,并打印到控制台。
安装netcat并检查端口是否被占用
在Flume的安装目录下创建conf/lib目录,并创建flume的配置文件
添加内容如下:
第一种写法:
第二种写法:
参数说明:
--conf/-c:表示配置文件存储在 conf/目录
--name/-n:表示给 agent 起名为 a1
--conf-file/-f:flume 本次启动读取的配置文件是在 job 文件夹下的 flume-telnet.conf
文件。
-Dflume.root.logger=INFO,console :-D 表示 flume 运行时动态修改 flume.root.logger
参数属性值,并将控制台日志打印级别设置为 INFO 级别。日志级别包括:log、info、warn、
error。
通过nc输入的数据,flume监听页面都接受到了,并且输出到了控制台
实时监控 Hive 日志,并上传到 HDFS 中
注:要想读取 Linux 系统中的文件,就得按照 Linux 命令的规则执行命令。由于 Hive 日志在 Linux 系统中所以读取文件的类型选择:exec 即 execute 执行的意思。表示执行Linux 命令来读取文件。
添加如下内容:
注意: 对于所有与时间相关的转义序列,Event Header 中必须存在以 “timestamp”的key(除非 hdfs.useLocalTimeStamp 设置为 true,此方法会使用 TimestampInterceptor 自动添加 timestamp)。
a3.sinks.k3.hdfs.useLocalTimeStamp = true
从日志可以看到文件已经上传到HDFS:
在HDFS上查看:
1小时自动生产一个目录
1分钟自动生产一个文件
tmp结尾的文件为正在写入的文件,时间到了后就会自动重命名
使用 Flume 监听整个目录的文件,并上传至 HDFS
添加如下内容:
flume日志:
从日志输出可以看到原目录的 c.txt直接被修改为 c.txt.COMPLETED,然后c.txt上传到一个另外名字的文件,而且从输出可以看到,多个文件的内容会合并上传到一个hdfs上的文件。
hdfs上看输出:
同样是1分钟一个文件,但是有写入才会创建,如果没有写入是不行的。
Exec source 适用于监控一个实时追加的文件,不能实现断点续传;Spooldir Source 适合用于同步新文件,但不适合对实时追加日志的文件进行监听并同步;而 Taildir Source 适合用于监听多个实时追加的文件,并且能够实现断点续传。
案例需求:
使用 Flume 监听整个目录的实时追加文件,并上传至 HDFS 。
添加如下内容:
flume控制台输出:
HDFS查看输出文件:
Taildir Source 维护了一个 json 格式的 position File,其会定期的往 position File中更新每个文件读取到的最新的位置,因此能够实现断点续传
注:
Linux 中储存文件元数据的区域就叫做 inode,每个 inode 都有一个号码, *** 作系统用 inode 号码来识别不同的文件,Unix/Linux 系统内部不使用文件名,而使用 inode 号码来识别文件。
改名后inode不会发生变化,这点要注意
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)