hadoop離線分析(簡單版)-Flume

目錄

 

Flume概述

應用場景

Flume優勢

Flume架構

Flume與Kafka對比

Flume+Kafka雙劍合璧構建大數據平臺日誌採集

Flume安裝配置


Flume概述

flume是由cloudera軟件公司產出的可分佈式日誌收集系統,後與2009年被捐贈了apache軟件基金會,爲hadoop相關組件之一。尤其近幾年隨着flume的不斷被完善以及升級版本的逐一推出,特別是flume-ng;同時flume內部的各種組件不斷豐富,用戶在開發的過程中使用的便利性得到很大的改善,現已成爲apache top項目之一。apache Flume是一個從可以收集例如日誌,事件等數據資源,並將這些數量龐大的數據從各項數據資源中集中起來存儲的工具/服務,或者數集中機制。flume具有高可用,分佈式,配置工具,其設計的原理也是基於將數據流,如日誌數據從各種網站服務器上彙集起來存儲到HDFS,HBase等集中存儲器中。

應用場景

比如我們在做一個電子商務網站,然後我們想從消費用戶中訪問點特定的節點區域來分析消費者的行爲或者購買意圖. 這樣我們就可以更加快速的將他想要的推送到界面上,實現這一點,我們需要將獲取到的她訪問的頁面以及點擊的產品數據等日誌數據信息收集並移交給Hadoop平臺上去分析。而Flume正是幫我們做到這一點。現在流行的內容推送,比如廣告定點投放以及新聞私人定製也是基於次,不過不一定是使用FLume,畢竟優秀的產品很多,比如facebook的Scribe,還有Apache新出的另一個明星項目chukwa,還有淘寶Time Tunnel。

Flume優勢

1. Flume可以將應用產生的數據存儲到任何集中存儲器中,比如HDFS,HBase(本次設計理念:HDFS存儲最原始採集到的數據,hdfs存儲清洗過的數據)    
2.當收集數據的速度超過將寫入數據的時候,也就是當收集信息遇到峯值時,這時候收集的信息非常大,甚至超過了系統的寫入數據能力,這時候,Flume會在數據生產者和數據收容器間做出調整,保證其能夠在兩者之間提供一共平穩的數據。
3.提供上下文路由特徵。
4.Flume的管道是基於事務,保證了數據在傳送和接收時的一致性。
5.Flume是可靠的,容錯性高的,可升級的,易管理的,並且可定製的。
Flume具有以下特徵:
1.Flume可以高效率的將多個網站服務器中收集的日誌信息存入HDFS/HBase中。
2.使用Flume,我們可以將從多個服務器中獲取的數據迅速的移交給Hadoop中。
3.除了日誌信息,Flume同時也可以用來接入收集規模宏大的社交網絡節點事件數據,比如facebook,twitter,電商網站如亞馬    
遜,flipkart等。
4.支持各種接入資源數據的類型以及接出數據類型。
5.支持多路徑流量,多管道接入流量,多管道接出流量,上下文路由等。
6.可以被水平擴展。

Flume架構

1)外部結構

上圖所示,數據發生器(如:facebook,twitter)產生的數據被被單個的運行在數據發生器所在服務器上的agent所收集,之後數據收容器從各個agent上彙集數據並將採集到的數據存入到HDFS或者HBase中。

2)Flume 事件--event

事件作爲Flume內部數據傳輸的最基本單元.它是由一個轉載數據的字節數組(該數據組是從數據源接入點傳入,並傳輸給傳輸器,也就是HDFS/HBase)和一個可選頭部構成。典型的Flume 事件如下面結構所示:

我們在將event在私人定製插件時比如:flume-hbase-sink插件是,獲取的就是event然後對其解析,並依據情況做過濾等,然後在傳輸給HBase或者HDFS。

flume的核心是把數據從數據源(source)收集過來,在將收集到的數據送到指定的目的地(sink)。爲了保證輸送的過程一定成功,在送到目的地(sink)之前,會先緩存數據(channel),待數據真正到達目的地(sink)後,flume再刪除自己緩存的數據。 在整個數據的傳輸的過程中,流動的是event,即事務保證是在event級別進行的。那麼什麼是event呢?event將傳輸的數據進行封裝,是flume傳輸數據的基本單位,如果是文本文件,通常是一行記錄,event也是事務的基本單位。event從source,流向channel,再到sink,本身爲一個字節數組,並可攜帶headers(頭信息)信息。event代表着一個數據的最小完整單元,從外部數據源來,向外部的目的地去。

