Flume配置中文版
以下内容翻译自官网,官网地址:
http://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html
目前只翻译一个开头,由于文档太长, 以后一点一点完善。
简介:
Flume是一个分布式的、可靠的、可用的系统,用于高效地收集、聚合和将大量来自不同来源的日志数据移动到一个集中的数据存储区。
Flume的使用不仅限于日志数据聚合。由于数据源是可定制的,Flume可用于传输大量事件数据,包括但不限于网络流量数据、社交媒体生成的数据、电子邮件和几乎所有可能的数据源。
Flume是Apache软件基金会的顶级项目。
系统要求
1.Java运行时环境——Java 1.8或更高版本
2.内存-用于源、通道或接收器配置的足够内存
3.磁盘空间-用于通道或接收器配置的足够磁盘空间
4.目录权限-代理使用的目录的读/写权限
架构
1.数据流模型
Flume事件定义为具有字节负载和可选字符串属性集的数据流单元。Flume代理是一个(JVM)进程,它承载组件,通过组件事件从外部源流到下一个目标(跃点)。

Flume源使用外部源(如Web服务器)传递给它的事件。外部源以目标Flume源识别的格式向Flume发送事件。例如,可以使用avro flume源从avro客户端接收avro事件,或者在从avro接收器发送事件的流中接收其他flume代理。类似的流可以定义为使用Thrift Flume源接收来自Thrift接收器或Flume Thrift RPC客户端的事件,或使用由Flume Thrift协议生成的任何语言编写的Thrift客户端的事件。当Flume源接收到事件时,它将其存储到一个或多个通道中。通道是一个被动存储,它将事件保持到被水槽水槽消耗为止。文件通道就是一个例子——它由本地文件系统支持。接收器将事件从通道中移除,并将其放入外部存储库,如HDFS(通过Flume HDFS接收器),或将其转发到流中下一个Flume代理(下一个跃点)的Flume源。给定代理内的源和接收器以异步方式运行,事件在通道中分段。
复合流
Flume允许用户在事件到达最终目的地之前通过多个代理来构建多跳流。它还允许fan-in和fan-out流、上下文路由和备份路由(fail-over),用于失败的跃点。
可靠
事件在每个代理上的一个通道中进行分段。然后,事件被传递到流中的下一个代理或终端存储库(如HDFS)。只有将事件存储在下一个代理的通道或终端存储库中之后,才会从通道中删除这些事件。这就是Flume中的单跳消息传递语义如何提供流的端到端可靠性。
Flume使用事务性方法来确保事件的可靠交付。源和接收器分别封装在事务中通道提供的事务中放置或提供的事件的存储/检索。这样可以确保事件集在流中可靠地从一点传递到另一点。在多跳流的情况下,前一个跳的接收器和下一个跳的源都会运行它们的事务,以确保数据安全地存储在下一个跳的通道中。
可恢复性
事件在通道中分段,该通道管理故障恢复。Flume支持由本地文件系统支持的持久文件通道。还有一个内存通道,它只将事件存储在内存中的队列中,速度更快,但是当代理进程死亡时仍留在内存通道中的任何事件都无法恢复。
配置
配置一个agent(代理)
Flume代理配置存储在本地配置文件中。这是遵循Java属性文件格式的文本文件。可以在同一配置文件中指定一个或多个代理的配置。配置文件包括代理中每个源、接收器和通道的属性,以及它们如何连接在一起以形成数据流。
配置单个组建
流中的每个组件(源、接收器或通道)都有一个名称、类型和一组特定于类型和实例化的属性。例如,avro源需要主机名(或IP地址)和端口号来接收数据。内存通道可以具有最大队列大小(“容量”),HDFS接收器需要知道文件系统URI、创建文件的路径、文件旋转频率(“hdfs.rollInterval”)等。组件的所有此类属性都需要在托管Flume代理的属性文件中设置。
把这些组件连接在一起
代理需要知道要加载的各个组件以及它们是如何连接的,以便构成流。这可以通过列出代理中每个源、接收器和通道的名称来完成,然后为每个接收器和源指定连接通道。例如,代理通过名为文件通道的文件通道将事件从名为avroweb的avro源流到hdfs接收器hdfs-cluster1。配置文件将包含这些组件的名称以及作为avroweb源和hdfs-cluster1接收器共享通道的文件通道。
启动一个代理
代理程序使用名为flume ng的shell脚本启动,该脚本位于flume分发的bin目录中。您需要在命令行上指定代理名称、配置目录和配置文件:
$ bin/flume-ng agent -n $agent_name -c conf -f conf/flume-conf.properties.template
现在,代理将开始运行在给定属性文件中配置的源和接收器。
一个简单例子
这里,我们给出一个配置文件示例,描述一个单节点Flume部署。此配置允许用户生成事件,然后将其记录到控制台。
# example.conf: A single-node Flume configuration
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
# Describe the sink
a1.sinks.k1.type = logger
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
此配置定义名为A1的单个代理。A1有一个监听端口44444上数据的源、一个缓冲内存中事件数据的通道和一个将事件数据记录到控制台的接收器。配置文件命名各种组件,然后描述它们的类型和配置参数。给定的配置文件可能定义几个命名代理;当启动给定的Flume进程时,会传递一个标志,告诉它要显式哪个命名代理。
根据这个配置文件,我们可以如下启动Flume:
$ bin/flume-ng agent --conf conf --conf-file example.conf --name a1 -Dflume.root.logger=INFO,console
注意,在完整的部署中,我们通常还包括一个选项:--conf=<conf dir>。<conf dir>目录将包括一个shell脚本flume-env.sh和一个log4j属性文件。在这个例子中,我们通过Java选项强制水槽登录到控制台,我们没有自定义环境脚本。
从一个单独的终端,我们可以通过telnet端口44444向Flume发送一个事件:
$ telnet localhost 44444
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
Hello world! <ENTER>
OK
原始的Flume终端将在日志消息中输出事件。
12/06/19 15:32:19 INFO source.NetcatSource: Source starting
12/06/19 15:32:19 INFO source.NetcatSource: Created serverSocket:sun.nio.ch.ServerSocketChannelImpl[/127.0.0.1:44444]
12/06/19 15:32:34 INFO sink.LoggerSink: Event: { headers:{} body: 48 65 6C 6C 6F 20 77 6F 72 6C 64 21 0D Hello world!. }
祝贺您-您已成功配置和部署了Flume代理!后面的部分将更详细地介绍代理配置。
配置文件中使用环境变量
Flume能够在配置中替换环境变量。例如:
a1.sources = r1
a1.sources.r1.type = netcat
a1.sources.r1.bind = 0.0.0.0
a1.sources.r1.port = ${NC_PORT}
a1.sources.r1.channels = c1
注意:它目前只适用于值,不适用于键。(即仅在配置行的=标记的“右侧”上。)
这可以通过代理属性调用的Java系统属性通过设置属性实现= Or.ApAC.FLUME.NODE.EnvRealValueFrices来实现。
例如:
$nc_port=44444 bin/flume ng agent–conf conf–conf file example.conf–name a1-dflume.root.logger=info,console-dpropertiesimplementation=org.apache.flume.node.envvarresolverproperties
注意上面只是一个例子,环境变量可以用其他方式配置,包括在conf/flume-env.sh中设置。
记录原始数据
在许多生产环境中,记录流经摄取管道的原始数据流不是理想的行为,因为这可能导致敏感数据或安全相关配置(如密钥)泄漏到Flume日志文件。默认情况下,Flume不会记录此类信息。另一方面,如果数据管道中断,Flume将尝试为调试问题提供线索。
调试事件管道问题的一种方法是设置一个额外的内存通道,连接到一个记录器接收器,该接收器将把所有事件数据输出到Flume日志。然而,在某些情况下,这种方法是不够的。
为了启用事件和配置相关数据的日志记录,除了Log4J属性之外,还必须设置一些Java系统属性。
若要启用与配置相关的日志记录,请设置Java系统属性-dog.Apache .FLUM.Log.PrrtCnFig=Tress。这可以在命令行上传递,也可以在flume-env.sh中的java opts变量中设置。
为了启用数据日志记录,以上面描述的相同方式设置Java系统属性-DOG.APACHEC.FLUCE.LOG.RAWDATABASE=真。对于大多数组件,log4j日志级别还必须设置为debug或trace,以使特定于事件的日志显示在Flume日志中。
下面是启用配置日志记录和原始数据日志记录的示例,同时将log4j loglevel设置为调试控制台输出:
$ bin/flume-ng agent --conf conf --conf-file example.conf --name a1 -Dflume.root.logger=DEBUG,console -Dorg.apache.flume.log.printconfig=true -Dorg.apache.flume.log.rawdata=true
zookeeper基本配置
Flume通过ZooKeeper支持代理配置。这是一个实验特性。配置文件需要以可配置的前缀上传到ZooKeeper中。配置文件存储在ZooKeeper节点数据中。下面是ZooKeeper节点树对于代理A1和A2的外观
- /flume
|- /a1 [Agent config file]
|- /a2 [Agent config file]
上传配置文件后,使用以下选项启动代理
$ bin/flume-ng agent –conf conf -z zkhost:2181,zkhost1:2181 -p /flume –name a1 -Dflume.root.logger=INFO,console
安装第三方插件
Flume有一个完全基于插件的体系结构。虽然Flume附带了许多现成的源、通道、接收器、序列化程序等,但存在许多与Flume分开提供的实现。
虽然始终可以通过在flume-env.sh文件中的flume_classpath变量中添加jar来包含自定义flume组件,但是flume现在支持一个名为plugins.d的特殊目录,该目录自动挑选以特定格式打包的插件。这样可以更容易地管理插件打包问题,以及更简单地调试和排除几个问题类,特别是库依赖关系冲突。
这个 plugins.d 目录位于 $FLUME_HOME/plugins.d. 在启动的时候, flume启动脚本会从plugin.d目录中寻找符合插件格式的插件加载。
插件目录布局
plugins.d中的每个插件(子目录)最多可以有三个子目录:
1.lib - the plugin’s jar(s)
2.libext - the plugin’s dependency jar(s)
3.native - any required native libraries, such as .so files
如下两个例子:
plugins.d/
plugins.d/custom-source-1/
plugins.d/custom-source-1/lib/my-source.jar
plugins.d/custom-source-1/libext/spring-core-2.5.6.jar
plugins.d/custom-source-2/
plugins.d/custom-source-2/lib/custom.jar
plugins.d/custom-source-2/native/gettext.so
数据抽取
Flume支持许多从外部源接收数据的机制。
1.RPC: Flume发行版中包含的avro客户端可以使用avro-rpc机制将给定文件发送到Flume avro源:
2.Executing commands:
有一个exec 源执行一个给定的命令并使用输出。输出的单个“行”,即文本后跟回车符(“\r”)或换行符(“\n”)或两者同时出现。
3.Network streams:
Flume支持以下机制,从流行的日志流类型读取数据,例如
1)Avro
2)Thrift
3)Syslog
4)Netcat
配置多代理流

