Flume與Kafka整合--扇入、扇出功能整合,其中扇出包括:複製流、複用流

loveheping發表於2018-03-31
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、下載安裝介質,並解壓:

點選(此處)摺疊或開啟

  1. cd /software
  2. wget http://archive.cloudera.com/cdh5/cdh/5/flume-ng-1.6.0-cdh5.7.0.tar.gz
  3. tar -zxvf flume-ng-1.6.0-cdh5.7.0.tar.gz -C /app/
 2.1.2、配置flume工作
點選(此處)摺疊或開啟
  1. cd /app/apache-flume-1.6.0-cdh5.7.0-bin/conf
  2. cp flume-env.sh.template flume-env.sh
  3. vi flume-env.sh 【增加Java Home路徑】
  4. export JAVA_HOME=/usr/java/jdk1.8.0_151
退出儲存:(:wq!)

點選(此處)摺疊或開啟

  1. vi ~/.bash_profile
  2. export FLUME_HOME=/app/apache-flume-1.6.0-cdh5.7.0-bin
  3. export PATH=$FLUME_HOME/bin:$PATH
退出儲存:(:wq!)==>生效:source ~/.bash_profile
           
2.1.3、驗證flume安裝,編寫配置檔案

   新建example.conf檔案,注此配置輸入源為netcat,通道為memory,輸出為logger
vi  example.conf
點選(此處)摺疊或開啟
  1. # example.conf: A single-node Flume configuration
  2. # Name the components on this agent
  3. a1.sources = r1
  4. a1.sinks = k1
  5. a1.channels = c1
  6. # Describe/configure the source
  7. a1.sources.r1.type = netcat
  8. a1.sources.r1.bind = 192.168.137.130
  9. a1.sources.r1.port = 44444
  10. # Describe the sink
  11. a1.sinks.k1.type = logger
  12. a1.sinks.k1.maxBytesToLog = 10
  13. # Use a channel which buffers events in memory
  14. a1.channels.c1.type = memory
  15. # Bind the source and sink to the channel
  16. a1.sources.r1.channels = c1
  17. a1.sinks.k1.channel = c1
退出儲存:(:wq!)

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、下載安裝介質,並解壓:
點選(此處)摺疊或開啟
  1. cd /software
  2. wget
  3. tar -zxvf kafka_2.11-0.10.0.1.tgz -C /app/
 2.2.2、配置kafka工作
     注:1、因Kafka把它的meta資料都儲存在ZK上,所以說ZK是他的必要存在沒有ZK沒法執行Kafka;在老版本(0.8.1以前)裡面消費段(consumer)也是依賴ZK的,在新版本中移除了客戶端對ZK的依賴,但是broker依然依賴於ZK。所以必須在kafka配置前部署完成ZK,此文不對ZK進行演示,請另行引數ZK部署文件。
            2、在搭建kafka叢集時,注意對等性部署,否則會存在問題

點選(此處)摺疊或開啟

  1. cd /app/kafka_2.11-0.10.0.1/config
  2. vi server.properties
  3.   #broker的ID,在叢集中需要唯一
  4.   broker.id=1
  5.   
  6.   #Socket Server端號
  7.   port=9082
  8.   
  9.   #Socket Server服務IP地址
  10.   host.name=192.168.137.132

  11.   #kafka日誌檔案儲存
  12.   log.dirs=/app/kafka_2.11-0.10.0.1/kafka-logs
  13.   
  14.   #連線ZK存放kafka後設資料位置
  15.   zookeeper.connect=192.168.137.132:2181,192.168.137.133:2181,192.168.137.134:2181/kafka
退出儲存:(:wq!)

#建立日誌檔案存放目錄

點選(此處)摺疊或開啟

  1. mkdir -p /app/kafka_2.11-0.10.0.1/kafka-logs
#增加kafka環境變數
點選(此處)摺疊或開啟
  1. vi ~/.bash_profile
  2. export KAFKA_HOME=/app/kafka_2.11-0.10.0.1
  3. export PATH=$KAFKA_HOME/bin:$PATH
退出儲存:(:wq!)
生效環境變更:source ~/.bash_profile

2.2.3、將kafka複製到其它兩臺伺服器中

點選(此處)摺疊或開啟

  1. cd /app
  2. scp -r kafka_2.11-0.10.0.1 192.168.137.133:/app/
  3. scp -r kafka_2.11-0.10.0.1 192.168.137.134:/app/
  4. 注:進入192.168.137.133與134伺服器,將對應的broker.id、port、host.name改為當前伺服器在叢集中對應的值
2.2.4、驗證kafka安裝

點選(此處)摺疊或開啟

  1. ##建立topic
  2. kafka-topics.sh --create \
  3. --zookeeper 192.168.137.132:2181,192.168.137.133:2181,192.168.137.134:2181/kafka \
  4. --replication-factor 3 --partitions 3 --topic test
  5. ##啟動資料傳送者
  6. kafka-console-producer.sh \
  7. --broker-list 192.168.137.132:9082,192.168.137.133:9082,192.168.137.134:9082 --topic test
  8. ##啟動資料消費者
  9. kafka-console-consumer.sh \
  10. --zookeeper 192.168.137.132:2181,192.168.137.133:2181,192.168.137.134:2181/kafka \
  11. --from-beginning --topic test
