Flume日志采集,avro采集,以及通过参数控制下沉到hdfs的文件大小,时间等控制
1 Flume日志收集
1.1 總體介紹
官方地址:http://flume.apache.org/
1.1.1 背景
flume 作為 cloudera 開發(fā)的實(shí)時日志收集系統(tǒng),受到了業(yè)界的認(rèn)可與廣泛應(yīng)用。Flume 初始的發(fā)行版本目前被統(tǒng)稱為 Flume OG(original generation),屬于 cloudera。但隨著 FLume 功能的擴(kuò)展,Flume OG 代碼工程臃腫、核心組件設(shè)計(jì)不合理、核心配置不標(biāo)準(zhǔn)等缺點(diǎn)暴露出來,尤其是在 Flume OG 的最后一個發(fā)行版本 0.94.0 中,日志傳輸不穩(wěn)定的現(xiàn)象尤為嚴(yán)重,為了解決這些問題,2011 年 10 月 22 號,cloudera 完成了 Flume-728,對 Flume 進(jìn)行了里程碑式的改動:重構(gòu)核心組件、核心配置以及代碼架構(gòu),重構(gòu)后的版本統(tǒng)稱為 Flume NG(next generation);改動的另一原因是將 Flume 納入 apache 旗下,cloudera Flume 改名為 Apache Flume。
flume是一個分布式、可靠、和高可用的海量日志采集、聚合和傳輸?shù)南到y(tǒng)。支持在日志系統(tǒng)中定制各類數(shù)據(jù)發(fā)送方,用于收集數(shù)據(jù);同時,Flume提供對數(shù)據(jù)進(jìn)行簡單處理,并寫到各種數(shù)據(jù)接受方(比如文本、HDFS、Hbase等)的能力 。
flume的數(shù)據(jù)流由事件(Event)貫穿始終。事件是Flume的基本數(shù)據(jù)單位,它攜帶日志數(shù)據(jù)(字節(jié)數(shù)組形式)并且攜帶有頭信息,這些Event由Agent外部的Source生成,當(dāng)Source捕獲事件后會進(jìn)行特定的格式化,然后Source會把事件推入(單個或多個)Channel中。你可以把Channel看作是一個緩沖區(qū),它將保存事件直到Sink處理完該事件。Sink負(fù)責(zé)持久化日志或者把事件推向另一個Source。
1.1.2 特點(diǎn)
Flume的可靠性
當(dāng)節(jié)點(diǎn)出現(xiàn)故障時,日志能夠被傳送到其他節(jié)點(diǎn)上而不會丟失。Flume提供了三種級別的可靠性保障,從強(qiáng)到弱依次分別為:end-to-end(收到數(shù)據(jù)agent首先將event寫到磁盤上,當(dāng)數(shù)據(jù)傳送成功后,再刪除;如果數(shù)據(jù)發(fā)送失敗,可以重新發(fā)送。),Store on failure(這也是scribe采用的策略,當(dāng)數(shù)據(jù)接收方crash時,將數(shù)據(jù)寫到本地,待恢復(fù)后,繼續(xù)發(fā)送),Besteffort(數(shù)據(jù)發(fā)送到接收方后,不會進(jìn)行確認(rèn))
可恢復(fù)性
還是靠Channel.推薦使用FileChannel,事件持久化在本地文件系統(tǒng)里面(性能比較差)。
核心概念
**Agent:**使用JVM運(yùn)行Flume。每臺機(jī)器運(yùn)行一個agent,但是可以再一個agent中包含多個sources和sinks。
Client: 生產(chǎn)數(shù)據(jù),運(yùn)行一個獨(dú)立的線程。
Source: 從Client收集數(shù)據(jù),運(yùn)行一個獨(dú)立線程。
Channel: 連接sources和sinks,這個有點(diǎn)像一個隊(duì)列。
Events: 可以是日志記錄、avro對象等。
Flume以agent為最小的獨(dú)立運(yùn)行單位。一個agent就是一個JVM。單agent由Source、Sink和Channel三大組件構(gòu)成,如下圖:
值得注意的是,Flume提供了大量內(nèi)置的Source、Channel和Sink類型。不同類型的Source,Channel和sink可以自由組合。組合方式基于用于設(shè)置的配置文件,非常靈活。比如:Channel可以把事件暫存在內(nèi)存里,也可以持久化到本地硬盤上。Sink可以把日志寫入HDFS,HBase,甚至是另外一個Source等等。Flume支持用戶建立多級流,也就是說,多個agent可以協(xié)同工作,并且支持Fan-in、Fan-out、Contextual Routing、Backup Routes。如下圖所示:
1.1.3 采集形式
日志收集中一個非常常見的場景是大量的日志生成客戶端將數(shù)據(jù)發(fā)送給附加到存儲子系統(tǒng)的一些消費(fèi)者代理。例如,從數(shù)百個web服務(wù)器中收集的日志,發(fā)送給數(shù)十個寫入HDFS集群的代理。
在離線階段,Flume的日志收集,Agent1/Agent2/Agent3端也是Flume端,主要的作用是采集nginx日志,采集到的日志文件最后下沉到另外一個agent4,最終通過agent4將數(shù)據(jù)下沉到hdfs中。
1.2 Agent1/Agent2/Agent3 Flume采集端配置
1.2.1 前期準(zhǔn)備
運(yùn)行Flume-1.8.0的時候,需要JDK,否則會報(bào)錯。修改jdk位置:
[root@bigdata1 conf]# cd /home/bigdata/installed/flume-1.8.0/conf [root@bigdata1 conf]# vim flume-env.sh export JAVA_HOME=/home/bigdata/installed/jdk1.8.0_731.2.2 配置Flume內(nèi)存參數(shù)
[root@bigdata1 flume-1.8.0]# cd /home/bigdata/installed/flume-1.8.0/conf [root@bigdata1 flume-1.8.0]# vim flume-env.sh 修改flume-1.8.0/bin/flume-ng,主要修改JAVA_OPTS這個參數(shù)的值,具體的值是: JAVA_OPTS="-Xmx256m"內(nèi)容是:
1.2.3 創(chuàng)建文件夾
進(jìn)入線上服務(wù)器flume所在位置。
[root@bigdata1 flume-1.8.0]# cd /xxxxx/apache-flume-1.8.0-bin [root@bigdata1 flume-1.8.0]# ll 總用量 6296 drwxrwxrwx 2 bigdata bigdata 62 3月 22 10:46 bin -rwxrwxrwx 1 bigdata bigdata 81264 9月 15 2017 CHANGELOG drwxrwxrwx 2 bigdata bigdata 286 6月 5 21:10 conf -rwxrwxrwx 1 bigdata bigdata 5681 9月 15 2017 DEVNOTES -rwxrwxrwx 1 bigdata bigdata 2873 9月 15 2017 doap_Flume.rdf drwxrwxrwx 10 bigdata bigdata 4096 9月 15 2017 docs drwxr-xr-x 3 root root 123 6月 11 15:51 fileCHK drwxr-xr-x 2 root root 170 6月 11 16:50 fileData drwxrwxrwx 2 bigdata bigdata 8192 3月 22 10:46 lib -rwxrwxrwx 1 bigdata bigdata 27663 9月 15 2017 LICENSE drwxr-xr-x 2 root root 23 5月 15 14:47 logs -rw------- 1 root root 4054498 6月 11 16:50 nohup.out -rwxrwxrwx 1 bigdata bigdata 249 9月 15 2017 NOTICE -rwxrwxrwx 1 bigdata bigdata 2483 9月 15 2017 README.md -rwxrwxrwx 1 bigdata bigdata 1588 9月 15 2017 RELEASE-NOTES drwxrwxrwx 2 bigdata bigdata 68 3月 22 10:46 tools -rw-r--r-- 1 root root 1242266 6月 11 16:20 zookeeper.out [root@bigdata1 flume-1.8.0]#要注意的是,上面的fileCHK,fileData為自己手動創(chuàng)建的,創(chuàng)建命令:
[root@bigdata1 flume-1.8.0]# cd /xxxxx/apache-flume-1.8.0-bin [root@bigdata1 flume-1.8.0]# mkdir fileCHK [root@bigdata1 flume-1.8.0]# mkdir fileData1.2.4 查看/殺死Flume進(jìn)程的方式
查看Flume的方式:
[root@bigdata1 flume-1.8.0]# grep flume | grep -v grep殺死Flume的方式:
[root@bigdata1 flume-1.8.0]# kill -9 `ps -ef | grep flume | grep -v grep | awk '{print $2}'`1.2.5 Conf文件配置
進(jìn)入conf文件夾,創(chuàng)建采集日志的配置文件
[xxx@xxx]# vim file-collect-logs.conf內(nèi)容是:
#定義agent各個組件的名稱 a1.sources=r1 a1.sinks=k1 a1.channels=c1#描述source端 a1.sources.r1.type=exec #要注意的是,這里使用的是-F,只有這樣才能保證nginx日志文件變化之后,不會出錯 a1.sources.r1.command=tail -n +0 -F /var/log/nginx/tomcat_access.log a1.sources.r1.channels=c1 #a1.sources.r1.restart=true #a1.sources.r1.restartThrottle=5000 a1.sources.r1.threads=100#Describe the sink ##type設(shè)置成avro來設(shè)置發(fā)消息 a1.sinks.k1.type = avro a1.sinks.k1.channel = c1 ##下沉到bigdata1這臺機(jī)器 a1.sinks.k1.hostname = xxx.xxx.xxx.xxx ##下沉到bigdata1中的4141 a1.sinks.k1.port = 4141 (此處和線上配置不一致) a1.sinks.k1.batch-size = 10000#使用File通道 a1.channels.c1.type=file a1.channels.c1.checkpointDir=/usr/local/work/apache-flume-1.8.0-bin/fileCHK a1.channels.c1.dataDirs=/usr/local/work/apache-flume-1.8.0-bin/fileData a1.channels.c1.keep-alive=601.2.6 Flume啟動
采集端配置好之后,等待接收端Flume啟動后,啟動采集端Flume,啟動方式是:
[x@xxx apache-flume-1.8.0-bin] cd /xxx/apache-flume-1.8.0-bin [x@xxx apache-flume-1.8.0-bin] nohup bin/flume-ng agent -c conf -f conf/file-collect-logs.conf -n a1 -Dflume.root.logger=INFO,console &其中殺死進(jìn)程的方式:
kill -9 `ps -ef | grep flume | grep -v grep | awk '{print $2}'`要注意的是:
在Flume修改配置之后是不需要重啟Flume的。直接保存配置文件即可讓配置啟用。
1.3 Agent4 avro接收端Flume參數(shù)配置
1.3.1 前期準(zhǔn)備
運(yùn)行Flume-1.8.0的時候,需要JDK,否則會報(bào)錯。修改jdk位置:
[root@bigdata1 conf]# cd /home/bigdata/installed/flume-1.8.0/conf [root@bigdata1 conf]# vim flume-env.sh export JAVA_HOME=/home/bigdata/installed/jdk1.8.0_731.3.2 配置Flume內(nèi)存參數(shù)
參考1.2.1
1.3.3 創(chuàng)建文件夾
進(jìn)入Flume所在位置,創(chuàng)建fileCHK 和 fileData
[root@bigdata1 flume-1.8.0]# cd /xxxx/installed/flume-1.8.0 [root@bigdata1 flume-1.8.0]# ll 總用量 6360 drwxrwxrwx 2 bigdata bigdata 62 3月 22 10:46 bin -rwxrwxrwx 1 bigdata bigdata 81264 9月 15 2017 CHANGELOG drwxrwxrwx 2 bigdata bigdata 286 6月 5 21:10 conf -rwxrwxrwx 1 bigdata bigdata 5681 9月 15 2017 DEVNOTES -rwxrwxrwx 1 bigdata bigdata 2873 9月 15 2017 doap_Flume.rdf drwxrwxrwx 10 bigdata bigdata 4096 9月 15 2017 docs drwxr-xr-x 3 root root 123 6月 11 15:51 fileCHK drwxr-xr-x 2 root root 170 6月 11 17:18 fileData drwxrwxrwx 2 bigdata bigdata 8192 3月 22 10:46 lib -rwxrwxrwx 1 bigdata bigdata 27663 9月 15 2017 LICENSE drwxr-xr-x 2 root root 23 5月 15 14:47 logs -rw------- 1 root root 4121563 6月 11 17:18 nohup.out -rwxrwxrwx 1 bigdata bigdata 249 9月 15 2017 NOTICE -rwxrwxrwx 1 bigdata bigdata 2483 9月 15 2017 README.md -rwxrwxrwx 1 bigdata bigdata 1588 9月 15 2017 RELEASE-NOTES drwxrwxrwx 2 bigdata bigdata 68 3月 22 10:46 tools -rw-r--r-- 1 root root 1242266 6月 11 16:20 zookeeper.out [root@bigdata1 flume-1.8.0]# 創(chuàng)建fileCHK 和 fileData [root@bigdata1 flume-1.8.0]# cd /xxxxx/apache-flume-1.8.0-bin [root@bigdata1 flume-1.8.0]# mkdir fileCHK [root@bigdata1 flume-1.8.0]# mkdir fileData1.3.4 查看/殺死Flume進(jìn)程的方式
參看1.2.4
1.3.5 編寫Flume sink—>hdfs的配置文件
[root@bigdata1 conf]# cd /home/bigdata/installed/flume-1.8.0/conf [root@bigdata1 conf]# vim avro-collect-logger.conf具體內(nèi)容如下:
#定義agent中的各各組件 a1.sources = r1 a1.sinks = k1 a1.channels = c1##描述和配置source端 ##source中的avro組件是一個接收者服務(wù) a1.sources.r1.type = avro a1.sources.r1.channels = c1 #這里的bigdata1是機(jī)器hostname,可以寫成ip地址。外界調(diào)用的時候,可以使用這個ip和下面的端口號port聯(lián)合調(diào)用 a1.sources.r1.bind = bigdata1 a1.sources.r1.port = 4141 a1.sources.r1.threads = 100# Describe the sink ## 表示下沉到hdfs,類型決定了下面的參數(shù) a1.sinks.k1.type = hdfs ## hdfs目錄路徑 a1.sinks.k1.hdfs.path = /nginx/%y-%m-%d ##寫入hdfs的文件名前綴,可以使用flume提供的日期及%{host}表達(dá)式 a1.sinks.k1.hdfs.filePrefix = events- ## 表示到了需要觸發(fā)的時間時,是否要更新文件夾,true:表示要 a1.sinks.k1.hdfs.round = true #多久時間后close hdfs文件。單位是秒,默認(rèn)30秒。設(shè)置為0的話表示不根據(jù)時間close hdfs文件 #配置下面的參數(shù),表示40分鐘滾動一次 a1.sinks.k1.hdfs.rollInterval = 3600 ## 表示每隔value分鐘改變一次(在0~24之間) #a1.sinks.k1.hdfs.roundValue = 0 ## 切換文件的時候的時間單位是分鐘 #a1.sinks.k1.hdfs.roundUnit = minute ## 文件大小超過一定值后,close文件。默認(rèn)值1024,單位是字節(jié)。設(shè)置為0的話表示不基于文件大小,134217728表示128m ## 0表示不按照文件大小進(jìn)行滾動。 a1.sinks.k1.hdfs.rollSize = 0 ## 寫入了多少個事件后close文件。默認(rèn)值是10個。設(shè)置為0的話表示不基于事件個數(shù) a1.sinks.k1.hdfs.rollCount = 0 ## 批次數(shù),HDFS Sink每次從Channel中拿的事件個數(shù)。默認(rèn)值100 a1.sinks.k1.hdfs.batchSize = 100000 ## 使用本地時間戳 a1.sinks.k1.hdfs.useLocalTimeStamp = true #生成的文件類型,默認(rèn)是Sequencefile,可用DataStream:為普通文本 a1.sinks.k1.hdfs.fileType = DataStream #HDFS操作允許的時間,比如hdfs文件的open,write,flush,close操作。單位是毫秒,默認(rèn)值是10000,一小時為:3600000,這里稍微設(shè)置的大寫 a1.sinks.k1.hdfs.callTimeout = 7200000 a1.sinks.k1.hdfs.writeFormat = Text #配置這個參數(shù)之后,不會因?yàn)槲募趬K的復(fù)制而滾動文件了,只會根據(jù)你的配置項(xiàng)來滾動文件了。 #設(shè)置這個參數(shù)之后,上面的rollInterval、rollSize、rollCount等才會起作用。#hdfs.minBlockReplicas是為了讓flume感知不到hdfs的塊復(fù)制,這樣滾動配置才不會受影響。 #假如hdfs的副本為3.那么配置的滾動時間為10秒,那么在第二秒的時候,flume檢測到hdfs在復(fù)制塊,那么這時候flume就會滾動 #這樣導(dǎo)致flume的滾動方式受到影響。所以配置flume hdfs.minBlockReplicas配置為1,就檢測不到副本的復(fù)制了。但是hdfs的副本還是3 a1.sinks.k1.hdfs.minBlockReplicas=1#描述channel,適用場景是要求并發(fā)高,并且機(jī)器內(nèi)存足夠,丟失數(shù)據(jù)不會很影響總體結(jié)果的場景。但是重啟和宕機(jī),數(shù)據(jù)會丟失。 #配置不好的時候,會出現(xiàn)內(nèi)存等的問題。 #a1.channels.c1.type=memory #a1.channels.c1.capacity=10000 #a1.channels.c1.transactionCapacity=10000 #a1.channels.c1.byteCapacityBufferPercentage = 20 #a1.channels.c1.byteCapacity = 800000 #a1.channels.c1.keep-alive = 60#適用場景,并發(fā)要求不高,要求硬盤足夠即可,數(shù)據(jù)最后存在file中的,機(jī)器重啟ls 或flume重啟,只要調(diào)整參數(shù),可以保證數(shù)據(jù)不丟失。 a1.channels.c1.type=file a1.channels.c1.checkpointDir=/home/bigdata/installed/flume-1.8.0/fileCHK a1.channels.c1.dataDirs=/home/bigdata/installed/flume-1.8.0/fileData a1.channels.c1.keep-alive=60 a1.channels.c1.capacity=10000000 a1.channels.c1.transactionCapacity=10000000#綁定source和sink到channel a1.sources.r1.channels = c1 a1.sinks.k1.channel = c11.3.6 Flume啟動
[root@bigdata1 flume-1.8.0]# cd /home/bigdata/installed/flume-1.8.0 [root@bigdata1 flume-1.8.0]# nohup bin/flume-ng agent -c conf -f conf/avro-collect-logger.conf -n a1 -Dflume.root.logger=INFO,console &1.3.7 查看未關(guān)閉的塊
hadoop fsck -openforwrite | more 查看未關(guān)閉塊1.3.8 查看運(yùn)行日志
可以通過查看nohup.out的方式查看運(yùn)行日志。
總結(jié)
以上是生活随笔為你收集整理的Flume日志采集,avro采集,以及通过参数控制下沉到hdfs的文件大小,时间等控制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中信银行转账怎么这么慢
- 下一篇: 恒铭达有些什么产品 消费电子精密功能性器