一個完整的event包括:event headers、event body、event信息(即文本文件中的單行記錄),如下所以:

其中event信息就是flume收集到的日記記錄。

3)Flume Agent
我們在瞭解了Flume的外部結構之後,知道了Flume內部有一個或者多個Agent,然而對於每一個Agent來說,它就是一個獨立的守護進程(JVM),它從客戶端那兒接收收集,或者從其他的Agent哪兒接收,然後迅速的將獲取的數據傳給下一個目的節點sink,或者agent。如圖所示flume的基本模型 :

flume之所以這麼神奇,是源於它自身的一個設計,這個設計就是agent,agent本身是一個java進程,運行在日誌收集節點—所謂日誌收集節點就是服務器節點。

Agent主要由:source,channel,sink三個組件組成。

①source:source組件是專門用來收集數據的,從數據發生器接收數據,並將接收的數據以Flume的event格式傳遞給一個或者多個通道channal,Flume提供多種數據接收的方式,比如avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy、自定義。
②channal是一種短暫的存儲容器,它將從source處接收到的event格式的數據緩存起來,直到它們被sinks消費掉,它在source和sink間起着一共橋樑的作用,channal是一個完整的事務,這一點保證了數據在收發的時候的一致性。並且它可以和任意數量的source和sink鏈接。支持的類型有: JDBC channel,File System channel,Memort channel等。
③sink:將數據存儲到集中存儲器比如Hbase和HDFS,它從channals消費數據(events)並將其傳遞給目標地。目標地可能是另一個sink,也可能HDFS,HBase。

它的組合形式舉例:

Flume的主要插件:    
1.Interceptors攔截器    
用於source和channel之間,用來更改或者檢查Flume的events數據。    
2.管道選擇器channels Selectors    
在多管道是被用來選擇使用那一條管道來傳遞數據(events)。管道選擇器又分爲如下兩種:
默認管道選擇器: 每一個管道傳遞的都是相同的events多路複用通道選擇器:  依據每一個event的頭部header的地址選擇管道。    
3.sink線程    
用於激活被選擇的sinks羣中特定的sink,用於負載均衡。 

Flume與Kafka對比

考慮單一應用場景,從簡化系統的角度考慮,在滿足應用需求的情況下可能只使用一個比較好。但是考慮到現有系統業務發展,爲了後面的靈活擴展,在先用系統設計時留有一定的擴展性感覺更重要,可能使用Flume+kafka架構相對只使用Kafka會多佔用1-2臺機器做Flume日誌採集,但是爲了方便以後日誌數據處理方式的擴展,可以採用Flume+kafka架構。
Flume :管道 ----個人認爲比較適合有多個生產者場景,或者有寫入Hbase、HDFS和kafka需求的場景。
Kafka :消息隊列-----由於Kafka是Pull模式,因此適合有多個消費者的場景。
目前應用場景,一臺日誌轉發機負責產生日誌。後端需要通過Strom消費日誌信息,建議可以設置成log-->Kafka->Strom.如果以後有寫入Hbase或者HDFS的需求可以,在Kafka後面再接上Strom,或者在日誌轉發機上直接日誌落地,由Flume去讀取日誌消息。

Flume+Kafka雙劍合璧構建大數據平臺日誌採集

大數據平臺每天會產生大量的日誌,處理這些日誌需要特定的日誌系統。

一般而言,這些系統需要具有以下特徵:

①構建應用系統和分析系統的橋樑,並將它們之間的關聯解耦;
②支持近實時的在線分析系統和類似於Hadoop之類的離線分析系統;
③具有高可擴展性。即:當數據量增加時,可以通過增加節點進行水平擴展。

爲此建議將日誌採集分析系統分爲如下幾個模塊:

①數據採集模塊:負責從各節點上實時採集數據,建議選用Flume-NG來實現。
②☆☆☆☆☆數據接入模塊:由於採集數據的速度和數據處理的速度不一定同步,因此添加一個消息中間件來作爲緩衝,建議選用Kafka來實現。
③流式計算模塊:對採集到的數據進行實時分析,建議選用Storm來實現。
④數據輸出模塊:對分析後的結果持久化,可以使用HDFS、MySQL等。