为了跨多个代理或跃点传输数据,前一个代理的接收器和当前跃点的源必须是AVRO类型,接收器指向源的主机名(或IP地址)和端口。
空
日志收集中的一个非常常见的场景是大量的日志生成客户机向连接到存储子系统的几个客户机发送数据。例如,从数百个Web服务器收集的日志被发送到十几个写入HDFS集群的代理。

这可以在Flume中通过使用avro接收器配置多个第一层代理来实现,所有这些代理都指向单个代理的avro源(同样,在这种情况下,您可以使用节俭的源/接收器/客户机)。第二层代理上的此源将接收到的事件合并到一个通道中,该通道由接收器消耗到其最终目标。
多路传输流
Flume支持将事件流多路传输到一个或多个目的地。这是通过定义一个流多路复用器来实现的,该复用器可以复制或选择性地将事件路由到一个或多个通道。

上面的示例显示了代理“foo”的一个源,它将流分散到三个不同的通道中。这种扇出可以是复制的,也可以是多路复用的。在复制流的情况下,每个事件都发送到所有三个通道。对于多路复用情况,当事件的属性与预先配置的值匹配时,事件被传递到可用通道的子集。例如,如果一个名为“txtype”的事件属性设置为“customer”,那么它应该转到channel1和channel3;如果它是“vendor”,那么它应该转到channel2,否则应该转到channel3。可以在代理的配置文件中设置映射。
详细配置
如前面的部分所述,水槽代理配置是从类似于具有分层属性设置的Java属性文件格式的文件中读取的。
定义流
要在单个代理中定义流,需要通过通道链接源和汇。您需要列出给定代理的源、接收器和通道,然后将源和接收器指向通道。源实例可以指定多个通道,但接收器实例只能指定一个通道。格式如下:
# list the sources, sinks and channels for the agent
<Agent>.sources = <Source>
<Agent>.sinks = <Sink>
<Agent>.channels = <Channel1> <Channel2>
# set channel for source
<Agent>.sources.<Source>.channels = <Channel1> <Channel2> ...
# set channel for sink
<Agent>.sinks.<Sink>.channel = <Channel1>
例如,一个名为agent_foo的代理正在从外部avro客户机读取数据,并通过内存通道将其发送到hdfs。配置文件weblog.config可能如下所示:
# list the sources, sinks and channels for the agent
agent_foo.sources = avro-appserver-src-1
agent_foo.sinks = hdfs-sink-1
agent_foo.channels = mem-channel-1
# set channel for source
agent_foo.sources.avro-appserver-src-1.channels = mem-channel-1
# set channel for sink
agent_foo.sinks.hdfs-sink-1.channel = mem-channel-1
这将使事件通过内存通道mem-channel-1 从avro-appsrv-source流到hdfs-cluster1-sink。当以weblog.config作为其配置文件启动代理时,它将实例化该流。
配置单个组件
定义流之后,需要设置每个源、接收器和通道的属性。这是以相同的分层命名空间方式完成的,您可以在其中为每个组件的特定属性设置组件类型和其他值:
# properties for sources
<Agent>.sources.<Source>.<someProperty> = <someValue>
# properties for channels
<Agent>.channel.<Channel>.<someProperty> = <someValue>
# properties for sinks
<Agent>.sources.<Sink>.<someProperty> = <someValue>
需要为每个组件设置属性“type”,以便Flume了解它需要成为什么类型的对象。每个源、接收器和通道类型都有其自己的一组属性,这些属性是使其按预期工作所必需的。所有这些都需要根据需要进行设置。在前面的例子中,我们有一个从avro-appsrv-source到hdfs-cluster1-sink的流,它通过内存通道mem-channel-1。下面是一个例子,展示了这些组件的配置:
agent_foo.sources = avro-AppSrv-source
agent_foo.sinks = hdfs-Cluster1-sink
agent_foo.channels = mem-channel-1
# set channel for sources, sinks
# properties of avro-AppSrv-source
agent_foo.sources.avro-AppSrv-source.type = avro
agent_foo.sources.avro-AppSrv-source.bind = localhost
agent_foo.sources.avro-AppSrv-source.port = 10000
# properties of mem-channel-1
agent_foo.channels.mem-channel-1.type = memory
agent_foo.channels.mem-channel-1.capacity = 1000
agent_foo.channels.mem-channel-1.transactionCapacity = 100
# properties of hdfs-Cluster1-sink
agent_foo.sinks.hdfs-Cluster1-sink.type = hdfs
agent_foo.sinks.hdfs-Cluster1-sink.hdfs.path = hdfs://namenode/flume/webdata
#...
在代理中添加多个流
一个Flume代理可以包含几个独立的流。您可以在配置中列出多个源、接收器和通道。这些组件可以链接成多个流:
# list the sources, sinks and channels for the agent
<Agent>.sources = <Source1> <Source2>
<Agent>.sinks = <Sink1> <Sink2>
<Agent>.channels = <Channel1> <Channel2>
然后,您可以将源和接收器链接到它们对应的通道(对于源)的通道(对于接收器),以设置两个不同的流。例如,如果您需要在一个代理中设置两个流,一个流从外部avro客户机到外部hdf,另一个流从尾部输出到avro接收器,那么下面是一个配置:
# list the sources, sinks and channels in the agent
agent_foo.sources = avro-AppSrv-source1 exec-tail-source2
agent_foo.sinks = hdfs-Cluster1-sink1 avro-forward-sink2
agent_foo.channels = mem-channel-1 file-channel-2
# flow #1 configuration
agent_foo.sources.avro-AppSrv-source1.channels = mem-channel-1
agent_foo.sinks.hdfs-Cluster1-sink1.channel = mem-channel-1
# flow #2 configuration
agent_foo.sources.exec-tail-source2.channels = file-channel-2
agent_foo.sinks.avro-forward-sink2.channel = file-channel-2
配置多代理流
要设置多层流,需要让第一个跃点的avro/thrift接收器指向下一个跃点的avro/thrift源。这将导致第一个Flume代理将事件转发到下一个Flume代理。例如,如果使用avro客户机定期将文件(每个事件1个文件)发送到本地Flume代理,则此本地代理可以将其转发到另一个已装载用于存储的代理。
weblog代理配置:
# list sources, sinks and channels in the agent
agent_foo.sources = avro-AppSrv-source
agent_foo.sinks = avro-forward-sink
agent_foo.channels = file-channel
# define the flow
agent_foo.sources.avro-AppSrv-source.channels = file-channel
agent_foo.sinks.avro-forward-sink.channel = file-channel
# avro sink properties
agent_foo.sinks.avro-forward-sink.type = avro
agent_foo.sinks.avro-forward-sink.hostname = 10.1.1.100
agent_foo.sinks.avro-forward-sink.port = 10000
# configure other pieces
#...
HDFS 代理配置:
# list sources, sinks and channels in the agent
agent_foo.sources = avro-collection-source
agent_foo.sinks = hdfs-sink
agent_foo.channels = mem-channel
# define the flow
agent_foo.sources.avro-collection-source.channels = mem-channel
agent_foo.sinks.hdfs-sink.channel = mem-channel
# avro source properties
agent_foo.sources.avro-collection-source.type = avro
agent_foo.sources.avro-collection-source.bind = 10.1.1.100
agent_foo.sources.avro-collection-source.port = 10000
# configure other pieces
#...
在这里,我们将avro-forward-sink从weblog代理链接到hdfs代理的avro-collection-source。这将导致来自外部AppServer源的事件最终存储在HDFS中。
Fan out flow (扇出:将一个源(source)将数据发送到多个地方(sink))
如前一节所讨论的,Flume支持将流从一个源分散到多个通道。扇出有两种模式,复制和多路复用。在复制流中,事件被发送到所有配置的通道。在多路复用的情况下,事件只发送到限定信道的一个子集。要展开流,需要指定源的通道列表和展开流的策略。这是通过添加一个可以复制或多路复用的通道“选择器”来完成的。如果是多路复用器,则进一步指定选择规则。如果不指定选择器,则默认情况下它正在复制:
# List the sources, sinks and channels for the agent
<Agent>.sources = <Source1>
<Agent>.sinks = <Sink1> <Sink2>
<Agent>.channels = <Channel1> <Channel2>
# set list of channels for source (separated by space)
<Agent>.sources.<Source1>.channels = <Channel1> <Channel2>
# set channel for sinks
<Agent>.sinks.<Sink1>.channel = <Channel1>
<Agent>.sinks.<Sink2>.channel = <Channel2>
<Agent>.sources.<Source1>.selector.type = replicating
多路选择还有一组属性来分叉流。这需要指定事件属性到通道集的映射。选择器检查事件头中的每个已配置属性。如果它与指定的值匹配,那么该事件将发送到映射到该值的所有通道。如果没有匹配,则将事件发送到配置为默认的一组通道:
# Mapping for multiplexing selector
<Agent>.sources.<Source1>.selector.type = multiplexing
<Agent>.sources.<Source1>.selector.header = <someHeader>
<Agent>.sources.<Source1>.selector.mapping.<Value1> = <Channel1>
<Agent>.sources.<Source1>.selector.mapping.<Value2> = <Channel1> <Channel2>
<Agent>.sources.<Source1>.selector.mapping.<Value3> = <Channel2>
#...
<Agent>.sources.<Source1>.selector.default = <Channel2>
映射允许为每个值重叠通道。
下面的示例具有一个多路复用到两条路径的单流。名为agent_foo的代理有一个AVRO源和两个连接到两个水槽的通道:
# list the sources, sinks and channels in the agent
agent_foo.sources = avro-AppSrv-source1
agent_foo.sinks = hdfs-Cluster1-sink1 avro-forward-sink2
agent_foo.channels = mem-channel-1 file-channel-2
# set channels for source
agent_foo.sources.avro-AppSrv-source1.channels = mem-channel-1 file-channel-2
# set channel for sinks
agent_foo.sinks.hdfs-Cluster1-sink1.channel = mem-channel-1
agent_foo.sinks.avro-forward-sink2.channel = file-channel-2
# channel selector configuration
agent_foo.sources.avro-AppSrv-source1.selector.type = multiplexing
agent_foo.sources.avro-AppSrv-source1.selector.header = State
agent_foo.sources.avro-AppSrv-source1.selector.mapping.CA = mem-channel-1
agent_foo.sources.avro-AppSrv-source1.selector.mapping.AZ = file-channel-2
agent_foo.sources.avro-AppSrv-source1.selector.mapping.NY = mem-channel-1 file-channel-2
agent_foo.sources.avro-AppSrv-source1.selector.default = mem-channel-1
选择器检查名为“state”的头。如果值为“ca”,则发送到mem-channel-1;如果值为“az”,则发送到file-channel-2;如果值为“ny”,则发送到file-channel-2。如果“状态”头段未设置或与这三个头段中的任何一个不匹配,则它将转到MEM-CHANNEL-1,该MEM-CHANNEL-1被指定为“默认”。
选择器还支持可选通道。要为头指定可选通道,配置参数“可选”的使用方式如下:
# channel selector configuration
agent_foo.sources.avro-AppSrv-source1.selector.type = multiplexing
agent_foo.sources.avro-AppSrv-source1.selector.header = State
agent_foo.sources.avro-AppSrv-source1.selector.mapping.CA = mem-channel-1
agent_foo.sources.avro-AppSrv-source1.selector.mapping.AZ = file-channel-2
agent_foo.sources.avro-AppSrv-source1.selector.mapping.NY = mem-channel-1 file-channel-2
agent_foo.sources.avro-AppSrv-source1.selector.optional.CA = mem-channel-1 file-channel-2
agent_foo.sources.avro-AppSrv-source1.selector.mapping.AZ = file-channel-2
agent_foo.sources.avro-AppSrv-source1.selector.default = mem-channel-1
选择器将尝试先写入所需的通道,如果这些通道中的任何一个都无法使用事件,则事务将失败。在所有通道上重新尝试事务。一旦所有必需的通道都使用了事件,那么选择器将尝试写入可选通道。任何可选通道使用事件失败都将被忽略,而不会重试。
如果可选通道和特定头段所需通道之间存在重叠,则认为通道是必需的,通道中的故障将导致重试整个所需通道集。例如,在上面的示例中,头“ca”mem-channel-1被认为是一个必需的通道,即使它被标记为必需和可选,并且写入此通道失败将导致在为选择器配置的所有通道上重试该事件。
请注意,如果头没有任何必需的通道,则事件将写入默认通道,并尝试写入该头的可选通道。如果没有指定所需的通道,指定可选通道仍将导致事件写入默认通道。如果没有通道被指定为默认通道且不需要,则选择器将尝试将事件写入可选通道。在这种情况下,任何故障都会被忽略。
SSL/TLS support
几个Flume组件支持SSL/TLS协议,以便与其他系统安全通信。
Component SSL server or client
Avro Source server
Avro Sink client
Thrift Source server
Thrift Sink client
Kafka Source client
Kafka Channel client
Kafka Sink client
HTTP Source server
JMS Source client
Syslog TCP Source server
Multiport Syslog TCP Source server
与ssl兼容的组件有几个配置参数来设置ssl,例如启用ssl标志、密钥库/信任库参数(位置、密码、类型)和其他ssl参数(例如禁用的协议)。
始终在代理配置文件的组件级别指定为组件启用SSL。因此,某些组件可能被配置为使用SSL,而其他组件(即使具有相同的组件类型)。
可以在组件级别或全局指定密钥库/信任库设置。
在组件级设置的情况下,通过特定于组件的参数在代理配置文件中配置密钥库/信任库。这种方法的优点是组件可以使用不同的键库(如果需要的话)。缺点是必须为代理配置文件中的每个组件复制密钥库参数。组件级设置是可选的,但是如果定义了它,它的优先级高于全局参数。
使用全局设置,只需定义一次keystore/truststore参数,并对所有组件使用相同的设置就足够了,这意味着配置越来越集中。
全局设置可以通过系统属性或环境变量进行配置。

