目錄
1. Flume介紹
Flume是Cloudera提供的一個分佈式、可靠、和高可用的海量日誌採集、聚合和傳輸的日誌收集系統,支持在日誌系統中定製各類數據發送方,用於收集數據;同時,Flume提供對數據進行簡單處理,並寫到各種數據接受方(可定製)的能力。
1.1 Flume數據源以及輸出方式
Flume提供了從console(控制檯)、RPC(Thrift-RPC)、text(文件)、tail(UNIX tail)、syslog(syslog日誌系統,支持TCP和UDP等2種模式),exec(命令執行)等數據源上收集數據的能力,在我們的系統中目前使用exec方式進行日誌採集。
Flume的數據接受方,可以是console(控制檯)、text(文件)、dfs(HDFS文件)、RPC(Thrift-RPC)和syslogTCP(TCP syslog日誌系統)等。本測試研究中由kafka來接收數據。
1.2 Flume的核心概念
1. Agent:使用JVM運行Flume。每臺機器運行一個agent,但是可以在一個agent中包含多個sources和sinks。
2. Client:生產數據,運行在一個獨立的線程。
3. Source:從Client收集數據,傳遞給Channel。
4. Sink:從Channel收集數據,運行在一個獨立線程。
5. Channel:連接 sources和 sinks ,這個有點像一個隊列。
6. Events :可以是日誌記錄、 avro對象等。
1.3 結構
Flume以agent爲最小的獨立運行單位。一個agent就是一個JVM。單agent由Source、Sink和Channel三大組件構成,如下圖:
Flume提供了大量內置的Source、Channel和Sink類型。不同類型的Source,Channel和Sink可以自由組合。組合方式基於用戶設置的配置文件,非常靈活。比如:Channel可以把事件暫存在內存裏,也可以持久化到本地硬盤上。Sink可以把日誌寫入HDFS, HBase,甚至是另外一個Source等等。Flume支持用戶建立多級流,也就是說,多個agent可以協同工作,並且支持Fan-in、Fan-out、ContextualRouting、Backup Routes。如下圖所示:
1.4 安裝測試
解壓apache-flume-1.6.0-bin.tar.gz:tar –zxvf apache-flume-1.6.0-bin.tar.gz
cp conf/flume-conf.properties.template conf/exec.conf
cp conf/flume-env.sh.template conf/flume-env.sh 配置JAVA_HOME
exec.conf配置如下:
a2.sources = r2
a2.sinks = k2
a2.channels = c2
# Describe/configure the source
a2.sources.r2.type = exec
a2.sources.r2.channels = c2
a2.sources.r2.command=tail -n +0 -F /usr/local/hadoop/flume/test.log
# Describe the sink
a2.sinks.k2.type = logger
# Use a channel which buffers events in memory
a2.channels.c2.type = memory
a2.channels.c2.capacity = 1000
a2.channels.c2.transactionCapacity = 100
# Bind the source and sink to the channel
a2.sources.r2.channels = c2
a2.sinks.k2.channel = c2
驗證安裝:flume-ng version
1.5 啓動flume
flume-ng agent --conf ./flume/conf/ -f ./flume/conf/exec.conf-Dflume.root.logger=DEBUG,console -n a2
發送數據和flume接收數據:
2.Kafka介紹
2.1 產生背景
Kafka 是分佈式發佈-訂閱消息系統。它最初由 LinkedIn 公司開發,使用 Scala語言編寫,之後成爲 Apache 項目的一部分。Kafka是一個分佈式的,可劃分的,多訂閱者,冗餘備份的持久性的日誌服務。它主要用於處理活躍的流式數據。
在大數據系統中,常常會碰到一個問題,整個大數據是由各個子系統組成,數據需要在各個子系統中高性能,低延遲的不停流轉。傳統的企業消息系統並不是非常適合大規模的數據處理。爲了已在同時搞定在線應用(消息)和離線應用(數據文件,日誌)Kafka 就出現了。Kafka 可以起到兩個作用:
降低系統組網複雜度
降低編程複雜度,各個子系統不在是相互協商接口,各個子系統類似插口插在插座上,Kafka 承擔高速數據總線的作用。
2.2 部署結構
2.3 集羣架構
2.4 基本概念
Topic:特指 Kafka 處理的消息源(feeds of messages)的不同分類。
Partition:Topic 物理上的分組,一個topic 可以分爲多個 partition,每個 partition 是一個有序的隊列。partition 中的每條消息都會被分配一個有序的id(offset)。
Message:消息,是通信的基本單位,每個 producer 可以向一個 topic(主題)發佈一些消息。
Producers:消息和數據生產者,向 Kafka的一個 topic 發佈消息的過程叫做 producers。
Consumers:消息和數據消費者,訂閱 topics 並處理其發佈的消息的過程叫做 consumers。
Broker:緩存代理,Kafa 集羣中的一臺或多臺服務器統稱爲broker。
2.5 安裝測試
解壓Kafka: tar -xzf kafka_2.10-0.8.1.1.tgz
啓動ZK bin/zookeeper-server-start.shconfig/zookeeper.properties
啓動服務bin/kafka-server-start.sh config/server.properties>/dev/null 2>&1&
創建主題 bin/kafka-topics.sh --create --zookeeperlocalhost:2181 --replication-factor 1 --partitions 1 --topic test
查看主題 bin/kafka-topics.sh --list --zookeeperlocalhost:2181
查看主題詳情 bin/kafka-topics.sh--describe --zookeeper localhost:2181 --topic test
刪除主題 bin/kafka-run-class.shkafka.admin.DeleteTopicCommand --topic test --zookeeper localhost:2181
創建生產者bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
創建消費者bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test--from-beginning
3.Flume和Kafka整合
3.1 兩者整合優勢
Flume更傾向於數據傳輸本身,Kakfa是典型的消息中間件用於解耦生產者消費者。
具體架構上,Agent並沒把數據直接發送到Kafka,在Kafka前面有層由Flume構成的forward。這樣做有兩個原因:
Kafka的API對非JVM系的語言支持很不友好,forward對外提供更加通用的HTTP接口。
forward層可以做路由、Kafka topic和Kafkapartition key等邏輯,進一步減少Agent端的邏輯。
數據有數據源到flume再到Kafka時,數據一方面可以同步到HDFS做離線計算,另一方面可以做實時計算。本文實時計算採用SparkStreaming做測試。
3.2 Flume和Kafka整合安裝
Flume和Kafka插件包下載:https://github.com/beyondj2ee/flumeng-kafka-plugin
提取插件中的flume-conf.properties文件:修改如下:flume源採用exec
producer.sources.s.type = exec
producer.sources.s.command=tail -f -n+1/usr/local/Hadoop/flume/test.log
producer.sources.s.channels = c
修改producer代理的topic爲test
將配置放到flume/cong/producer.conf中
複製插件包中的jar包到flume/lib中:刪除掉版本不同的相同jar包,這裏需要刪除scala-compiler-z.9.2.jar包,否則flume啓動會出現問題。
複製kafka/libs中的jar包到flume/lib中。
完整producer.conf:
producer.conf:
#agentsection
producer.sources= s
producer.channels= c
producer.sinks= r
#sourcesection
producer.sources.s.type= exec
#producer.sources.s.spoolDir= /usr/local/hadoop/flume/logs
#producer.sources.s.fileHeader= true
producer.sources.s.command= tail -f -n+1 /usr/local/hadoop/flume/aaa.log
producer.sources.s.channels= c
# Eachsink's type must be defined
producer.sinks.r.type= org.apache.flume.plugins.KafkaSink
producer.sinks.r.metadata.broker.list=localhost:9092
producer.sinks.r.partition.key=0
producer.sinks.r.partitioner.class=org.apache.flume.plugins.SinglePartition
producer.sinks.r.serializer.class=kafka.serializer.StringEncoder
producer.sinks.r.request.required.acks=0
producer.sinks.r.max.message.size=1000000
producer.sinks.r.producer.type=sync
producer.sinks.r.custom.encoding=UTF-8
producer.sinks.r.custom.topic.name=test
#Specifythe channel the sink should use
producer.sinks.r.channel= c
# Eachchannel's type is defined.
producer.channels.c.type= memory
producer.channels.c.capacity= 1000
producer.channels.c.transactionCapacity= 100
3.3 啓動kafka flume相關服務
啓動ZKbin/zookeeper-server-start.sh config/zookeeper.properties
啓動Kafka服務 bin/kafka-server-start.sh config/server.properties
創建消費者bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test--from-beginning
啓動flume
flume-ng agent --conf./flume/conf/ -f ./flume/conf/producer.conf -Dflume.root.logger=DEBUG,console-n producer
向flume發送數據:
Kafka消費者數據:
3.4 Kafka和SparkStreaming整合
核心代碼:
完整代碼路徑:
spark-1.4.0\examples\src\main\java\org\apache\spark\examples\streaming
執行參數:
發送數據:
由於flume採用exec數據源的方式,因此flume會監聽配置的相應的文件: tail -f -n+1 /usr/local/Hadoop/flume/aaa.log
當向該文件追加文件時,flume就會獲取追加的數據:
writetoflume.py
flume將獲取的增量數據由sink發送給kafka,以下是kafka comsumer消費的數據
執行結果:
SparkStreaming訂閱kafka的test主題的數據,將訂閱的數據進行單詞計數處理。