1)日誌採集選型--Flume:    
a.Flume組件特點:    
Flume是一個分佈式、可靠、高可用的海量日誌採集、聚合和傳輸的日誌收集系統。支持在日誌系統中定製各類數據發送方,用於收集數據;同時,Flume提供對數據進行簡單處理,並寫到各種數據接受方(可定製)的能力。    
b.Flume的設計目標

可靠性:
Flume的核心是把數據從數據源收集過來,再送到目的地。爲了保證輸送一定成功,在送到目的地之前,會先緩存數據,
待數據真正到達目的地後,刪除自己緩存的數據。Flume 使用事務性的方式保證傳送Event整個過程的可靠性。
可擴展性:
Flume中只有一個角色Agent,其中包含Source、Sink、Channel三種組件。一個Agent的Sink可以輸出到另一個
Agent的Source。這樣通過配置可以實現多個層次的流配置。
功能可擴展性:
Flume自帶豐富的Source、Sink、Channel實現。用戶也可以根據需要添加自定義的組件實現, 並在配置中使用起來。

除了單Agent的架構外,還可以將多個Agent組合起來形成多層的數據流架構:

①多個Agent順序連接:將多個Agent順序連接起來,將最初的數據源經過收集,存儲到最終的存儲系統中。一般情況下,應該控制這種順序連接的Agent的數量,因爲數據流經的路徑變長了,如果不考慮Failover的話,出現故障將影響整個Flow上的Agent收集服務。

②多個Agent的數據匯聚到同一個Agent:這種情況應用的場景比較多,適用於數據源分散的分佈式系統中數據流彙總。

③多路(Multiplexing)Agent:多路模式一般有兩種實現方式,一種是用來複制,另一種是用來分流。複製方式可以將最前端的數據源複製多份,分別傳遞到多個Channel中,每個Channel接收到的數據都是相同的。分流方式,Selector可以根據Header的值來確定數據傳遞到哪一個Channel。

④實現Load Balance功能:Channel中Event可以均衡到對應的多個Sink組件上,而每個Sink組件再分別連接到一個獨立的Agent上,這樣可以實現負載均衡。

2)日誌採集選型--Kafka:

Producer(生產者)->Broker(經紀人)->Consumer(消費者)

a.Kafka組件特點:    
kafka實際上是一個消息發佈訂閱系統。Producer向某個Topic發佈消息,而Consumer訂閱某個Topic的消息。一旦有新的關於某個Topic的消息,Broker會傳遞給訂閱它的所有Consumer。    
b.Kafka的設計目標:    
①數據在磁盤上的存取代價爲O(1)    
Kafka以Topic來進行消息管理,每個Topic包含多個Partition,每個Partition對應一個邏輯log,由多個Segment組成。每個Segment中存儲多條消息。消息id由其邏輯位置決定,即從消息id可直接定位到消息的存儲位置,避免id到位置的額外映射。    
②爲發佈和訂閱提供高吞吐量    
Kafka每秒可以生產約25萬消息(50 MB),每秒處理55萬消息(110 MB)。    
③分佈式系統,易於向外擴展    
所有的Producer、Broker和Consumer都會有多個,均爲分佈式的。無需停機即可擴展機器。    
c.Kafka的架構    
Kafka是一個分佈式的、可分區的、可複製的消息系統,維護消息隊列。    
Kafka的整體架構非常簡單,是顯式分佈式架構,Producer、Broker和Consumer都可以有多個。    
Producer,consumer實現Kafka註冊的接口,數據從Producer發送到Broker,Broker承擔一箇中間緩存和分發的作用。    
Broker分發註冊到系統中的Consumer。Broker的作用類似於緩存,即活躍的數據和離線處理系統之間的緩存。客戶端和服務器端的通信,是基於簡單、高性能、且與編程語言無關的TCP協議。

3)Flume與Kafka的比較

Flume和Kafka都是優秀的日誌系統,其都能實現數據採集、數據傳輸、負載均衡、容錯等一系列的需求, 但是兩者之間還是有着一定的差別。

由以上可以看出Flume和Kafka還是各有優缺點的,所以要配合使用:

Flume適用於沒有編程的配置解決方案,由於提供了豐富的source、channel、sink實現,各種數據源的引入只是配置變更就可實現。Kafka 適用於對數據管道的吞吐量、可用性要求都很高的解決方案,基本需要編程實現數據的生產和消費。

