Flume
- 概念:
Flume是一种分布式、可靠且可用的服务,用于高效地收集、聚合和移动大量日志数据。它具有基于流数据流的简单
灵活的体系结构。它具有健壮性和容错性,具有可调的可靠性机制和许多故障转移和恢复机制。它使用一个简单的可
扩展数据模型,允许在线分析应用程序。
- 架构:
- 组件
source:数据源组件,用于读取相应数据,并将数据传到channel中
channel:管道,用于连接source和sink
sink:数据下沉组件,用于将channel中的数据持久化到对应的文件系统中或者流中
agent:flume的运行单元.里面必须包含一个或者多个source,channel,sink,运行在单个jvm中
event:事件,是数据的描述
interceptor:拦截器,作用于source阶段,用于过滤数据
selectorer:选择器,作用于source阶段,默认是replicating,也就是复用功能,mutiplxing
groupsinks:sink组,用于将多个sink选择sinkf
常用的组件:
source常用的组件:exec、avro、source、spooling、dirctory、kafka、netcat、http、自定义
channel常用的组件:memory、file、kafka、jdbc
sink常用组件:avro、hdfs、hive、hbase、kafka
- 安装
1.解压到指定目录
2.cp conf/flume-env.sh.template conf/flume-env.sh
在flume-env.sh下配置JAVA_HOME
1.Flume Sources
1.1 EXEC Source
- Exec source在启动时运行一个给定的Unix命令,并期望该进程在标准输出上不断地生成数据(除非将属性logStdErr设置为true,否则将直接丢弃stderr)。如果进程出于任何原因退出,源也将退出,并且不会产生进一步的数据。这意味着像cat [named pipe]或tail - f [file]这样的配置将产生预期的结果,而as date可能不会产生这种结果——前两个命令将产生数据流,而后者将产生单个事件并退出。
- 属性详解
必要属性:
agent.sources=xx //当前source的名称
agent.sources.xx.channels=xxx //当前source连接的channel的名称,因为一个source可以连接多个channel,所以这的属性为channels
agent.sources.xx.type=exec //当前source的类型
agent.sources.xx.command=xxxx //当前source在exec类型下的执行命令
其他属性:
shell //用于运行命令的shell调用。例如/bin/sh - c。仅适用于依赖于通配符、反勾号、管道等shell特性的命令。
restartThrottle //尝试重新启动前等待的时间(以毫秒为单位) 默认值:10000
restart //如果执行的cmd死亡,是否应该重新启动它 默认值:false
logStdErr //是否应该记录命令的stderr 默认值:false
batchSize //一次读取和发送到通道的最大行数 默认值:20
batchTimeout //如果没有达到缓冲区大小,则在数据被向下推送之前等待的时间(以毫秒为单位) 默认值:3000
selector.type //replicating(复用) 或者 multiplexing(多路复用)
interceptors //以空格分隔的拦截器列表
- ExecSource和其他异步源的问题是,如果无法将事件放入客户机知道的通道中,则源不能保证该事件。在这种情况下,数据将丢失。例如,最常见的请求特性之一是tail -F [file]类用例,在这种用例中,应用程序向磁盘上的日志文件写入数据,Flume跟踪文件,将每一行作为一个事件发送。虽然这是可能的,但有一个明显的问题;如果通道被填满,Flume不能发送事件,会发生什么?Flume无法向编写日志文件的应用程序表明它需要保留日志,或者由于某种原因没有发送事件。如果这没有意义,您只需要知道这一点:当使用单向异步接口(如ExecSource)时,您的应用程序永远不能保证数据已被接收!作为此警告的扩展(而且要完全清楚),在使用此源时绝对没有事件交付的保证。要获得更强的可靠性保证,可以考虑使用假脱机目录源、Taildir源或通过SDK与Flume直接集成。
1.2 Spooling Directory Source
- 通过将要摄取的文件放置到磁盘上的“假脱机”目录中,该源允许您摄取数据。这个源将监视新文件的指定目录,并在新文件出现时从其中解析事件。事件解析逻辑是可插入的。在将给定文件完全读入通道后,默认情况下,通过重命名该文件来表示完成,或者可以删除该文件,或者使用trackerDir跟踪处理过的文件。
- 与Exec源不同,该源是可靠的,即使重新启动或关闭Flume,也不会丢失数据。为了获得这种可靠性,只能将不可变的、惟一命名的文件放入假脱机目录。Flume试图检测这些问题条件,如果违反这些条件,将会失败:
- 属性详解
必要属性:
agent.sources=xx //当前source的名称
agent.sources.xx.type=spooldir //当前source的类型
agent.sources.xx.channels=xxx //当前source连接的channel的名称
agent.sources.xx.spoolDir=xxxxx //要从中读取文件的目录
其他属性:
fileSuffix //附加到完全读取的文件的后缀 默认值:.COMPLETED
deletePolicy //何时删除已完成的文件, never or immediate 默认值:never
fileHeader //是否添加存储绝对路径文件名的头文件 默认值:false
fileHeaderKey //标题键,当将绝对路径文件名附加到事件标题时使用 默认值:file
basenameHeader //是否添加存储文件基本名的头文件。 默认值:false
basenameHeaderKey //当将文件的基本名称附加到事件标头时使用的标头键。 默认值:basename
includePattern //指定要包含哪些文件的正则表达式。它可以与ignorePattern一起使用。如果文件同时匹配ignorePattern和includePattern regex,则忽略该文件。 默认值:^.*$
ignorePattern //指定要忽略(跳过)哪些文件的正则表达式。可与其它助剂配套使用。如果文件同时匹配ignorePattern和includePattern regex,则忽略该文件。 默认值: ^$
trackerDir //目录用于存储与处理文件相关的元数据。如果这条路径不是绝对路径,那么它将被解释为spoolDir。 默认值:.flumespool
trackingPolicy //跟踪策略定义如何跟踪文件处理。它可以是“rename”或“tracker_dir”。只有当deletePolicy为“never”时,此参数才有效。“rename”——在处理文件之后,根据fileSuffix参数对文件进行重命名。“tracker_dir”——文件没有重命名,但是在trackerDir中创建了一个新的空文件。新的跟踪器文件名派生自已摄入的文件和fileSuffix。
inputCharset //将输入文件视为文本的反序列化器使用的字符集。 默认值:UTF-8
pollDelay //轮询新文件时的延迟(以毫秒为单位) 默认值:500
maxBackoff //如果通道已满,在连续尝试写入通道之间等待的最长时间(以毫秒为单位)。源将从一个较低的回退开始,并在每次通道抛出ChannelException时以指数级增长,直到该参数指定的值为止。 默认值:4000
recursiveDirectorySearch//是否要监视新文件读取的子目录。 默认值:false
batchSize //批处理传输到通道的粒度 默认值:100
decodeErrorPolicy //当我们在输入文件中看到一个不可解码的字符时该怎么办?FAIL:抛出异常并无法解析文件。REPLACE:用“替换字符”字符替换不可解析的字符,通常是Unicode U+FFFD。IGNORE:删除不可解析的字符序列。 默认值:FAIL
deserializer //指定用于将文件解析为事件的反序列化器。默认情况下将每一行解析为一个事件。指定的类必须实现eventdeseriizer . builder 默认值:LINE
deserializer.* //不同的事件反序列化器。
selector.type //选择器的类型,replicating or multiplexing 默认值:replicating
selector.* //取决于选择器。类型值
interceptors //以空格分隔的拦截器列表
1.3 Syslog Tcp Source
- 读取syslog数据并生成Flume事件。UDP源将整个消息视为单个事件。TCP源为每个用换行符(’ n ')分隔的字符串创建一个新事件。
- 属性详解
必有属性:
agent.sources=xx; //当前source的名称
agent.sources.xx.type=syslogtcp//当前source的类型
agent.sources.xx.port=xxxx //要绑定的端口号
agent.sources.xx.host=xxxx //要绑定到的主机名或IP地址
agent.sources.xx.channels=xxx //当前source连接的channel的名称
1.4 HTTP Source
- 一个通过HTTP POST接受Flume事件的源。应该只用于实验。HTTP请求通过一个可插入的“处理程序”转换成flume事件,它必须实现HTTPSourceHandler接口。这个处理程序使用一个HttpServletRequest,并返回一个flume事件列表。从一个Http请求处理的所有事件都在一个事务中提交给通道,从而允许在像文件通道这样的通道上提高效率。如果处理程序抛出异常,此源将返回400的HTTP状态。如果通道是完整的,或者源无法向通道附加事件,源将返回HTTP 503 -暂时不可用状态。
- 属性详解
必有属性:
agent.sources=xx; //当前source的名称
agent.sources.xx.type=http//当前source的类型
agent.sources.xx.port=xxxx //要绑定的端口号
agent.sources.xx.channels=xxx //当前source连接的channel的名称
其他属性:
bind //要监听的主机名或IP地址
handler //处理程序类的FQCN 默认值: org.apache.flume.source.http.JSONHandler 所以测试的数据需要用json格式
ssl //将属性设置为true,以启用SSL。HTTP源不支持SSLv3。 默认值:false
1.5 Avro Source
- 监听Avro端口并从外部Avro客户端流接收事件。当与另一个(前一层)flume agent上的内置Avro接收器相结合时,它可以创建分层收集拓扑
- 属性详解
必有属性:
agent.sources=xx; //当前source的名称
agent.sources.xx.type=avro//当前source的类型
agent.sources.xx.bind=xxx //要监听的主机名或IP地址
agent.sources.xx.port=xxxx //要绑定的端口号
agent.sources.xx.channels=xxx //当前source连接的channel的名称
其他属性:
selector.type //选择器类型
selector.* //选择器其他属性
interceptors //过滤器名称
interceptors.* //过滤器其他属性
.....
1.6 NetCat TCP Source
- 一个类似netcat的源程序,它监听给定的端口并将每一行文本转换为一个事件。类似于nc -k -l [host] [port]。换句话说,它打开指定的端口并侦听数据。期望提供的数据是换行分隔的文本。每一行文本都被转换成一个Flume事件,并通过连接的通道发送。
- 属性详解
必有属性:
agent.sources=xx; //当前source的名称
agent.sources.xx.type=netcat//当前source的类型
agent.sources.xx.bind=xxx //要绑定到的主机名或IP地址
agent.sources.xx.port=xxxx //要绑定的端口号
agent.sources.xx.channels=xxx //当前source连接的channel的名称
其他属性
selector.type //选择器类型
selector.* //选择器其他属性
interceptors //过滤器名称
interceptors.* //过滤器其他属性
.....
2.Flume Channels
2.1 Memory Channel
- 属性详解
//必有属性
agent.channels=xx //指定当前channel的名称
agent.channels.xx.type=memory
//其他属性
capacity //存储在通道中的最大事件数量 默认值:100
transactionCapacity //通道在每个事务中将从源获取或提供给接收器的最大事件数 默认值:100
keep-alive //超时(以秒为单位),用于添加或删除事件 默认值:3
byteCapacityBufferPercentage //定义字节码容量与估计的通道中所有事件的总大小之间的缓冲区百分比,以解释报头中的数据。 默认值:20
byteCapacity //允许的最大内存字节数,作为该通道中所有事件的总和。实现只计算事件体,这也是提供bytecapacitybufferpercent配置参数的原因。默认计算值等于JVM可用的最大内存的80%(即在命令行上传递的-Xmx值的80%)。请注意,如果您在一个JVM上有多个内存通道,并且它们碰巧包含相同的物理事件(例如,如果您使用来自单个源的复制通道选择器),那么出于通道字节码的目的,这些事件大小可能会被重复计算。将该值设置为0将导致该值回落到大约200gb的硬内部限制。
2.2 File Channel
- 属性详解
必有属性:
agent.channels=xx //指定当前channel的名称
agent.channels.xx.type=file //当前channel的类型
其他属性:
checkpointDir //checkpoint文件的存储路径 默认值:~/.flume/file-channel/checkpoint
useDualCheckpoints //备份的检查站。如果将其设置为true,则必须设置backupCheckpointDir 默认值:false
backupCheckpointDir //checkpoint文件备份到的目录。此目录不能与dataDir或checkpointDir相同
dataDirs //目录列表,用于存储日志文件。在单独的磁盘上使用多个目录可以提高文件通道的性能 默认值:~/.flume/file-channel/data
transactionCapacity //通道支持的最大事务大小 默认值 10000
checkpointInterval //checkpoints的时间间隔,以毫秒为单位 默认值:30000
maxFileSize //单个日志文件的最大大小(以字节为单位) 默认值: 2146435071 相当于2G
minimumRequiredSpace //最少需要的空闲空间(以字节为单位)。为避免数据损坏,当空闲空间低于此值时,文件通道停止接受take/put请求 默认值:524288000 相当于500M
capacity //通道的最大容量 默认值:1000000
keep-alive //等待操作的时间,以秒为单位 默认值:3
checkpointOnClose //控制在通道关闭时是否创建检查点。在关闭时创建检查点可以避免重播,从而加快文件通道的后续启动。 默认值:true
encryption.activeKey //用于加密新数据的密钥名称
encryption.cipherProvider //密码提供程序类型,支持的类型:AESCTRNOPADDING
encryption.keyProvider //密钥提供程序类型,支持的类型:JCEKSFIL
encryption.keyProvider.keyStoreFile //密钥存储文件的路径
encrpytion.keyProvider.keyStorePasswordFile //密钥存储密码文件的路径
encryption.keyProvider.keys //所有键的列表(例如activeKey设置的历史记录)
- 默认情况下,文件通道使用检查点和数据目录的路径,这些目录位于用户主目录中,如上所述。因此,如果在代理中有多个活动的文件通道实例,则只有一个能够锁定目录并导致其他通道初始化失败。因此,有必要为所有已配置的通道提供显式路径,最好是在不同的磁盘上。此外,由于文件通道在每次提交之后都将同步到磁盘,因此可能需要将其与接收器/源耦合,以便在检查点和数据目录无法使用多个磁盘的情况下提供良好的性能。
3.Flume Sinks
3.1 HDFS Sink
- 这个接收器将事件写入Hadoop分布式文件系统(HDFS)。它目前支持创建文本和序列文件。它支持这两种文件类型的压缩。可以根据经过的时间、数据大小或事件数量定期滚动文件(关闭当前文件并创建一个新文件)。它还根据时间戳或事件起源的机器等属性对数据进行存储/分区。HDFS目录路径可能包含格式化转义序列,这些转义序列将被HDFS接收器替换,以生成一个目录/文件名来存储事件。使用这个接收器需要安装hadoop,以便Flume可以使用hadoop jar与HDFS集群通信。注意,需要一个支持sync()调用的Hadoop版本。
- 支持的转移序列
Alias Description
%{host} Substitute value of event header named “host”. Arbitrary header names are supported.
%t Unix time in milliseconds
%a locale’s short weekday name (Mon, Tue, ...)
%A locale’s full weekday name (Monday, Tuesday, ...)
%b locale’s short month name (Jan, Feb, ...)
%B locale’s long month name (January, February, ...)
%c locale’s date and time (Thu Mar 3 23:05:25 2005)
%d day of month (01)
%e day of month without padding (1)
%D date; same as %m/%d/%y
%H hour (00..23)
%I hour (01..12)
%j day of year (001..366)
%k hour ( 0..23)
%m month (01..12)
%n month without padding (1..12)
%M minute (00..59)
%p locale’s equivalent of am or pm
%s seconds since 1970-01-01 00:00:00 UTC
%S second (00..59)
%y last two digits of year (00..99)
%Y year (2010)
%z +hhmm numeric timezone (for example, -0400)
%[localhost] Substitute the hostname of the host where the agent is running
%[IP] Substitute the IP address of the host where the agent is running
%[FQDN] Substitute the canonical hostname of the host where the agent is running
- 属性详解
必有属性:
agent.sinks=xx //当前sink的名称
agent.sinks.xx.type = hdfs //当前sink的类型
agent.sinks.xx.channel=xxx //与当前sink连接的channel的名称,因为一个sink只能连接一个channel,所以当前的属性为channel
agent.sinks.xx.hdfs.path=$HDFS_PATH //hdfs上的目录路径
其他属性:
hdfs.filePrefix //Flume在hdfs创建的目录中创建的文件路径的上一级
hdfs.fileSuffix //附加到文件的后缀(例如:.avro -注意:句点不会自动添加)
hdfs.inUsePrefix //前缀,用于flume主动写入的临时文件
hdfs.inUseSuffix //后缀,用于flume主动写入的临时文件 默认值:.tmp
hdfs.emptyInUseSuffix //if false,在编写输出时使用inUseSuffix中设置的参数,关闭输出hdfs之后。从输出文件名中删除inUseSuffix设置的参数。if true,则inUseSuffix参数被忽略,取而代之的是一个空字符串。 默认值:false
hdfs.rollInterval //在滚动当前文件之前等待的秒数(0 =根据时间间隔永不滚动) 默认值:30
hdfs.rollSize //要触发滚动的文件大小,以字节为单位(0:永远不要基于文件大小进行滚动) 默认值:1024
hdfs.rollCount //滚前写入文件的事件数(0 =从不基于事件数滚) 默认值:10
hdfs.idleTimeout //关闭非活动文件的超时(0 =禁用自动关闭空闲文件) 默认值:0
hdfs.batchSize //在将文件刷新到HDFS之前写入文件的事件数 默认值:100
hdfs.codeC //压缩编解码器:gzip, bzip2, lzo, lzop, snappy
hdfs.fileType //文件格式:SequenceFile, DataStream或CompressedStream (1)DataStream不会压缩输出文件,请不要设置codeC (2)CompressedStream需要设置hdfs。带有可用编解码器的编解码器 默认值:SequenceFile
hdfs.maxnOpenFiles //只允许这个开放文件的数量。如果超过这个数字,则关闭最古老的文件。 默认值:5000
hdfs.minBlockReplicas //指定每个HDFS块的最小复制数。如果没有指定,它来自类路径中的默认Hadoop配置
hdfs.writeFormat //序列文件(SequenceFile)记录的格式。Text或Writable在使用Flume创建数据文件之前设置为Text,否则这些文件不能被Apache Impala(孵化)或Apache Hive读取。 默认值:Writable
hdfs.threadsPoolSize //用于HDFS IO操作(打开、写入等)的每个HDFS接收器的线程数 默认值:10
hdfs.rollTimerPoolSize //每个HDFS接收器用于调度定时文件滚动的线程数 默认值:1
hdfs.kerberosPrincipal //访问安全HDFS的Kerberos用户主体
hdfs.kerberosKeytab //Kerberos keytab用于访问安全的HDFS
hdfs.round //是否应该将时间戳四舍五入(如果为真,则影响除%t之外的所有基于时间的转义序列) 默认值:false
hdfs.roundUnit //四舍五入的单位,时间,分钟,或小时 默认值:second
hdfs.roundValue //将此(在使用hdfs.roundUnit配置的单元中)分为以上多个(在单元配置的单元中),小于当前时间 默认值:1
hdfs.timeZone //用于解析目录路径的时区的名称,例如:America/Los Angeles。 默认值:Local Time
hdfs.useLocalTimeStamp //在替换转义序列时,使用本地时间(而不是事件头的时间戳) 默认值:false
hdfs.closeTries //设置为0:有节点挂掉后,不会给file重命名,并且文件可能一直处于打开状态,并且后缀为自己设置的后缀;设置为1:有节点挂掉后,会尝试给file重命名,但是次数有限制;如果尝试失败,文件会保持开启,但会在flume再次启动时关闭.
默认值:0
hdfs.retryInterval //在连续试图关闭文件之间的时间。每个关闭调用都要花费多个RPC往返于Namenode,因此设置太低会导致名称节点上的大量负载。如果设置为0或更少,sink将不会试图关闭该文件 默认值:180
serializer //其他可能的选项包括avro_event或EventSerializer.BUilder实现的完全限定类名 默认值:TEXT
3.2 Logger Sink
- 记录信息级别的事件。通常用于测试/调试目的。所需属性为粗体。这个接收器是惟一不需要在Logging raw data中解释的额外配置的异常
- 属性详解
必有属性
agent.sinks=xx //当前sink的名称
agent.sinks.xx.channel=xxx //与当前sink连接的channel的名称
agent.sinks.xx.type=logger //当前sink的类型
其他属性
maxBytesToLog //要记录的事件主体的最大字节数 默认值:16
3.3 Avro Sink
- 这个接收器构成了Flume分层收集支持的一半。发送到此接收器的Flume事件被转换为Avro事件并发送到配置的主机名/端口对。事件从已配置的通道中以已配置的批大小批量获取
- 属性详解
必有属性:
agent.sinks=xx //当前sink的名称
agent.sinks.xx.channel=xxx //与当前sink连接的channel的名称
agent.sinks.xx.type=avro //当前sink的类型
agent.sinks.xx.hostname=xx //要绑定到的主机名或IP地址
agent.sinks.xx.port==xx //监听端口
其他属性:
batch-size //要批量发送的事件数 默认值:100
....
4.Flume Interceptors(拦截器)
- Flume具有修改/删除运行中的事件的功能。这是在拦截器的帮助下完成的。拦截器是实现org.apache.flume.interceptor.Interceptor接口的类。拦截器可以根据拦截器开发人员选择的任何标准修改甚至删除事件。flume支持拦截器链。这可以通过在配置中指定截取程序构建器类名列表来实现。截取程序在源配置中指定为空格分隔的列表。指定拦截器的顺序就是调用它们的顺序。一个拦截器返回的事件列表将传递给链中的下一个拦截器。拦截器可以修改或删除事件。如果拦截器需要删除事件,它只是在返回的列表中不返回该事件。如果要删除所有事件,则只返回一个空列表。拦截器是命名组件
4.1 Timestamp Interceptor
- 这个拦截器将插入到事件头中,即它处理事件的时间(单位为millis)。此拦截器插入具有键时间戳(或由header属性指定)的标头,其值为相关的时间戳。如果已经存在于配置中,则此拦截器可以保存现有的时间戳。
- 属性详解
必有属性:
agent.sources=xx //指定当前source的名称
agent.sources.xx.interceptors=xxx //指定当前interceptors的名称
agent.sources.xx.interceptors.xxx.type=timestamp //指定当前interceptors的类型
其他属性:
headerName //用于放置生成的时间戳的标题的名称 默认值:timestamp
preserveExisting //如果时间戳已经存在,应该保留它吗?true 或 false
默认值:false
4.2 Host Interceptor
- 此拦截器插入此代理正在运行的主机的主机名或IP地址。它插入一个带有密钥主机或已配置密钥的头,根据配置,密钥的值是主机的主机名或IP地址。
- 属性详解
必有属性:
agent.sources=xx //指定当前source的名称
agent.sources.xx.interceptors=xxx //指定当前interceptors的名称
agent.sources.xx.interceptors.xxx.type=host //指定当前interceptors的类型
其他属性:
hostheader //要使用的头键 默认值:host
useIP //如果为真,则使用IP地址,否则使用主机名 默认值:true
preserveExisting //如果hostheader已经存在,应该保留它吗?是真还是假 默认值:false
4.3 Static Interceptor
- 静态拦截器允许用户将带有静态值的静态头附加到所有事件
- 当前实现不允许同时指定多个头。相反,用户可以链接多个静态拦截器,每个拦截器定义一个静态头。
- 属性详解
必有属性:
agent.sources=xx //指定当前source的名称
agent.sources.xx.interceptors=xxx //指定当前interceptors的名称
agent.sources.xx.interceptors.xxx.type=static //指定当前interceptors的类型
其他属性:
key //应该创建的标题的名称 默认值:key
value //应该创建的静态值 默认值:value
preserveExisting //如果配置的头已经存在,应该保留它-true或false 默认值:true
4.4 Regex Filtering Interceptor
- 拦截器通过将事件体解释为文本并根据已配置的正则表达式匹配文本,选择性地过滤事件。所提供的正则表达式可用于包含事件或排除事件。
- 属性详解
必有属性:
agent.sources=xx //指定当前source的名称
agent.sources.xx.interceptors=xxx //指定当前interceptors的名称
agent.sources.xx.interceptors.xxx.type=regex_filter //指定当前interceptors的类型
其他属性:
regex //用于匹配事件的正则表达式 默认值:".*"
exclude //if true:则regex确定要排除的事件,否则regex确定要包含的事件。 默认值:false
5. Flume Channel Selectors
5.1 Replicating Channel Selector (default)
- 属性详解
必有属性:
agent.sources=xx //指定当前source的名称
agent.sources.xx.selector.type=replicating //指定当前selector的类型 可以不配置,默认是replicating
其他属性:
selector.optional //一组要标记为可选的通道
//对于被标记的通道,无法写入此通道将被忽略;没有被标记为选择器的通道,无法写入此通道将报错
5.2 Multiplexing Channel Selector
-
多路选择还有一组属性用于将流分叉。这需要指定事件属性到channel集合的映射。选择器检查事件头中配置的每个属性。如果匹配指定的值,则将该事件发送到映射到该值的所有通道。如果没有匹配,则将事件发送到设置为默认值的通道集:
-
属性详解
必有属性:
agent.sources=xx //指定当前source的名称
agent.sources.xx.selector.type=multiplexing //指定当前selector的类型 可以不配置,默认是replicating
其他属性:
selector.header //默认值:flume.selector.header
selector.default //默认选择某一个channel
selector.mapping.* //配置不同的键值对,对应不同的channel
6.案例
6.1 exec -->memory -->logger
在/home下创建一个f_log随便写入
在conf下创建一个test文件夹,创建first.job进行配置
#定义source|channel|sink组件
a1.sources = r1
a1.sinks = k1
a1.channels = c1
#配置r1的属性
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /home/f_log
#配置sinks的属性
a1.sinks.k1.type = logger
#配置channel的属性
a1.channels.c1.type = memory
a1.channels.c1.capacity = 10000
a1.channels.c1.transactionCapacity = 10000
#绑定source与sink于channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
启动agent:
flume-ng agent -c conf/ -f ./conf/test/first.conf -n a1 -Dflume.root.logger=INFO,console
测试:
echo "123" >> /home/f_log
6.2 exec -->memory -->hdfs
在conf下创建一个test文件夹,创建exememhdf.conf进行配置
#定义source|channel|sink组件
a1.sources = r1
a1.sinks = k1
a1.channels = c1
#配置r1的属性
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /home/f_log
#配置sinks的属性
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = /flume/events/dt=%y-%m-%d
a1.sinks.k1.hdfs.filePrefix = events-
a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue = 10
a1.sinks.k1.hdfs.writeFormat=Text
a1.sinks.k1.hdfs.roundUnit=DataStream
a1.sinks.k1.hdfs.roundUnit = minute
a1.sinks.k1.hdfs.useLocalTimeStamp=true
#配置channel的属性
a1.channels.c1.type = memory
a1.channels.c1.capacity = 10000
a1.channels.c1.transactionCapacity = 10000
#绑定source与sink于channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
启动agent:
flume-ng agent -c conf/ -f conf/test/exememhdf.conf -n a1 -Dflume.root.logger=INFO,console
测试:
echo "123" >> /home/f_log
6.3 spooldir -->memory -->logger
创建/home/flumedata/spool1 目录
在conf下创建一个test文件夹,创建spomemlog.conf进行配置
a1.sources=r1
a1.channels=c1
a1.sinks=s1
a1.sources.r1.type=spoolDir
a1.sources.r1.spoolDir=/home/flumedata/spool1
a1.sources.r1.fileHeader=true
a1.sources.r1.fileHeaderKey=file
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
a1.channels.c1.keep-alive=3
a1.channels.c1.byteCapacityBufferPercentage = 20
a1.channels.c1.byteCapacity = 800000
a1.sinks.s1.type = logger
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1
启动agent:
flume-ng agent -c ./conf -f ./conf/test/spomemlog.conf -n a1 -Dflume.root.lgger=INFO,console
测试:
echo "123" >> /home/flumedata/spool1/a.txt
echo "456" >> /home/flumedata/spool1/b.txt
因为spool读取的是文件,读完之后默认将原文件重命名为xxx.COMPLETED,所以每次添加文件的名称不能相同,否则会卡住
6.4 syslogtcp -->memory -->logger
在conf下创建一个test文件夹,创建sysmemlog.conf进行配置
a1.sources=r1
a1.channels=c1
a1.sinks=s1
a1.sources.r1.type=syslogtcp
a1.sources.r1.port=6666
a1.sources.r1.host=hadoop111
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
a1.channels.c1.keep-alive=3
a1.channels.c1.byteCapacityBufferPercentage = 20
a1.channels.c1.byteCapacity = 800000
a1.sinks.s1.type = logger
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1
启动agent:
flume-ng agent -c ./conf -f ./conf/test/sysmemlog.conf -n a1 -Dflume.root.lgger=INFO,console
测试:
需要先安装nc命令
yum install nc
echo "hello world" | nc hadoop111 6666
6.5 http -->memory -->logger
在conf下创建一个test文件夹,创建httmemlog.conf进行配置
a1.sources=r1
a1.channels=c1
a1.sinks=s1
a1.sources.r1.type=org.apache.flume.source.http.HTTPSource
a1.sources.r1.port=6666
a1.sources.r1.bind=hadoop111
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
a1.channels.c1.keep-alive=3
a1.channels.c1.byteCapacityBufferPercentage = 20
a1.channels.c1.byteCapacity = 800000
a1.sinks.s1.type = logger
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1
启动agent:
flume-ng agent -c ./conf -f ./conf/test/httmemlog.conf -n a1 -Dflume.root.lgger=INFO,console
测试:
curl -X POST -d '[{"headers":{"time":"2008-08-08"},"body":"this is http test"}]' http://hadoop111:6666
//Http Source默认的Hander类型是JSONHandler 所以测试需要传入json格式的数据
6.6 exec -->file -->hdfs
在conf下创建一个test文件夹,创建exefilhdf.conf进行配置
a1.sources=r1
a1.channels=c1
a1.sinks=s1
a1.sources.r1.type=exec
a1.sources.r1.command= tail -f /home/flumedata/exedata
a1.channels.c1.type=file
a1.channels.c1.checkpointDir=/home/flumedata/checkpoint
a1.channels.c1.dataDirs=/home/flumedata/data
a1.sinks.s1.type = hdfs
a1.sinks.s1.hdfs.path = /flume/events/%y-%m-%d/%H%M/%S
a1.sinks.s1.hdfs.filePrefix = zxh-
a1.sinks.s1.hdfs.fileSuffix=.log
a1.sinks.s1.hdfs.inUseSuffix=.tmp
a1.sinks.s1.hdfs.rollInterval=2
a1.sinks.s1.hdfs.rollSize=1024
a1.sinks.s1.hdfs.fileType=DataStream
a1.sinks.s1.hdfs.writeFormat=Text
a1.sinks.s1.hdfs.round = true
a1.sinks.s1.hdfs.roundValue = 1
a1.sinks.s1.hdfs.roundUnit = second
a1.sinks.s1.hdfs.useLocalTimeStamp=true
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1
启动agent:
flume-ng agent -c ./conf -f ./conf/test/exefilhdf.conf -n a1 -Dflume.root.lgger=INFO,console
测试:
echo "123" >> /home/flumedata/exedata
6.7 exec + interceptors -->memory -->hdfs
- 时间戳拦截器
- 静态拦截器
- 主机拦截器
在conf下创建一个test文件夹,创建exeintmemhdf.conf进行配置
a1.sources=r1
a1.channels=c1
a1.sinks=s1
a1.sources.r1.type=exec
a1.sources.r1.command= tail -f /home/flumedata/exedata
a1.sources.r1.interceptors = i1 i2 i3
a1.sources.r1.interceptors.i1.type = timestamp
a1.sources.r1.interceptors.i1.preserveExisting=true
a1.sources.r1.interceptors.i2.type = host
a1.sources.r1.interceptors.i2.hostHeader = hostname
a1.sources.r1.interceptors.i2.preserveExisting=true
a1.sources.r1.interceptors.i3.type = static
a1.sources.r1.interceptors.i3.key = city
a1.sources.r1.interceptors.i3.value = NEW_YORK
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
a1.channels.c1.keep-alive=3
a1.channels.c1.byteCapacityBufferPercentage = 20
a1.channels.c1.byteCapacity = 800000
a1.sinks.s1.type = hdfs
a1.sinks.s1.hdfs.path = /flume/events/%y-%m-%d/%H%M/%S
a1.sinks.s1.hdfs.filePrefix = %{hostname}-
a1.sinks.s1.hdfs.fileSuffix=.log
a1.sinks.s1.hdfs.inUseSuffix=.tmp
a1.sinks.s1.hdfs.rollInterval=2
a1.sinks.s1.hdfs.rollSize=1024
a1.sinks.s1.hdfs.fileType=DataStream
a1.sinks.s1.hdfs.writeFormat=Text
a1.sinks.s1.hdfs.round = true
a1.sinks.s1.hdfs.roundValue = 1
a1.sinks.s1.hdfs.roundUnit = second
a1.sinks.s1.hdfs.useLocalTimeStamp=true
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1
启动agent:
flume-ng agent -c ./conf -f ./conf/test/exeintmemhdf.conf -n a1 -Dflume.root.lgger=INFO,console
测试:
echo "123" >> /home/flumedata/exedata
6.8 exec + interceptors -->memory -->logger
- 正则拦截器
在conf下创建一个test文件夹,创建exeint2memlog.conf进行配置
a1.sources=r1
a1.channels=c1
a1.sinks=s1
a1.sources.r1.type=exec
a1.sources.r1.command= tail -f /home/flumedata/exedata
a1.sources.r1.interceptors = i1
a1.sources.r1.interceptors.i1.type = regex_filter
#定义正则,以数字开头
a1.sources.r1.interceptors.i1.regex=^[0-9].*$
a1.sources.r1.interceptors.i1.excludeEvents=false
#false匹配正则
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
a1.channels.c1.keep-alive=3
a1.channels.c1.byteCapacityBufferPercentage = 20
a1.channels.c1.byteCapacity = 800000
a1.sinks.s1.type = logger
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1
启动agent:
flume-ng agent -c ./conf -f ./conf/test/exeint2memlog.conf -n a1 -Dflume.root.lgger=INFO,console
测试:
- 数字开头:
echo "123" >> /home/flumedata/exedata
日志打印 可以被收集
- 非数字开头:
echo "abc123" >> /home/flumedata/exedata
日志不打印 不收集
6.9 exec +selector–>memory -->hdfs
- 复制选择器
在conf下创建一个test文件夹,创建exeselmemhdf.conf进行配置
a1.sources=r1
a1.channels=c1 c2
a1.sinks=s1 s2
a1.sources.r1.type=exec
a1.sources.r1.command= tail -f /home/flumedata/exedata
a1.sources.r1.selector.type = replicating
a1.sources.r1.selector.optional = c2
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
a1.channels.c1.keep-alive=3
a1.channels.c1.byteCapacityBufferPercentage = 20
a1.channels.c1.byteCapacity = 800000
a1.channels.c2.type=memory
a1.channels.c2.capacity=1000
a1.channels.c2.transactionCapacity=100
a1.channels.c2.keep-alive=3
a1.channels.c2.byteCapacityBufferPercentage = 20
a1.channels.c2.byteCapacity = 800000
a1.sinks.s1.type = logger
a1.sinks.s2.type = hdfs
a1.sinks.s2.hdfs.path = /flume/events/%y-%m-%d/%H%M/%S
a1.sinks.s2.hdfs.filePrefix = event-
a1.sinks.s2.hdfs.fileSuffix=.log
a1.sinks.s2.hdfs.inUseSuffix=.tmp
a1.sinks.s2.hdfs.rollInterval=2
a1.sinks.s2.hdfs.rollSize=1024
a1.sinks.s2.hdfs.fileType=DataStream
a1.sinks.s2.hdfs.writeFormat=Text
a1.sinks.s2.hdfs.round = true
a1.sinks.s2.hdfs.roundValue = 1
a1.sinks.s2.hdfs.roundUnit = second
a1.sinks.s2.hdfs.useLocalTimeStamp=true
a1.sources.r1.channels=c1 c2
a1.sinks.s1.channel=c1
a1.sinks.s2.channel=c2
启动agent:
flume-ng agent -c ./conf -f ./conf/test/exeselmemhdf.conf -n a1 -Dflume.root.lgger=INFO,console
测试:
echo "123456" >> /home/flumedata/exedata
6.10 exec+selector -->memory -->hdfs
- 复用选择器
在conf下创建一个test文件夹,创建httselmemhdf.conf进行配置
a1.sources=r1
a1.channels=c1 c2
a1.sinks=s1 s2
a1.sources.r1.type=http
a1.sources.r1.port=6666
a1.sources.r1.bind=hadoop111
a1.sources.r1.selector.type = multiplexing
a1.sources.r1.selector.header = status
a1.sources.r1.selector.mapping.CZ = c1
a1.sources.r1.selector.mapping.US = c2
a1.sources.r1.selector.default = c1
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
a1.channels.c1.keep-alive=3
a1.channels.c1.byteCapacityBufferPercentage = 20
a1.channels.c1.byteCapacity = 800000
a1.channels.c2.type=memory
a1.channels.c2.capacity=1000
a1.channels.c2.transactionCapacity=100
a1.channels.c2.keep-alive=3
a1.channels.c2.byteCapacityBufferPercentage = 20
a1.channels.c2.byteCapacity = 800000
a1.sinks.s1.type = logger
a1.sinks.s2.type = hdfs
a1.sinks.s2.hdfs.path = /flume/events/%y-%m-%d/%H%M/%S
a1.sinks.s2.hdfs.filePrefix = zxh
a1.sinks.s2.hdfs.fileSuffix=.log
a1.sinks.s2.hdfs.inUseSuffix=.tmp
a1.sinks.s2.hdfs.rollInterval=2
a1.sinks.s2.hdfs.rollSize=1024
a1.sinks.s2.hdfs.fileType=DataStream
a1.sinks.s2.hdfs.writeFormat=Text
a1.sinks.s2.hdfs.round = true
a1.sinks.s2.hdfs.roundValue = 1
a1.sinks.s2.hdfs.roundUnit = second
a1.sinks.s2.hdfs.useLocalTimeStamp=true
a1.sources.r1.channels=c1 c2
a1.sinks.s1.channel=c1
a1.sinks.s2.channel=c2
启动agent:
flume-ng agent -c ./conf -f ./conf/test/httselmemhdf.conf -n a1 -Dflume.root.lgger=INFO,console
测试:
curl -X POST -d '[{"headers":{"status":"2017-06-13"},"body":"this is default"}]' http://hadoop111:6666
curl -X POST -d '[{"headers":{"status":"CZ"},"body":"this is CZ"}]' http://hadoop111:6666
curl -X POST -d '[{"headers":{"status":"US"},"body":"this is US"}]' http://hadoop111:6666
curl -X POST -d '[{"headers":{"status":"ss"},"body":"this is ss"}]' http://hadoop111:6666
6.11 netcat–>memory–>kafka
在conf下创建kafka.conf进行如下配置
a1.sources=r1
a1.sinks=k1
a1.channels=c1
#用于描述source的,类型是netcat网络,telnet
a1.sources.r1.type=netcat
#source监听的网络ip地址和端口号
a1.sources.r1.bind=hadoop111
a1.sources.r1.port=44444
#用于描述channel,在内存中做数据的临时的存储
a1.channels.c1.type=memory
#该内存中最大的存储容量,1000个events事件
a1.channels.c1.capacity=1000
#能够同时对100个events事件监管事务
a1.channels.c1.transactionCapacity=100
#用于描述sink,类型是日志格式,用于定制消息发布方的参数
a1.sinks.k1.type=org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.topic=spark
a1.sinks.k1.brokerList=hadoop111:9092
a1.sinks.k1.requiredAcks=1
a1.sinks.k1.batchSize=20
#将a1中的各个组件建立关联关系,将source和sink都指向了同一个channel
a1.sources.r1.channels=c1
a1.sinks.k1.channel=c1
启动agent:
flume-ng agent -c ./conf -f ./conf/kafka.conf -n a1
kafka实时消费:
kafka-console-consumer.sh --topic spark --bootstrap-server hadoop111:9092 --from-beginning
开启44444端口,并传输数据
nc -lk hadoop111 44444
输入数据,观察kafka-consumer
nihao
hello
6.11 flume集群搭建
- 原理
通过用avro sink配置一些一级代理,可以在Flume中实现这一点,它们都指向一个代理的avro源(同样,您可以在这样的场景中使用节约来源/ sink /客户机)。第二层代理的这个源将被接收的事件合并到一个单独的通道中,它被一个接收器消耗到它的最终目的地。
- 此处我用伪分布式举例
配置第一个agent
在conf下创建一个test文件夹,创建agent1.conf进行配置
a1.sources=r1
a1.channels=c1
a1.sinks=s1
a1.sources.r1.type=netcat
a1.sources.r1.port=6666
a1.sources.r1.bind=hadoop111
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
a1.channels.c1.keep-alive=3
a1.channels.c1.byteCapacityBufferPercentage = 20
a1.channels.c1.byteCapacity = 800000
a1.sinks.s1.type =avro
a1.sinks.s1.hostname=hadoop111
a1.sinks.s1.port=8888
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1
配置第二个agent
在conf下创建一个test文件夹,创建agent2.conf进行配置
a1.sources=r1
a1.channels=c1
a1.sinks=s1
a1.sources.r1.type=netcat
a1.sources.r1.port=6667
a1.sources.r1.bind=hadoop111
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
a1.channels.c1.keep-alive=3
a1.channels.c1.byteCapacityBufferPercentage = 20
a1.channels.c1.byteCapacity = 800000
a1.sinks.s1.type =avro
a1.sinks.s1.hostname=hadoop111
a1.sinks.s1.port=8888
a1.sources.r1.channels=c1
a1.sinks.s1.channel=c1
配置第三个agent
在conf下创建一个test文件夹,创建agent3.conf进行配置
agent.sources=r1
agent.channels=c1
agent.sinks=s1
agent.sources.r1.type=avro
agent.sources.r1.port=8888
agent.sources.r1.bind=hadoop111
agent.channels.c1.type=memory
agent.channels.c1.capacity=1000
agent.channels.c1.transactionCapacity=100
agent.channels.c1.keep-alive=3
agent.channels.c1.byteCapacityBufferPercentage = 20
agent.channels.c1.byteCapacity = 800000
agent.sinks.s1.type =logger
agent.sources.r1.channels=c1
agent.sinks.s1.channel=c1
agent1,agent2接收的数据都会发送给8888端口,由8888端口去处理
启动agent:
1.先启动avro resource所在的端口
flume-ng agent -c ./conf -f ./conf/test/agent3.conf -n a1 -Dflume.root.lgger=INFO,console
2.再启动两个avro sink所在的端口
flume-ng agent -c ./conf -f ./conf/test/agent1.conf -n a1 -Dflume.root.lgger=INFO,console
flume-ng agent -c ./conf -f ./conf/test/agent2.conf -n a1 -Dflume.root.lgger=INFO,console
测试1:
echo "hello world" | nc hadoop111 6666
测试2:
echo "hello world2" | nc hadoop111 6667