本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,博主爲石山園,博客地址爲 http://www.cnblogs.com/shishanyuan 。該系列課程是應邀實驗樓整理編寫的,這裏須要贊一下實驗樓提供了學習的新方式,能夠邊看博客邊上機實驗,課程地址爲 https://www.shiyanlou.com/courses/237html
【注】該系列所使用到安裝包、測試數據和代碼都可在百度網盤下載,具體地址爲 http://pan.baidu.com/s/10PnDs,下載該PDF文件node
部署節點操做系統爲CentOS,防火牆和SElinux禁用,建立了一個shiyanlou用戶並在系統根目錄下建立/app目錄,用於存放Hadoop等組件運行包。由於該目錄用於安裝hadoop等組件程序,用戶對shiyanlou必須賦予rwx權限(通常作法是root用戶在根目錄下建立/app目錄,並修改該目錄擁有者爲shiyanlou(chown –R shiyanlou:shiyanlou /app)。linux
Hadoop搭建環境:apache
l 虛擬機操做系統: CentOS6.6 64位,單核,1G內存架構
l JDK:1.7.0_55 64位app
l Hadoop:1.1.2分佈式
Flume是Cloudera提供的日誌收集系統,Flume支持在日誌系統中定製各種數據發送方,用於收集數據;同時,Flume提供對數據進行簡單處理,並寫到各類數據接受方(可定製)的能力。 Flume是一個分佈式、可靠和高可用的海量日誌採集、聚合和傳輸的系統。ide
Flume具備Reliability、Scalability、Manageability和Extensibility特色:oop
1.Reliability:Flume提供3中數據可靠性選項,包括End-to-end、Store on failure和Best effort。其中End-to-end使用了磁盤日誌和接受端Ack的方式,保證Flume接受到的數據會最終到達目的。Store on failure在目的不可用的時候,數據會保持在本地硬盤。和End-to-end不一樣的是,若是是進程出現問題,Store on failure可能會丟失部分數據。Best effort不作任何QoS保證。學習
2.Scalability:Flume的3大組件:collector、master和storage tier都是可伸縮的。須要注意的是,Flume中對事件的處理不須要帶狀態,它的Scalability能夠很容易實現。
3.Manageability:Flume利用ZooKeeper和gossip,保證配置數據的一致性、高可用。同時,多Master,保證Master能夠管理大量的節點。
4.Extensibility:基於Java,用戶能夠爲Flume添加各類新的功能,如經過繼承Source,用戶能夠實現本身的數據接入方式,實現Sink的子類,用戶能夠將數據寫往特定目標,同時,經過SinkDecorator,用戶能夠對數據進行必定的預處理。
上圖的Flume的架構中最重要的抽象是data flow(數據流),data flow描述了數據從產生,傳輸、處理並最終寫入目標的一條路徑(在上圖中,實線描述了data flow)。 Agent用於採集數據,agent是flume中產生數據流的地方,同時,agent會將產生的數據流傳輸到collector。對應的,collector用於對數據進行聚合,每每會產生一個更大的流。
Flume提供了從console(控制檯)、RPC(Thrift-RPC)、text(文件)、tail(UNIX tail)、syslog(syslog日誌系統,支持TCP和UDP等2種模式),exec(命令執行)等數據源上收集數據的能力。同時,Flume的數據接受方,能夠是console(控制檯)、text(文件)、dfs(HDFS文件)、RPC(Thrift-RPC)和syslogTCP(TCP syslog日誌系統)等。
其中,收集數據有2種主要工做模式,以下:
1. Push Sources:外部系統會主動地將數據推送到Flume中,如RPC、syslog。
2. Polling Sources:Flume到外部系統中獲取數據,通常使用輪詢的方式,如text和exec。
注意,在Flume中,agent和collector對應,而source和sink對應。Source和sink強調發送、接受方的特性(如數據格式、編碼等),而agent和collector關注功能。
Flume Master用於管理數據流的配置,以下圖。
爲了保證可擴展性,Flume採用了多Master的方式。爲了保證配置數據的一致性,Flume引入了ZooKeeper,用於保存配置數據,ZooKeeper自己可保證配置數據的一致性和高可用,另外,在配置數據發生變化時,ZooKeeper能夠通知Flume Master節點。
Flume Master間使用gossip協議同步數據。
能夠到apache基金flume官網http://flume.apache.org/download.html,選擇鏡像下載地址http://mirrors.hust.edu.cn/apache/flume/下載一個穩定版本,以下圖所示下載flume-1.5.2-bin.tar.gz:
也能夠在/home/shiyanlou/install-pack目錄中找到該安裝包,解壓該安裝包並把該安裝包複製到/app目錄中
cd /home/shiyanlou/install-pack
tar -xzf flume-1.5.2-bin.tar.gz
mv apache-flume-1.5.2-bin /app/flume-1.5.2
編輯/etc/profile文件,聲明flume的home路徑和在path加入bin的路徑:
export FLUME_HOME=/app/flume-1.5.2
export FLUME_CONF_DIR=$FLUME_HOME/conf
export PATH=$PATH:$FLUME_HOME/bin
編譯配置文件/etc/profile,並確認生效
source /etc/profile
echo $PATH
在$FLUME_HOME/conf 下複製更名flume-env.sh.template爲flume-env.sh,修改conf/flume-env.sh配置文件
cd /app/flume-1.5.2/conf
cp flume-env.sh.template flume-env.sh
sudo vi flume-env.sh
修改配置文件內容 :
JAVA_HOME=/app/lib/jdk1.7.0_55
JAVA_OPTS="-Xms100m -Xmx200m -Dcom.sun.management.jmxremote"
1. 修改flume-conf配置文件
在$FLUME_HOME/conf目錄下修改flume-conf.properties.template文件,複製並更名爲flume-conf,
cd /app/flume-1.5.2/conf
cp flume-conf.properties.template flume-conf.properties
sudo vi flume-conf.properties
修改flume-conf配置文件內容
# The configuration file needs to define the sources, the channels and the sinks.
# Sources, channels and sinks are defined per agent, in this case called 'a1'
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# For each one of the sources, the type is defined
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
#The channel can be defined as follows.
a1.sources.r1.channels = c1
# Each sink's type must be defined
a1.sinks.k1.type = logger
#Specify the channel the sink should use
a1.sinks.k1.channel = c1
# Each channel's type is defined.
a1.channels.c1.type = memory
# Other config values specific to each type of channel(sink or source)
# can be defined as well
# In this case, it specifies the capacity of the memory channel
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
2. 在flume的安裝目錄/flume-1.5.2下運行
cd /app/flume-1.5.2
./bin/flume-ng agent --conf ./conf/ --conf-file ./conf/flume-conf.properties --name a1 -Dflume.root.logger=INFO,console
3. 再打開一個終端,輸入以下命令:
telnet localhost 44444
hello world
注:在CentOS6.5運行telnet提示"command not found",使用sudo yum install telnet進行安裝
4. 在原來的終端上查看,能夠收到來自於telnet發出的消息
1. 在$FLUME_HOME/conf目錄下修改flume-conf.properties.template文件,複製並更名爲flume-conf2.properties
cd /app/flume-1.5.2/conf
cp flume-conf.properties.template flume-conf2.properties
sudo vi flume-conf2.properties
a1.sources = r1
a1.sinks = k1
a1.channels = c1
a1.sources.r1.type = exec
a1.sources.r1.channels = c1
a1.sources.r1.command = tail -F /app/hadoop-1.1.2/logs/hadoop-shiyanlou-namenode-b393a04554e1.log
a1.sinks.k1.type = hdfs
a1.sinks.k1.channel = c1
a1.sinks.k1.hdfs.path = hdfs://hadoop:9000/class12/out_flume
a1.sinks.k1.hdfs.filePrefix = events-
a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue = 10
a1.sinks.k1.hdfs.roundUnit = minute
a1.sinks.k1.hdfs.rollSize = 4000000
a1.sinks.k1.hdfs.rollCount = 0
a1.sinks.k1.hdfs.writeFormat = Text
a1.sinks.k1.hdfs.fileType = DataStream
a1.sinks.k1.hdfs.batchSize = 10
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
2. 在flume的安裝目錄/flume-1.5.2下運行
cd /app/flume-1.5.2
./bin/flume-ng agent --conf ./conf/ --conf-file ./conf/flume-conf2.properties --name a1 -Dflume.root.logger=INFO,console
3. 不斷收集hadoop-hadoop-namenode-hadoop1.log的數據寫入HDFS中
4. 查看hdfs中/class12/out_flume中的文件
hadoop fs -ls /class12/out_flume
hadoop fs -cat /class12/out_flume/events-.1433921305493