總結:☆☆☆☆☆
建議採用Flume作爲數據的生產者,這樣可以不用編程就實現數據源的引入,並採用Kafka Sink作爲數據的消費者,這樣可以得到較高的吞吐量和可靠性。如果對數據的可靠性要求高的話,可以採用Kafka Channel來作爲Flume的Channel使用。

Flume對接Kafka:

Flume作爲消息的生產者,將生產的消息數據(日誌數據、業務請求數據等)通過Kafka Sink發佈到Kafka中。

以下是對接配置:

對接示例:    
假設現有Flume實時讀取/data1/logs/component_role.log的數據並導入到Kafka的mytopic主題中:    
環境預設爲:    
Zookeeper 的地址爲 zdh100:2181 zdh101:2181 zdh102:2181    
Kafka broker的地址爲 zdh100:9092 zdh101:9092 zdh102:9093    
配置Flume agent,如下修改Flume配置:    
gent1.sources = logsrc    
agent1.channels = memcnl    
agent1.sinks = kafkasink    
#source section    
agent1.sources.logsrc.type = exec    
agent1.sources.logsrc.command = tail -F /data1/logs/component_role.log    
agent1.sources.logsrc.shell = /bin/sh -c    
agent1.sources.logsrc.batchSize = 50    
agent1.sources.logsrc.channels = memcnl    
# Each sink's type must be defined    
agent1.sinks.kafkasink.type = org.apache.flume.sink.kafka.KafkaSink    
agent1.sinks.kafkasink.brokerList=zdh100:9092, zdh101:9092,zdh102:9092    
agent1.sinks.kafkasink.topic=mytopic    
agent1.sinks.kafkasink.requiredAcks = 1    
agent1.sinks.kafkasink.batchSize = 20    
agent1.sinks.kafkasink.channel = memcnl    
# Each channel's type is defined.    
agent1.channels.memcnl.type = memory    
agent1.channels.memcnl.capacity = 1000    
啓動該Flume節點:    
/home/mr/flume/bin/flume-ng agent -c    
/home/mr/flume/conf -f /home/mr/flume/conf/flume-conf.properties -n agent1 -Dflume.monitoring.type=    
http -Dflume.monitoring.port=10100    
動態追加日誌數據,執行命令向 /data1/logs/component_role.log 添加數據:    
echo "測試代碼" >> /data1/logs/component_role.log    
echo "檢測Flume+Kafka數據管道通暢" >> /data1/logs/component_role.log    
驗證Kafka數據接收結果,執行命令檢查Kafka收到的數據是否正確,應該可以呈現剛纔追加的數據:    
/home/mr/kafka/bin/kafka-console-consumer.sh --zookeeper zdh100:2181 --topic mytopic --from-beginning

輸出結果如下:

Flume安裝配置

1)flume單節點安裝

apache-flume-1.8.0-bin.tar.gz ---2017.10.04號發佈
cd /usr/software
解壓:tar -zxvf apache-flume-1.8.0-bin.tar.gz
ln -s apache-flume-1.8.0-bin flume
編輯環境變量:
vim /etc/profile
export JAVA_HOME
export HADOOP_HOME
export HBASE_HOME
export HIVE_HOME
export FLUME_HOME=/usr/software/flume
export PATH
source /etc/profile
配置flume-env.sh添加Java路徑:
cd /usr/software/flume/conf
cp -r flume-env.sh.template flume-env.sh
chmod 777 flume-env.sh
vim flume-env.sh
export JAVA_HOME=/usr/software/java/jdk1.8.0_152
配置完成後版本測試:flume-ng version

編輯$flume_home/conf/flume-conf.properties                            
cp -r flume-conf.properties.template flume-conf.properties                            
vim flume-conf.properties                            
#agent1 name                            
agent1.sources=source1                            
agent1.sinks=sink1                            
agent1.channels=channel1                            
                            
#Spooling Directory                            
#set source1                            
agent1.sources.source1.type=spooldir                            
agent1.sources.source1.spoolDir=/usr/software/flume/dir/logdfs                            #本地url
agent1.sources.source1.channels=channel1                            
agent1.sources.source1.fileHeader = false                            
agent1.sources.source1.interceptors = i1                            
agent1.sources.source1.interceptors.i1.type = timestamp                            
                            
