Flume+Kafka+SparkStreaming整合

目錄

1.Flume介紹.2

1.1 Flume數據源以及輸出方式.2

1.2 Flume的核心概念.2

1.3 Flume結構.2

1.4 Flume安裝測試.3

1.5 啓動flume4

2.Kafka介紹.4

2.1 Kafka產生背景.4

2.2 Kafka部署結構.4

2.3 Kafka集羣架構.4

2.4 Kafka基本概念.5

2.5 Kafka安裝測試.5

3.Flume和Kafka整合.6

3.1兩者整合優勢.6

3.2 Flume和Kafka整合安裝.6

3.3 啓動kafka flume相關服務.7

3.4 Kafka和SparkStreaming整合.8

 

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主題的數據,將訂閱的數據進行單詞計數處理。


 

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