1. 程式人生 > >Flume.apache.org 官方文件學習筆記 part two

Flume.apache.org 官方文件學習筆記 part two

   配置個體元件:

      當你定義了這個流之後,你需要去設定每個資源、接收器、通道的屬性。這是在你設定元件型別和每個元件的特定屬性值的同一層名稱空間內完成的。

# 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知道它需要成為哪一種物件。 每個源(source)、接收器、通道、都有它自己的所需要的一系列屬效能讓他如期執行,所有這些都需要被設定為需要的。在前面的例項中,我們有一個流通過記憶體通道mem-channel-1,從avro-AppSrv-source到hdfs-Cluster1-sink.這裡有一個例子展示了每個元件的配置:

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客戶端到外部的hdfs,另一個從尾部輸出到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代理向下一個流代理轉發事件,比如:如果你定期使用avro客戶端傳送檔案到一個本地流代理,那麼這個代理就能轉發檔案到已安裝儲存的另一個代理。

        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上。

    扇出流量:         就如前一節所述,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 源 和兩個連線到兩個接收器的通道:

        #列出代理中的源,接收器和通道         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源         代理的 通道agent_foo.sources.avro-AppSrv-source1.channels =  mem-channel-1 file-channel-2 

        #為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”,那麼兩個地方都會送到,如果“State”頭部沒有設定或者沒有匹配到這裡的任何一個值,那麼它會到被設定為預設的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

        這個選擇器也支援可選通道。 為頭部指定可選通道,配置引數 ‘optional’ 用下面的方法來使用:

            # 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 被當做是所需通道,即使他被標記為同為所需通道和可選通道,寫入這個通道的失敗會造成事件重新嘗試去傳送所有被配置給選擇器的通道。

          注意一下,如果一個頭部沒有任何的需求通道,然後這些事件就會被寫入到預設通道,還會被寫入到為這個報頭準備的可選通道。如果沒有指定需求通道,指定可選通道會持續造成這個事件寫入到預設通道。如果沒有通道被指定為預設通道而且也沒有指定需求通道,那麼這個選擇器就會嘗試去寫入這個事件到可選通道。  每個失敗都會被忽略。