#set sink1                            
agent1.sinks.sink1.type=hdfs                            
agent1.sinks.sink1.hdfs.path=/home/hdfs/flume/logdfs                            #HDFS url
agent1.sinks.sink1.hdfs.fileType=DataStream                            
agent1.sinks.sink1.hdfs.writeFormat=TEXT                            
agent1.sinks.sink1.hdfs.rollInterval=1                            
agent1.sinks.sink1.channel=channel1                            
agent1.sinks.sink1.hdfs.filePrefix=%Y-%m-%d

#rollInterval:默認值:30。hdfs sink間隔多長將臨時文件滾動成最終目標文件,單位:秒;    
如果設置成0,則表示不根據時間來滾動文件;    
注:滾動(roll)指的是,hdfs sink將臨時文件重命名成最終目標文件,並新打開一個臨時文件來寫入數據;    
#filePrefix:默認值:FlumeData。 寫入hdfs的文件名前綴,可以使用flume提供的日期及%{host}表達式。

#set channel1                                    
agent1.channels.channel1.type=file                                    
agent1.channels.channel1.checkpointDir=/usr/software/flume/dir/logdfstmp/point                                    #本地url
agent1.channels.channel1.dataDirs=/usr/software/flume/dir/logdfstmp                                    #本地url
#agent1.channels.channel1.capacity=1000                    #當channel的類型是memory時,激活capacity,存儲容量爲1000        
#agent.channels.c1.transactionCapacity=100                    #轉換容量                
編輯完保存flume-conf.properties                                    
添加執行權限:chmod 777 flume-conf.properties                                    
單點配置完成,copy到其它節點                                    
scp -r apache-flume-1.8.0-bin hadoop02@hadoop02:/home/hadoop02                                    
記得其它節點的變量也要編輯vim /etc/profile,編輯完之後source /etc/profile                                    
logdfs目錄下創建文件test-flume.txt,寫入內容flume1+kafka+hadoop+hive+sqoop+mysql+spring+js+ajax+html                        
啓動flume:                                    
bin/flume-ng agent -n agent1 -c conf -f conf/flume-conf.properties -Dflume.root.logger=DEBUG,console                            
-c (--conf) : flume的conf文件路徑                                    
-f (--conf-file) : 自定義的flume配置文件                                    
-n (--name): 自定義的flume配置文件中agent的name                                    
注:命令中的agent1表示配置文件中的Agent的Name,如配置文件中的agent1。flume-conf.properties表示                                
配置文件所在配置,需填寫準確的配置文件路徑。                                    
注:配置中的目錄若不存在,需在HDFS中提前創建。

啓動成功!以前的txt變身完畢

hdfs出現相應文件

hdfs dfs -cat /home/hdfs/flume/logdfs/2018-05-17.1526548481565

把hadoop01中的配置文件flume-conf.properties copy到其它機器:        
scp -r flume-conf.properties hadoop02@hadoop02:/home/hadoop02        
scp -r flume-conf.properties hadoop03@hadoop03:/home/hadoop03        
scp -r flume-conf.properties hadoop04@hadoop04:/home/hadoop04        
scp -r flume-conf.properties hadoop05@hadoop05:/home/hadoop05        
這樣,每臺機器都可以作爲單點··        
        
2)flume高可用配置部署        
名稱    HOST    角色
Agent1    hadoop01    Web Server
Agent2    hadoop02    Web Server
Agent3    hadoop03    Web Server
Collector1    hadoop04    AgentMstr1
Collector2    hadoop05    AgentMstr1
Agent1,Agent2,Agent3數據分別流入到Collector1和Collector2,Flume NG本身提供了Failover機制,        
可以自動切換和恢復。        
下圖爲flume高可用五臺機器的架構圖

根據上面的單點flume配置,基本配置完成,再添加兩個配置文件,它們分別是flume-client.properties和flume-server.properties                            
cd /usr/software/flume/conf                            
touch flume-client.properties                            
touch flume-server.properties                            
開始配置:                            
配置Agent1,Agent2,Agent3,分別位於hadoop01~hadoop03三臺機器,配置相同,把agent1->agengt2相應的變更,三個agent名如下所示:                            
注:一個agent1只能採集一個nginx的access.log的日誌,所以想讓agent2和agent3都採集到數據需要在hadoop02和hadoop03都配置nginx(以後做)                            
vim flume-client.properties                            
#agent1 name                            
agent1.channels = c1                            
agent1.sources = r1                            
agent1.sinks = k1 k2                            
                            