ssl系统属性可以在命令行上传递,也可以通过在conf/flume-env.sh中设置java opts环境变量来传递。(不过,使用命令行是不可取的,因为包含密码的命令将保存到命令历史记录中。)
export JAVA_OPTS="$JAVA_OPTS -Djavax.net.ssl.keyStore=/path/to/keystore.jks"
export JAVA_OPTS="$JAVA_OPTS -Djavax.net.ssl.keyStorePassword=password"
Flume使用JSSE(Java安全套接字扩展)中定义的系统属性,因此这是建立SSL的标准方式。另一方面,在系统属性中指定密码意味着可以在进程列表中看到密码。对于不可接受的情况,也可以在环境变量中定义参数。在这种情况下,Flume在内部从相应的环境变量初始化JSSE系统属性。
ssl环境变量可以在启动flume之前在shell环境中设置,也可以在conf/flume-env.sh中设置。(不过,使用命令行是不可取的,因为包含密码的命令将保存到命令历史记录中。)
export FLUME_SSL_KEYSTORE_PATH=/path/to/keystore.jks
export FLUME_SSL_KEYSTORE_PASSWORD=password
注意:
1.必须在组件级别启用SSL。单独指定全局SSL参数不会有任何效果。
2.如果在多个级别上指定了全局SSL参数,则优先级如下(从高到低):
1)代理配置中的组件参数
2)系统属性
3)环境变量
3.如果为组件启用了ssl,但没有以上述任何方式指定ssl参数,则