驗證見圖:



此kafka部署與測試完成

2.3、flume+kafka扇入測試(扇入源為:netcat+kafka;輸出以Flume的Logger型別輸出)

結構圖:

2.3.1、配置flume的agent資訊(在192.168.137.130服務中)

點選(此處)摺疊或開啟

  1. cd /app/apache-flume-1.6.0-cdh5.7.0-bin
  2. vi netcatOrKafka-memory-logger.conf
  3.     a1.sources = r1 r2
  4.     a1.channels = c1
  5.     a1.sinks = k1
  6.     
  7.     a1.sources.r2.type = netcat
  8.     a1.sources.r2.bind = 0.0.0.0
  9.     a1.sources.r2.port = 44444
  10.     
  11.     a1.sources.r1.type = org.apache.flume.source.kafka.KafkaSource
  12.     a1.sources.r1.zookeeperConnect = 192.168.137.132:2181,192.168.137.133:2181,192.168.137.134:2181/kafka
  13.     a1.sources.r1.groupId = testGroup
  14.     a1.sources.r1.topic = test
  15.     a1.sources.r1.kafka.consumer.timeout.ms = 100
  16.     #a1.sources.r1.zookeeper.session.timeout.ms=400
  17.     #a1.sources.r1.zookeeper.sync.time.ms=200
  18.     #a1.sources.r1.auto.commit.interval.ms=1000
  19.     #a1.sources.r1.custom.topic.name=test
  20.     #a1.sources.r1.custom.thread.per.consumer=4
  21.     
  22.     a1.channels.c1.type = memory
  23.     a1.channels.c1.capacity = 1000
  24.     a1.channels.c1.transactionCapacity = 100
  25.     
  26.     a1.sinks.k1.type = logger
  27.     
  28.     a1.sources.r1.channels = c1
  29.     a1.sources.r2.channels = c1
  30.     a1.sinks.k1.channel = c1
2.3.2、啟動各測試命令:
    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傳送結果
 kafka傳送結果
 最終logger接收結果

           至此flume+kafka扇入測試(扇入源為:netcat+kafka;輸出以Flume的Logger型別輸出)測試與驗證完成。

2.4、flume+kafka扇出--複製流測試(扇入源為:netcat;輸出為:kafka+Flume的Logger)
    結構圖:
 
2.4.1、配置flume的agent資訊(在192.168.137.130服務中):
點選(此處)摺疊或開啟
  1. cd /app/apache-flume-1.6.0-cdh5.7.0-bin
  2. vi netcatOrKafka-memory-logger.conf
  3.     netcatagent.sources = netcat_sources
  4.     netcatagent.channels = c1 c2
  5.     netcatagent.sinks = logger_sinks kafka_sinks
  6.     
  7.     netcatagent.sources.netcat_sources.type = netcat
  8.     netcatagent.sources.netcat_sources.bind = 0.0.0.0
  9.     netcatagent.sources.netcat_sources.port = 44444
  10.     
  11.     netcatagent.channels.c1.type = memory
  12.     netcatagent.channels.c1.capacity = 1000
  13.     netcatagent.channels.c1.transactionCapacity = 100
  14.     
  15.     netcatagent.channels.c2.type = memory
  16.     netcatagent.channels.c2.capacity = 1000
  17.     netcatagent.channels.c2.transactionCapacity = 100
  18.     
  19.     netcatagent.sinks.logger_sinks.type = logger
  20.     
  21.     netcatagent.sinks.kafka_sinks.type = org.apache.flume.sink.kafka.KafkaSink
  22.     netcatagent.sinks.kafka_sinks.topic = test
  23.     netcatagent.sinks.kafka_sinks.brokerList = 192.168.137.132:9082,192.168.137.133:9082,192.168.137.134:9082
  24.     netcatagent.sinks.kafka_sinks.requiredAcks = 0
  25.     ##netcatagent.sinks.kafka_sinks.batchSize = 20
  26.     netcatagent.sinks.kafka_sinks.producer.type=sync
  27.     netcatagent.sinks.kafka_sinks.custom.encoding=UTF-8
  28.     netcatagent.sinks.kafka_sinks.partition.key=0
  29.     netcatagent.sinks.kafka_sinks.serializer.class=kafka.serializer.StringEncoder
  30.     netcatagent.sinks.kafka_sinks.partitioner.class=org.apache.flume.plugins.SinglePartition
  31.     netcatagent.sinks.kafka_sinks.max.message.size=1000000
  32.     
  33.     netcatagent.sources.netcat_sources.selector.type = replicating
  34.     
  35.     netcatagent.sources.netcat_sources.channels = c1 c2
  36.     netcatagent.sinks.logger_sinks.channel = c1
  37.     netcatagent.sinks.kafka_sinks.channel = c2
2.4.2、啟動各測試命令:
   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傳送結果
kafka消費結果
最終logger接收結果
         
   至此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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章