#set gruop                            
agent1.sinkgroups = g1                             
                            
#set channel                            
agent1.channels.c1.type = memory                            
agent1.channels.c1.capacity = 100000                        #100kb,單位字節(bytes)    
agent1.channels.c1.transactionCapacity = 10000                        #10kb,單位字節(bytes)    
agent1.channels.c1.keep-alive=30                            
                            
agent1.sources.r1.channels = c1                            
agent1.sources.r1.type = exec                            
agent1.sources.r1.command = tail -F /usr/local/nginx/logs/access.log                            
#配置需要監控的日誌輸出目錄                            
#agent1.sources.r1.interceptors = i1 i2                            
#agent1.sources.r1.interceptors.i1.type = static                            
#agent1.sources.r1.interceptors.i1.key = Type                            
#agent1.sources.r1.interceptors.i1.value = LOGIN                            
#agent1.sources.r1.interceptors.i2.type = timestamp                            
                            
# set sink1                            
agent1.sinks.k1.channel = c1                            
agent1.sinks.k1.type = avro                            
agent1.sinks.k1.hostname = hadoop04                    #指定Collector1        
agent1.sinks.k1.port = 52020                            
                            
# set sink2                            
agent1.sinks.k2.channel = c1                            
agent1.sinks.k2.type = avro                            
agent1.sinks.k2.hostname = hadoop05                    #指定Collector2        
agent1.sinks.k2.port = 52020                            
                            
#set sink group                            
agent1.sinkgroups.g1.sinks = k1 k2                            
                            
#set failover                            
agent1.sinkgroups.g1.processor.type = failover                            
agent1.sinkgroups.g1.processor.priority.k1 = 10                        #優先權k1>k2    
agent1.sinkgroups.g1.processor.priority.k2 = 1                            
agent1.sinkgroups.g1.processor.maxpenalty = 10000                            
保存退出,hadoop01~03爲agent1~agent3,配置均一致。                            
注意:兩個collector中ip/主機名不同需要修改,其它一致                            
編輯hadoop04下的配置文件                            
vim flume-server.properties                            
#set Agent name                            
collector1.sources = r1                            
collector1.channels = c1                            
collector1.sinks = k1                            
                            
#set channel                            
collector1.channels.c1.type = memory                            
collector1.channels.c1.capacity = 1000000                        #100kb,單位字節(bytes)    
collector1.channels.c1.transactionCapacity = 100000                        #10kb,單位字節(bytes)    
collector1.channels.c1.keep-alive = 30                        #單位是秒,默認是3秒。此參數用來控制channel滿時影響source的發送,    
                        channel空時影響sink的消費,就是等待時間,超過這個時間就甩異常,    
# other node                        一般不需配置,但是有些情況很有用,比如你得場景是每分鐘開頭集中發一次數據,    
collector1.sources.r1.type = avro                        這時每分鐘的開頭量可能比較大,後面會越來越小,這時你可以調大這個參數,不至    
collector1.sources.r1.bind = hadoop04                        於出現channel滿了得情況;    
collector1.sources.r1.port = 52020                            
#collector1.sources.r1.interceptors = i1                            
#collector1.sources.r1.interceptors.i1.type = static                        就是batchSize一定不能大於transactionCapacity    
#collector1.sources.r1.interceptors.i1.key = Collector                            
#collector1.sources.r1.interceptors.i1.value = hadoop04                            
collector1.sources.r1.channels = c1                            
                            
