Windows環境搭建Kafka步驟(VPN環境)

最近項目要用到kafka作爲集羣來處理生產和消費數據,這樣將業務邏輯和數據處理分離開,最大程度的提高了系統服務對數據處理的能力。

記錄一下自己整個kafka的環境搭建配置過程,以及如何去消費和生產kafka中的數據。

第一步:安裝jdk環境,去Oracle官網下載,我用的是jdk-8u181-windows-i586,因爲kafka是在java環境下運行的,配置jdk環境變量,此處不做過多闡述,具體如下:

JAVA_HOME=C:\Program Files (x86)\Java\jdk1.8.0_181

ClassPath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

在Path結尾追加   ;%JAVA_HOME%\bin;

第二步:下載zookeeper,下載地址http://mirrors.hust.edu.cn/apache/zookeeper/,我用的是zookeeper-3.4.10.tar.gz。解壓zookeeper到文件夾,我的是在E:\kafka\zookeeper。

  1. 找到E:\kafka\zookeeper\conf路徑下的zoo_sample.cfg文件,複製副本重命名一個文件爲zoo.cfg。
  2. 修改dataDir=E:\\kafka\\zookeeper\\data,注意一定要是雙斜線“\\”。
  3. 添加環境變量,新建ZOOKEEPER_HOME=E:\kafka\zookeeper。
  4. 在環境變量path後追加   ;%ZOOKEEPER_HOME%\bin;
  5. 以管理員身份打開cmd命令提示,直接輸入zkserver,服務會自動編譯啓動,如下圖:
  6. 注意此時已經打開zookeeper,不要關閉這個cmd窗口(修改cmb窗口名稱,可以在之前打開時輸入title zookeeper,這樣窗口頭title會變爲zookeeper)。
  7. 以後會不會考慮把這個做成服務的形式就不怕它關掉會銷燬了。

第三步:下載kafka安裝包,下載地址http://kafka.apache.org/downloads,我用的是kafka_2.12-0.11.0.0.tgz,將文件拷貝到跟zookeeperer同一父級目錄下,解壓到當前目錄下,地址E:\kafka\kafka。

  1. 找到E:\kafka\kafka\config修改server.properties文件中log.dirs=E:\\kafka\\kafka-logs。
  2. 修改zookeeper.connect=127.0.0.1:2181,一般默認都是2181端口,看你自己設定了。
  3. 最主要的一點,因爲我們的kafka環境是部署在虛擬機上面的,而虛擬機和自己的電腦之間走得是VPN通道,所以爲了能讓自己的電腦能在kafka上面生產和消費數據,這裏必須要增加一行記錄:
    # Hostname and port the broker will advertise to producers and consumers. If not set, 
    # it uses the value for "listeners" if configured.  Otherwise, it will use the value
    # returned from java.net.InetAddress.getCanonicalHostName().
    #advertised.listeners=PLAINTEXT://your.host.name:9092
    advertised.listeners=PLAINTEXT://x.x.x.x:9092

    這樣就能保證本機可以順利的訪問到kafak。

  4. 配置完畢,通過執行腳本命令,首先打開cmd窗口,定位到E:\kafka\kafka,或者在E:\kafka\kafka文件夾下,按住Shift+右鍵,選擇“打開命令窗口”選項,打開命令行,輸入:

    .\bin\windows\kafka-server-start.bat .\config\server.properties

  5. 這樣說已經正常運行kafka了,不要關閉。

第四步:測試,打開cmd窗口,定位到E:\kafka\kafka,或者在E:\kafka\kafka文件夾下,按住Shift+右鍵,選擇“打開命令窗口”選項,打開命令行,輸入:

.\bin\windows\kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic topic_test

創建topic成功,然後下一步我們就是要創建生產者producer和consumer。

第五步:打開cmd窗口,定位到E:\kafka\kafka,或者在E:\kafka\kafka文件夾下,按住Shift+右鍵,選擇“打開命令窗口”選項,打開命令行,輸入:

.\bin\windows\kafka-console-producer.bat --broker-list localhost:9092 --topic topic_test

我們生產了2條數據:message-01 and message-02。

第六步:我們可以通過代碼和工具的形式來查看生產的數據,並消費。

  1. kafka-tool工具,下載地址http://www.kafkatool.com/,配置很簡單

  2. 通過代碼進行數據消費:

無論是.net core或者是.net framework環境,在nuget中下載Kafka-Net,以.net core環境爲例:

在nuget中查找Kafka-Net,並安裝,kafka-net是提供.net framework環境使用,kafka-net-dotnetcore是專門提供.net core環境下使用的。

代碼引用之前官方一個例子:

        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            Consume("http://x.x.x.x:9092", "topic_test");
        }


        private static void Consume(string broker, string topic)
        {
            Uri[] UriArr = Array.ConvertAll<string, Uri>(broker.Split(','), delegate (string s) { return new Uri(s); });
            var options = new KafkaOptions(UriArr);
            var router = new BrokerRouter(options);
            var consumer = new KafkaNet.Consumer(new ConsumerOptions(topic, router));
            //實際生產環境中消費不是每次都從0 offset開始的,查了資料發現java可以設置自動參數配置從最小offset開始或者最大offset開始       
            //但kafka-net這個sdk中沒有找到,所以就下面這段代碼配置了offset的起始位置
            Task<List<OffsetResponse>> offTask = consumer.GetTopicOffsetAsync(topic);
            var offsetResponseList = offTask.Result;
            var positionArr = new OffsetPosition[offsetResponseList.Count];
            for (int i = 0; i < offsetResponseList.Count; i++)
            {
                Console.WriteLine(string.Format("獲取到Kafka OffsetPosition信息 Partition:{0} maxOffset:{1} minOffset:{2}", offsetResponseList[i].PartitionId, offsetResponseList[i].Offsets[0], offsetResponseList[i].Offsets[1]));
                positionArr[i] = new OffsetPosition(offsetResponseList[i].PartitionId, offsetResponseList[i].Offsets[1]);//這裏Offsets[0]是最大值,我們從頭消費用的最小值Offsets[1]
            }

            Console.WriteLine("開始執行");

            consumer.SetOffsetPosition(positionArr);

            //Consume returns a blocking IEnumerable (ie: never ending stream)                       
            foreach (var message in consumer.Consume())
            {
                try
                {
                    string messageStr = Encoding.UTF8.GetString(message.Value);
                    Console.WriteLine(messageStr);
                    long r = 0;

                    Console.WriteLine(string.Format("Response: Partition {0},Offset {1} : {2} ,Insert : {3}", message.Meta.PartitionId, message.Meta.Offset, messageStr, r));
                }
                catch (Exception ex)
                {
                    Console.WriteLine("消費Kafka消息保存到數據庫時報錯:" + ex.Message);
                }
            }
        }

    }

能看到我們Consol輸入內容,將兩個message進行消費了,如何去把數據消費掉,可以在上面進行擴充,結合數據庫相關操作。

自己總結記錄一下。

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