Flume與Kafka整合--扇入、扇出功能整合,其中扇出包括:複製流、複用流
Flume與Kafka整合--扇入、扇出功能整合,其中扇出包括:複製流、複用流
一、概念
1、Flume:Cloudera 開發的分散式日誌收集系統,是一種分散式,可靠且可用的服務,用於高效地收集,彙總和移動大量日誌資料。 它具有基於流式資料流的簡單而靈活的架構。它具有可靠的可靠性機制和許多故障轉移和恢復機制,具有強大的容錯性和容錯能力。它使用一個簡單的可擴充套件資料模型,允許線上分析應用程式。Flume分為OG、NG版本,其中Flume OG 的最後一個發行版本 0.94.0,之後為NG版本。
2、Kafka:作為一個叢集執行在一臺或多臺可以跨越多個資料中心的伺服器上。在Kafka中,客戶端和伺服器之間的通訊是透過一種簡單的,高效能的,語言不可知的TCP協議完成的。協議是版本控制的,並保持與舊版本的向後相容性。Kafka提供Java客戶端,但客戶端可以使用多種語言。
3、Kafka通常用於兩大類應用,如下:
A、構建可在系統或應用程式之間可靠獲取資料的實時流資料管道
B、構建實時流應用程式,用於轉換或響應資料流
C、Kafka每個記錄由一個鍵,一個值和一個時間戳組成。
二、產述背景
基於大資料領域實現日誌資料時時採集及資料傳遞等需要,據此需求下試著完成flume+kafka扇入、扇出功能整合,其中扇出包括:複製流、複用流等功能性測試。後續根據實際需要,將完善kafka與spark streaming進行整合整理工作。
注:此文件僅限於功能性測試,效能最佳化方面請大家根據實際情況增加。
三、部署安裝
1、測試環境說明:
作業系統:CentOS 7
Flume版本:flume-ng-1.6.0-cdh5.7.0
Kafka版本:kafka_2.11-0.10.0.1
JDK版本:JDK1.8.0
Scala版本:2.11.8
2、測試步驟:
2.1、flume部署
2.1.1、下載安裝介質,並解壓:
點選(此處)摺疊或開啟
-
cd /software
-
wget http://archive.cloudera.com/cdh5/cdh/5/flume-ng-1.6.0-cdh5.7.0.tar.gz
- tar -zxvf flume-ng-1.6.0-cdh5.7.0.tar.gz -C /app/
點選(此處)摺疊或開啟
-
cd /app/apache-flume-1.6.0-cdh5.7.0-bin/conf
-
cp flume-env.sh.template flume-env.sh
-
vi flume-env.sh 【增加Java Home路徑】
- export JAVA_HOME=/usr/java/jdk1.8.0_151
點選(此處)摺疊或開啟
-
vi ~/.bash_profile
-
export FLUME_HOME=/app/apache-flume-1.6.0-cdh5.7.0-bin
- export PATH=$FLUME_HOME/bin:$PATH
2.1.3、驗證flume安裝,編寫配置檔案
新建example.conf檔案,注此配置輸入源為netcat,通道為memory,輸出為logger
vi example.conf
點選(此處)摺疊或開啟
- # example.conf: A single-node Flume configuration
- # Name the components on this agent
- a1.sources = r1
- a1.sinks = k1
- a1.channels = c1
- # Describe/configure the source
- a1.sources.r1.type = netcat
- a1.sources.r1.bind = 192.168.137.130
- a1.sources.r1.port = 44444
- # Describe the sink
- a1.sinks.k1.type = logger
- a1.sinks.k1.maxBytesToLog = 10
- # Use a channel which buffers events in memory
- a1.channels.c1.type = memory
- # Bind the source and sink to the channel
- a1.sources.r1.channels = c1
- a1.sinks.k1.channel = c1
2.1.4、測試驗證
啟動flume監聽程式:flume-ng agent --name a1 \
--conf $FLUME_HOME/conf \
--conf-file $FLUME_HOME/conf/example.conf -Dflume.root.logger=INFO,console
如圖資訊為正常啟動:
使用telnet測試:telnet 192.168.137.130 44444,在出現的輸入中輸入任何資訊。詳見:
然後檢視flume監控視窗返回資訊,詳見:
至此此flume部署與測試完成
2.2、kafka部署
2.2.1、下載安裝介質,並解壓:
點選(此處)摺疊或開啟
-
cd /software
-
wget
- tar -zxvf kafka_2.11-0.10.0.1.tgz -C /app/
注:1、因Kafka把它的meta資料都儲存在ZK上,所以說ZK是他的必要存在沒有ZK沒法執行Kafka;在老版本(0.8.1以前)裡面消費段(consumer)也是依賴ZK的,在新版本中移除了客戶端對ZK的依賴,但是broker依然依賴於ZK。所以必須在kafka配置前部署完成ZK,此文不對ZK進行演示,請另行引數ZK部署文件。
2、在搭建kafka叢集時,注意對等性部署,否則會存在問題
點選(此處)摺疊或開啟
-
cd /app/kafka_2.11-0.10.0.1/config
-
vi server.properties
-
#broker的ID,在叢集中需要唯一
-
broker.id=1
-
-
#Socket Server端號
-
port=9082
-
-
#Socket Server服務IP地址
-
host.name=192.168.137.132
-
-
#kafka日誌檔案儲存
-
log.dirs=/app/kafka_2.11-0.10.0.1/kafka-logs
-
-
#連線ZK存放kafka後設資料位置
- zookeeper.connect=192.168.137.132:2181,192.168.137.133:2181,192.168.137.134:2181/kafka
#建立日誌檔案存放目錄
點選(此處)摺疊或開啟
- mkdir -p /app/kafka_2.11-0.10.0.1/kafka-logs
點選(此處)摺疊或開啟
-
vi ~/.bash_profile
-
export KAFKA_HOME=/app/kafka_2.11-0.10.0.1
- export PATH=$KAFKA_HOME/bin:$PATH
生效環境變更:source ~/.bash_profile
2.2.3、將kafka複製到其它兩臺伺服器中
點選(此處)摺疊或開啟
-
cd /app
-
scp -r kafka_2.11-0.10.0.1 192.168.137.133:/app/
-
scp -r kafka_2.11-0.10.0.1 192.168.137.134:/app/
- 注:進入192.168.137.133與134伺服器,將對應的broker.id、port、host.name改為當前伺服器在叢集中對應的值
點選(此處)摺疊或開啟
-
##建立topic
-
kafka-topics.sh --create \
-
--zookeeper 192.168.137.132:2181,192.168.137.133:2181,192.168.137.134:2181/kafka \
-
--replication-factor 3 --partitions 3 --topic test
-
##啟動資料傳送者
-
kafka-console-producer.sh \
-
--broker-list 192.168.137.132:9082,192.168.137.133:9082,192.168.137.134:9082 --topic test
-
##啟動資料消費者
-
kafka-console-consumer.sh \
-
--zookeeper 192.168.137.132:2181,192.168.137.133:2181,192.168.137.134:2181/kafka \
- --from-beginning --topic test
至此kafka部署與測試完成
2.3、flume+kafka扇入測試(扇入源為:netcat+kafka;輸出以Flume的Logger型別輸出)
結構圖:
2.3.1、配置flume的agent資訊(在192.168.137.130服務中):
點選(此處)摺疊或開啟
-
cd /app/apache-flume-1.6.0-cdh5.7.0-bin
-
vi netcatOrKafka-memory-logger.conf
-
a1.sources = r1 r2
-
a1.channels = c1
-
a1.sinks = k1
-
-
a1.sources.r2.type = netcat
-
a1.sources.r2.bind = 0.0.0.0
-
a1.sources.r2.port = 44444
-
-
a1.sources.r1.type = org.apache.flume.source.kafka.KafkaSource
-
a1.sources.r1.zookeeperConnect = 192.168.137.132:2181,192.168.137.133:2181,192.168.137.134:2181/kafka
-
a1.sources.r1.groupId = testGroup
-
a1.sources.r1.topic = test
-
a1.sources.r1.kafka.consumer.timeout.ms = 100
-
#a1.sources.r1.zookeeper.session.timeout.ms=400
-
#a1.sources.r1.zookeeper.sync.time.ms=200
-
#a1.sources.r1.auto.commit.interval.ms=1000
-
#a1.sources.r1.custom.topic.name=test
-
#a1.sources.r1.custom.thread.per.consumer=4
-
-
a1.channels.c1.type = memory
-
a1.channels.c1.capacity = 1000
-
a1.channels.c1.transactionCapacity = 100
-
-
a1.sinks.k1.type = logger
-
-
a1.sources.r1.channels = c1
-
a1.sources.r2.channels = c1
- a1.sinks.k1.channel = c1
A、啟動flume的agent(於192.168.137.130):
flume-ng agent --name a1 --conf $FLUME_HOME/conf \
--conf-file $FLUME_HOME/conf/netcatOrKafka-memory-logger.conf \
-Dflume.root.logger=INFO,console
B、啟動kafka傳送者(於192.168.137.132):
kafka_2.11-0.10.0.1]$ kafka-console-producer.sh \
--broker-list 192.168.137.132:9082,192.168.137.133:9082,192.168.137.134:9082 \
--topic test
C、測試傳送(於192.168.137.130與於192.168.137.132)
telnet傳送結果
最終logger接收結果
至此flume+kafka扇入測試(扇入源為:netcat+kafka;輸出以Flume的Logger型別輸出)測試與驗證完成。
2.4、flume+kafka扇出--複製流測試(扇入源為:netcat;輸出為:kafka+Flume的Logger)
結構圖:
2.4.1、配置flume的agent資訊(在192.168.137.130服務中):
點選(此處)摺疊或開啟
-
cd /app/apache-flume-1.6.0-cdh5.7.0-bin
-
vi netcatOrKafka-memory-logger.conf
-
netcatagent.sources = netcat_sources
-
netcatagent.channels = c1 c2
-
netcatagent.sinks = logger_sinks kafka_sinks
-
-
netcatagent.sources.netcat_sources.type = netcat
-
netcatagent.sources.netcat_sources.bind = 0.0.0.0
-
netcatagent.sources.netcat_sources.port = 44444
-
-
netcatagent.channels.c1.type = memory
-
netcatagent.channels.c1.capacity = 1000
-
netcatagent.channels.c1.transactionCapacity = 100
-
-
netcatagent.channels.c2.type = memory
-
netcatagent.channels.c2.capacity = 1000
-
netcatagent.channels.c2.transactionCapacity = 100
-
-
netcatagent.sinks.logger_sinks.type = logger
-
-
netcatagent.sinks.kafka_sinks.type = org.apache.flume.sink.kafka.KafkaSink
-
netcatagent.sinks.kafka_sinks.topic = test
-
netcatagent.sinks.kafka_sinks.brokerList = 192.168.137.132:9082,192.168.137.133:9082,192.168.137.134:9082
-
netcatagent.sinks.kafka_sinks.requiredAcks = 0
-
##netcatagent.sinks.kafka_sinks.batchSize = 20
-
netcatagent.sinks.kafka_sinks.producer.type=sync
-
netcatagent.sinks.kafka_sinks.custom.encoding=UTF-8
-
netcatagent.sinks.kafka_sinks.partition.key=0
-
netcatagent.sinks.kafka_sinks.serializer.class=kafka.serializer.StringEncoder
-
netcatagent.sinks.kafka_sinks.partitioner.class=org.apache.flume.plugins.SinglePartition
-
netcatagent.sinks.kafka_sinks.max.message.size=1000000
-
-
netcatagent.sources.netcat_sources.selector.type = replicating
-
-
netcatagent.sources.netcat_sources.channels = c1 c2
-
netcatagent.sinks.logger_sinks.channel = c1
- netcatagent.sinks.kafka_sinks.channel = c2
A、啟動flume的agent(於192.168.137.130):
flume-ng agent --name netcatagent \
--conf $FLUME_HOME/conf \
--conf-file $FLUME_HOME/conf/netcat-memory-loggerToKafka.conf \
-Dflume.root.logger=INFO,console
B、啟動kafka消費者(於192.168.137.132):
kafka-console-consumer.sh \
--zookeeper 192.168.137.132:2181,192.168.137.133:2181,192.168.137.134:2181/kafka \
--from-beginning --topic test
C、測試傳送(於192.168.137.130與於192.168.137.132)
telnet傳送結果
至此flume+kafka扇出--複製流測試(扇入源為:netcat;輸出為:kafka+Flume的Logger)測試與驗證完成。
2.5、flume+kafka扇出--複用流測試(扇入源為:netcat;輸出為:kafka+Flume的Logger)
暫無,後續補充
四、部署安裝及驗證過程中出現的問題
1、做flume+kafka扇入測試(扇入源為:netcat+kafka;輸出以Flume的Logger型別輸出)時,一直未收到kafka資料
主要原因是在做kafka的配置時在配置檔案(server.properties)中寫成內容:
zookeeper.connect=192.168.137.132:2181,192.168.137.133:2181,192.168.137.134:2181
但在建立topics時,使用的是:
kafka-topics.sh --create \
--zookeeper 192.168.137.132:2181,192.168.137.133:2181,192.168.137.134:2181/kafka \
--replication-factor 3 --partitions 3 --topic test
其中在kafka的配置檔案中zookeeper配置未加/kakfa,但在建立topics的時增加了/kafka
最終使用:
kafka-console-producer.sh \
--broker-list 192.168.137.132:9092,192.168.137.133:9092,192.168.137.134:9092 \
--topic test
命令檢查沒有topics資訊才發現此問題
解決辦法:將兩個資訊同步即可
2、做flume+kafka扇入測試(扇入源為:netcat+kafka;輸出以Flume的Logger型別輸出)時,啟動flume的agent時報錯。
2018-03-31 10:43:31,241 (conf-file-poller-0) [ERROR - org.apache.flume.node.PollingPropertiesFileConfigurationProvider$FileWatcherRunnable.run(PollingPropertiesFileConfigurationProvider.java:142)] Failed to load configuration data. Exception follows.
org.apache.flume.FlumeException: Unable to load source type: org.apache.flume.source.kafka,KafkaSource, class: org.apache.flume.source.kafka,KafkaSource
at org.apache.flume.source.DefaultSourceFactory.getClass(DefaultSourceFactory.java:69)
at org.apache.flume.source.DefaultSourceFactory.create(DefaultSourceFactory.java:42)
at org.apache.flume.node.AbstractConfigurationProvider.loadSources(AbstractConfigurationProvider.java:322)
at org.apache.flume.node.AbstractConfigurationProvider.getConfiguration(AbstractConfigurationProvider.java:97)
at org.apache.flume.node.PollingPropertiesFileConfigurationProvider$FileWatcherRunnable.run(PollingPropertiesFileConfigurationProvider.java:140)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: org.apache.flume.source.kafka,KafkaSource
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at org.apache.flume.source.DefaultSourceFactory.getClass(DefaultSourceFactory.java:67)
... 11 more
解決辦法:官網資料存在問題,org.apache.flume.source.kafka,KafkaSource其中不應該包括逗號,改為:org.apache.flume.source.kafka.KafkaSource即可。詳細官網
五、總結
【來自@若澤大資料】
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31511218/viewspace-2152461/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 針對flume中扇出複用(源exec)原始碼修改,並編譯flume原始碼編譯
- 【PG流複製】Postgresql流複製主備切換SQL
- oracle 流複製Oracle
- Flume 整合 Kafka_flume 到kafka 配置【轉】Kafka
- kafka+flume的整合Kafka
- Postgres 流複製配置
- [翻譯]akka in action之akka-stream ( 3 使用Graph DSL實現扇入扇出 )
- 【PG流複製】Postgresql流複製部署過程及效能測試SQL
- Postgresql 9.6 搭建 非同步流複製 和 同步流複製 詳細教程SQL非同步
- 2. PostgreSQL 流複製SQL
- Oracle流複製技術Oracle
- pg流複製備份
- [zt] 高階複製、流複製(Streams)、備庫區別
- MongoDB 重新同步複製整合員MongoDB
- PostGreSql 12.6 的流複製(CentOS)SQLCentOS
- [java IO流]之檔案複製Java
- postgresql 9.4 流複製簡單配置SQL
- ORACLE流複製技術介紹Oracle
- 流複製管理手冊總結
- 如何配置 pglogical | PostgreSQL 的流複製SQL
- 四層高速dsp開發板製作6——過孔扇出與佈線
- 檔案的複製通過字元流和緩衝流(Buffered)字元
- Java IO 流之拷貝(複製)檔案Java
- Docker 搭建KingbaseES主備流複製Docker
- Storm與kafka整合ORMKafka
- PostgreSQL DBA(126) - PG 12(搭建流複製)SQL
- java 位元組流檔案複製方法總結Java
- PostgreSQL DBA(31) - Backup&Recovery#4(搭建流複製)SQL
- Java I/O流 複製檔案速度對比Java
- PG 流複製的隱患以及處理措施
- 大資料流處理:Flume、Kafka和NiFi對比大資料KafkaNifi
- Cassandra與Kafka的整合Kafka
- Elasticsearch 與 Kafka 整合剖析ElasticsearchKafka
- 大資料03-整合 Flume 和 Kafka 收集日誌大資料Kafka
- 資料採集元件:Flume基礎用法和Kafka整合元件Kafka
- js複製功能JS
- Kafka應用實踐與生態整合Kafka
- PostgreSQL 13 同步流複製(#2.4)-202104SQL