#set sink to hdfs                            
collector1.sinks.k1.type=hdfs                            
collector1.sinks.k1.channel=c1                        #採集後路徑上傳路徑    
collector1.sinks.k1.hdfs.useLocalTimeStamp = true                        #true代表使用當地時間戳    
#collector1.sinks.k1.hdfs.path=/home/hdfs/flume/logdfs                            
collector1.sinks.k1.hdfs.path=/home/hdfs/flume/logdfs/%Y-%m-%d                            
collector1.sinks.k1.hdfs.minBlockReplicas=1                        #默認值:HDFS副本數,寫入HDFS文件塊的最小副本數。    
collector1.sinks.k1.hdfs.batchSize = 1000                        #默認值:100,每個批次刷新到HDFS上的events數量;    
collector1.sinks.k1.hdfs.fileType=DataStream                            
collector1.sinks.k1.hdfs.writeFormat=TEXT                            
collector1.sinks.k1.hdfs.callTimeout=600000                        #callTimeout單位是毫秒600000毫秒=10分鐘    
collector1.sinks.k1.hdfs.rollInterval=0                        #默認單位:秒。rollInterval的配置表示每個120秒回滾到下一個文件,hdfs sink間隔多長將臨時文件滾動成最終目標文件    
collector1.sinks.k1.hdfs.rollSize=52428800                        #rollSize默認值:1024,當臨時文件達到該大小(單位:bytes)時,    
#1048576 byte=1MB,52428800=50MB                        滾動成目標文件;如果設置成0,則表示不根據臨時文件大小來滾動文件;    
collector1.sinks.k1.hdfs.rollCount=0                        #rollCount默認值:10,當events數據達到該數量時候,將臨時文件滾動成目標文件;    
collector1.sinks.k1.hdfs.round=true                        #round的理解是,每3分鐘產生一個新文件    
collector1.sinks.k1.hdfs.roundValue=10                            
collector1.sinks.k1.hdfs.roundUnit=minute                            
collector1.sinks.k1.hdfs.filePrefix=nginx-%H%M%S                            
collector1.sinks.k1.hdfs.fileSuffix=.log                            
#collector1.sinks.k1.hdfs.filePrefix=%Y-%m-%d                            
#collector1.sinks.k1.hdfs.inUseSuffix = .tmp                        #臨時文件後綴名    
                            
collector1.sinks.k1.hdfs.idleTimeout = 600                        #idleTimeout:默認值:0當目前被打開的臨時文件在該參數指定的時間(秒)內,沒有任何數據寫入,則將該臨時文件關閉並重命名成目標文件

編輯hadoop05下的配置文件                                
vim flume-server.properties                                
#set Agent name                                
collector2.sources = r1                                
collector2.channels = c1                                
collector2.sinks = k1                                
                                
#set channel                                
collector2.channels.c1.type = memory                                
collector2.channels.c1.capacity = 1000000                        #100kb,單位字節(bytes)        
collector2.channels.c1.transactionCapacity = 100000                        #10kb,單位字節(bytes)        
collector2.channels.c1.keep-alive = 30                                
                                
# other node,nna to nns                                
collector2.sources.r1.type = avro                                
collector2.sources.r1.bind = hadoop05                                
collector2.sources.r1.port = 52020                                
#collector2.sources.r1.interceptors = i1                                
#collector2.sources.r1.interceptors.i1.type = static                                
#collector2.sources.r1.interceptors.i1.key = Collector                                
#collector2.sources.r1.interceptors.i1.value = hadoop05                                
collector2.sources.r1.channels = c1                                
                                
#set sink to hdfs                                
collector2.sinks.k1.type=hdfs                                
collector2.sinks.k1.channel=c1                        #採集後路徑上傳路徑        
collector2.sinks.k1.hdfs.useLocalTimeStamp = true                        #true代表使用當地時間戳        
#collector2.sinks.k1.hdfs.path=/home/hdfs/flume/logdfs                                
collector2.sinks.k1.hdfs.path=/home/hdfs/flume/logdfs/%Y-%m-%d                                
collector2.sinks.k1.hdfs.minBlockReplicas=1                        #默認值:HDFS副本數,寫入HDFS文件塊的最小副本數。        
collector2.sinks.k1.hdfs.batchSize = 1000                        #默認值:100,每個批次刷新到HDFS上的events數量;        
collector2.sinks.k1.hdfs.fileType=DataStream                                
collector2.sinks.k1.hdfs.writeFormat=TEXT                                
collector2.sinks.k1.hdfs.callTimeout=600000                        #callTimeout單位是毫秒600000毫秒=10分鐘        
collector2.sinks.k1.hdfs.rollInterval=0                        #默認單位:秒。rollInterval的配置表示每個120秒回滾到下一個文件,hdfs sink間隔多長將臨時文件滾動成最終目標文件        
collector2.sinks.k1.hdfs.rollSize=52428800                        #rollSize默認值:1024,當臨時文件達到該大小(單位:bytes)時,        
#1048576 byte=1MB,52428800=50MB                        滾動成目標文件;如果設置成0,則表示不根據臨時文件大小來滾動文件;        
collector2.sinks.k1.hdfs.rollCount=0                        #rollCount默認值:10,當events數據達到該數量時候,將臨時文件滾動成目標文件;        
collector2.sinks.k1.hdfs.round=true                        #round的理解是,每3分鐘產生一個新文件        
collector2.sinks.k1.hdfs.roundValue=10                                
collector2.sinks.k1.hdfs.roundUnit=minute                                
collector2.sinks.k1.hdfs.filePrefix=nginx-%H%M%S                                
collector2.sinks.k1.hdfs.fileSuffix=.log                                
#collector2.sinks.k1.hdfs.filePrefix=%Y-%m-%d                                
#collector2.sinks.k1.hdfs.inUseSuffix = .tmp                        #臨時文件後綴名        
                                
collector2.sinks.k1.hdfs.idleTimeout = 600                        #idleTimeout:默認值:0當目前被打開的臨時文件在該參數指定的時間(秒)內,沒有任何數據寫入,則將該臨時文件關閉並重命名成目標文件        
                                
以上配置完所有節點後,開始啓動!!                                
cp /usr/software/hadoop-3.0.1/etc/hadoop/core-site.xml /usr/software/flume/conf/                                
cp /usr/software/hadoop-3.0.1/etc/hadoop/hadoop-env.sh /usr/software/flume/conf/                                
cp /usr/software/hadoop-3.0.1/etc/hadoop/workers /usr/software/flume/conf/

3)flume高可用啓動和測試                
在agent節點上啓動命令如下:(每個agent都需要啓動)                
bin/flume-ng agent -n agent1 -c conf -f conf/flume-client.properties -Dflume.root.logger=DEBUG,console                
注:命令中的agent1表示配置文件中的Agent的Name,如配置文件中的agent1。flume-client.properties表示配置文件所在配置,需填寫準確的配置文件路徑。                
在Collector節點上啓動命令如下所示:                
bin/flume-ng agent -n collector1 -c conf -f conf/flume-server.properties -Dflume.root.logger=DEBUG,console                
注:命令中的collector1表示配置文件中的Agent的Name,如配置文件中的collector1。flume-server.properties表示配置文件所在配置,需填寫準確的配置文件路徑。                
☆注意:一定先啓動collector兩個機器再啓動agent三臺機器,因爲不啓動collector沒有Flume的進程“Application” 會報錯:

agent和collector的flume進程名都是:Application

爲了在遠程自動啓動shell過程中不出現在命令行出現衆多的打印內容,且停留在打印信息上無法輸入其它命令,而且    
爲了防止ctrl+c,可以直接停止的情況,所以用以下命令,讓啓動flume時不打印信息,且只運行在後臺:    
首先在/usr/software/路徑下創建touch nohup.out文件    
nohup bin/flume-ng agent -n collector1 -c conf -f conf/flume-server.properties -Dflume.root.logger=INFO,console > /usr/software/shell-script/nohup.out 2>&1 &    
nohup bin/flume-ng agent -n collector2 -c conf -f conf/flume-server.properties -Dflume.root.logger=INFO,console > /usr/software/shell-script/nohup.out 2>&1 &    
nohup bin/flume-ng agent -n agent1 -c conf -f conf/flume-client.properties -Dflume.root.logger=INFO,console > /usr/software/shell-script/nohup.out 2>&1 &

高可用故障轉移測試:

我們在Agent1節點上傳文件,由於我們配置Collector1的權重比Collector2大,所以 Collector1優先採集並上傳到存儲系統。然後我們kill掉Collector1,此時有Collector2負責日誌的採集上傳工作,之後,我 們手動恢復Collector1節點的Flume服務,再次在Agent1上次文件,發現Collector1恢復優先級別的採集工作。        
在hadoop02的/usr/software目錄下創建兩個文件        
touch test.log        
touch test-agagin.log        
寫入內容後,啓動hadoop01~hadoop03的agent,和hadoo04、hadoop05的collector        
因爲配置文件中配置的是:agent1.sources.r1.command = tail -F /usr/software/flume/dir/logdfs/test.log        
所以只有在/usr/software/flume/dir/logdfs目錄下名字叫test.log的文件纔會被執行,顯然這種配置是十分侷限的,此處只爲測試用,之後會根據具體情況進行配置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章