前言
? ? ? ?本文主要做了一件事,通過kafka橫向擴展GeoEvent Server,構(gòu)建GeoEvent+kafka集群部署。這件事有兩個作用,其一,利用多臺GeoEvent提高數(shù)據(jù)的吞吐量。其二,利用kafka集群的機制來提高GeoEvent Server軟件的魯棒性。
? ? ? ?GeoEvent Server是用來實時接入的GIS數(shù)據(jù)的GIS實時服務(wù)器。而對于實時服務(wù)器來說,最重要的是系統(tǒng)的魯棒性(Robustness)。什么是魯棒性?魯棒是Robust的音譯,也就是健壯和強壯的意思。它是在異常和危險情況下系統(tǒng)生存的關(guān)鍵。比如說,計算機軟件在輸入錯誤、磁盤故障、網(wǎng)絡(luò)過載或有意攻擊情況下,能否不死機、不崩潰,就是該軟件的魯棒性。所謂“魯棒性”,是指控制系統(tǒng)在一定(結(jié)構(gòu),大小)的參數(shù)攝動下,維持其它某些性能的特性。
? ? ? 自從Esri不推薦使用GeoEvent Server集群,而推薦采用GeoEvent Server單機部署后,GeoEvent Server的魯棒性就成了用戶關(guān)注的焦點。而現(xiàn)在,GeoEvent團隊提供了一個方案,用來提高GeoEvent的魯棒性以及橫向擴展GeoEvent的能力。地址:http://www.arcgis.com/home/item.html?id=89048b1cfdda4a71a9b2b334fe8c8cc9。為了完成本教程,請您提前下載此鏈接中教程的附件。
? ? ? 此教程旨在發(fā)布5篇文章,來分別敘述以下五個章節(jié)。本文為第四節(jié)。配置GeoEvent Server啟用分布式事件調(diào)度中心。
目錄
1 GeoEvent彈性擴展架構(gòu)
這一部分的目的是建立企業(yè)和ArcGIS的多個節(jié)點上,將在整個教程的其余部分使用ArcGIS GeoEvent Server。
2 熟悉事件中心概念(Apache Kafka)
本節(jié)中的練習將幫助您安裝和探索事件調(diào)度中心的特性,包括使用多個broker進行冗余和伸縮。
3 安裝和配置一個分布式事件調(diào)度中心(Apache Kafka)
本節(jié)基于前一節(jié),將指導(dǎo)您在三個節(jié)點上安裝和配置分布式事件調(diào)度中心。在本教程中,您將在3臺已配置的GeoEvent Server節(jié)點上安裝事件調(diào)度中心。
4 配置GeoEvent Server啟用分布式事件調(diào)度中心
本節(jié)的目的是在一個分布式的事件調(diào)度中心完成GeoEvent Server配置。具體來說,你將學習如何使用Kafka 連接器配置GeoEvent Server接收消費從Apache Kafka生產(chǎn)的信息。 自定義連接器可在ArcGIS GeoEvent Gallery找到。
5 探討了GeoEvent Server利用分布式事件調(diào)度中心(Apache Kafka)實現(xiàn)魯棒性
最后,在本節(jié)中,您將測試你的GeoEvent Server和kafka部署的魯棒性,通過試驗丟失brokers和丟失consumers,確保預(yù)期的消息仍然被接收并存儲在系統(tǒng)中。
正文
3 安裝和配置一個分布式事件調(diào)度中心(Apache Kafka)
在本章節(jié),你將配置每個GeoEvent Server節(jié)點從Kafka話題中消費事件。消費Kafka的消息需要給GeoEvent Server配置Kafka連接器。這是一個自定義連接器,可以在ArcGIS GeoEvent Gallery獲取。可以參考http://www.lxweimin.com/p/f3c75dc5b3fc這篇文章來給GeoEvent配置Kafka輸入。
1.下載GeoEvent Server 的Kafka連接器:
https://www.arcgis.com/home/item.html?id=7f94ec2a3eb944c79e98fe854d60d671
2.在GeoEvent Server的機器上,解壓zip文件到一個新文件夾(不要放在GeoEvent Server安裝目錄)。
3.按照GeoEvent Server – Kafka Connectors.pdf教程指導(dǎo),或者按照http://www.lxweimin.com/p/f3c75dc5b3fc這篇文章的指導(dǎo),在你的GeoEvent Server機器上配置Kafka連接器。
? ?a.由于你在前面的練習中已經(jīng)安裝了Kafka,可以跳過安裝kafka等先決條件部分。
? ?b.忽略掉pdf教程的這兩個部分,因為接下來會做不同的練習:
? ? ?i. Configure the Receive Text from Apache Kafka Input Connector to receive messages from Kafka.
? ? ?ii. Configure the Publish Text to an Apache Kafka Output Connector to send messages to Kafka.
配置一個Kafka輸入連接器從分布式事件調(diào)度中心接收事件
1.使用上一節(jié)“熟悉事件中心概念”中的知識來創(chuàng)建一個具有3個分片數(shù),且復(fù)制因子為3,叫作taxis的話題。
2.通過以下步驟,導(dǎo)入出租車數(shù)據(jù)的GeoEvent定義。
? ?a.打開GeoEvent Manager訪問站點→配置存儲。
? ?b.導(dǎo)入包含Kfka連接器的配置文件GeoEventConfig_taxis.xml,文件在\configuration目錄中。
? ?c.訪問站點→GeoEvent定義,確認taxis-def這個GeoEvent定義已經(jīng)出現(xiàn)在列表里。
3.創(chuàng)建輸入接收消費來自Kafka的事件。
? ?a.訪問服務(wù)→輸入,點擊添加輸入。
? ?b.搜索kafka并選擇Receive Text from Apache Kafka輸入連接器。
4.按照如下配置,配置輸入Receive Text from Apache Kafka連接器。
為了確保可靠性,使用指定全部ZooKeeper節(jié)點連接ZooKeeper是非常重要的。這樣,即使一個ZooKeeper節(jié)點脫機,任何客戶端連接到Kafka依然能夠有新的ZooKeeper負責。
使用以下連接字符串指定你的ZooKeeper集群中的三個節(jié)點,指定你在zookeeper-replicated.properties文件中指定的客戶端端口:
? machine3.domain.com:2183,machine4.domain.com:2183,machine5.domain.com:2183
記住,你的GeoEvent節(jié)點計算機名machine3.domain.com以及其他的計算機名,應(yīng)為全域名格式的名稱(FQDN)。確保整個字符串中沒有空格。
5.展開輸入連接器屬性的高級設(shè)置并如下配置。
注意:Append to the End of Payload屬性必須與事件分隔符屬性相同。
6.點擊保存,保存這個新的kafka-text-in 連接器。
配置GeoEvent Server將要素寫入時空大數(shù)據(jù)存儲
1.使用taxis-def GeoEvent定義在時空大數(shù)據(jù)存儲中創(chuàng)建數(shù)據(jù)源
? ?a.訪問站點→時空大數(shù)據(jù)存儲,點擊創(chuàng)建數(shù)據(jù)源,為taxi數(shù)據(jù)定義一個新的數(shù)據(jù)源。
? ?b.配置新數(shù)據(jù)源屬性,保持默認值即可。
? ? ?注意:默認的碎片數(shù)是3,比本例伸縮部署方案中的時空大數(shù)據(jù)存儲的節(jié)點數(shù)多。擁有比時空大數(shù)據(jù)存儲節(jié)點數(shù)量更多的碎片是最優(yōu)方法,以便在數(shù)據(jù)變大后,您可以添加額外的節(jié)點。
? ?c.在聚合渲染部分下,將特征閾值設(shè)置為1000,LOD偏移量設(shè)為0。
? ?d.可以對要素渲染或聚合渲染做一些其他符號化調(diào)整并發(fā)布數(shù)據(jù)源。
? ?e.完成發(fā)布后,此數(shù)據(jù)源會在時空大數(shù)據(jù)存儲列表中出現(xiàn)。
2.創(chuàng)建一個將事件寫入到數(shù)據(jù)源的輸出。
? ?a.訪問服務(wù)→輸出,選擇添加輸出。
? ?b.選擇Add a Feature to an ArcGIS Spatiotemporal Big Data Store輸出連接器
3.配置輸出連接器如下圖所示,并保存輸出。
4.創(chuàng)建一個額外的輸出,通過TCP socket將事件發(fā)送為文本。
? ?a.點擊添加輸出,選擇Push Text to an External TCP Socket輸出連接器。
? ?b.配置輸出如下圖所示,并且保存此輸出。
5.打開GeoEvent Logger點擊刷新獲取TCP輸出列表,核實存在tcp-text-out的輸出。
6.在GeoEvent Manager中,創(chuàng)建一個新GeoEvent 服務(wù)來接收通過Kafka發(fā)送過來的事件。
? ?a.訪問服務(wù)→GeoEvent 服務(wù)→然后點擊添加服務(wù)。
? ?b.命名新GeoEvent 服務(wù) kafka-to-output 然后點擊創(chuàng)建。
? ?c.在服務(wù)設(shè)計時,展開左邊的面板,將kafka-text-in輸入、bds-out輸出和tcp-text-out輸出等拖拽至主面板上。
? ?d.將kafka-text-in輸入連接到bds-out和tcp-text-out輸出。
? ? ?kafka輸入和時空大數(shù)據(jù)輸出都是基于GeoEvent定義taxis-def,所以沒有字段映射是必要的。
? ?e.點擊發(fā)布,保存并發(fā)布kafka-to-output GeoEvent服務(wù)。
7.導(dǎo)出GeoEvent Server機器的配置。
? ?a.訪問站點→配置存儲 點擊導(dǎo)出配置。
? ?b.當出現(xiàn)提示后,選擇導(dǎo)出配置,點擊導(dǎo)出,保存成一個XML文件。
8.在其他的GeoEvent Server節(jié)點導(dǎo)入GeoEvent Server配置
? ?a.拷貝你剛剛導(dǎo)出的GeoEvent Server配置文件(XML)到另外的兩臺GeoEvent Server機器上。
? ?b.站點→配置存儲→導(dǎo)入配置。
? ?注意:如果已存在Kafka輸入/輸出連接器,請忽略任何關(guān)于Kafka連接器的警告信息。
9.在另外兩臺GeoEvent Server節(jié)點上打開GeoEvent Logger接收TCP輸出。
10.當以上所有完成后,所有三個GeoEvent Server應(yīng)該有一個完全相同的配置。
將CSV中的事件模擬發(fā)送到分布式事件中心的話題上
在前一節(jié)中,你使用了kafka提供的默認的producer程序發(fā)送消息到一個話題上。在本節(jié)中,你將使用教程提供的自定義實用程序來模擬來自CSV文件中消息。
1.如果你還沒有把教程內(nèi)容拷貝到GeoEvent Server機器上,請先拷貝到任意路徑,例如C:\ResiliencyTutorial.
2.打開命令窗口,訪問到C:\ResiliencyTutorial\utilities文件夾。
實用工具包含一個簡單的命令行應(yīng)用程序,叫做event-simulator-for-kafka(kafka事件模擬器)。該程序從指定的CSV文件讀取,并將每條行作為消息提交到kafka話題。應(yīng)用程序還配置群組消息用相同的時間戳并同一時間把他們提交到話題上。
3.運行如下命令行使用event-simulator-for-kafka程序來模擬出租車位置更新在kafka話題上。
java -jar event-simulator-for-kafka.jar machine3.domain.com:9092,machine4.domain.com:9092,machine5.domain.com:9092 taxis 5000 ..\data\taxi-simulation-small.csv 1 true
注意:使用完全限定主機名(完全限定域名)代替你的GeoEvent Server節(jié)點,就像你在server.properties 文件中定義Kafka端口一樣。
為了確保彈性,當寫入內(nèi)容到一個話題時,程序會列出至少三個你的Kafka broker 這樣他們中任意一臺broker掉線,另外的broker依然是可獲取的。
上面命令中的5000是程序發(fā)送消息間隔的毫秒數(shù),并標記一個時間戳。在這個文件中,有3個時間戳,所以程序會發(fā)送三批消息,每批消息之間間隔5秒。
4.每一個GeoEvent Server節(jié)點消費掉taxis話題下的消息,因為每個節(jié)點都配置在了相同的名叫g(shù)eoevent的組里,它們將根據(jù)生產(chǎn)者效用的分割方法接收不同的消息。
例如:
5.在web map中瀏覽結(jié)果數(shù)據(jù)。
? ?a.GeoEvent服務(wù)也會推送接收的消息到時空大數(shù)據(jù)存儲中,在瀏覽器中,打開Portal home并搜索taxidata。搜索到兩個結(jié)果,要素服務(wù)和地圖服務(wù)。
? ?b.點擊地圖服務(wù),點擊open下拉框,選擇添加圖層到一個新的地圖。
? ?c.縮放至紐約。你的地圖上應(yīng)該有了18個要素——由六臺不同的出租車更新了三次的位置。
由于你設(shè)置數(shù)據(jù)源時,要素閾值是1000。所以這幅地圖在要素數(shù)量到達1000之前會以要素視圖顯示。而要素多于1000,則會以聚合地圖視圖顯示。
6.清空。
? ? a.打開GeoEvent Manager 并訪問站點→時空大數(shù)據(jù)存儲。
? ? b.點擊數(shù)據(jù)源這一列,taxidata的叉號。這將清空已有的18條記錄。
????c.訪問服務(wù)→監(jiān)控 停止tcp-text-out輸出,關(guān)閉每臺機器的GeoEventLogger。
? ? d.在監(jiān)控頁面,點擊重置統(tǒng)計,重置所有的計數(shù)。
7.通過分布式事件中心探索GeoEvent Server的可伸縮性。
? ? a.為了模擬高速數(shù)據(jù)接入,回到第三部使用的event-simulator-for-kafka程序命令行.
? ? b.運行如下命令,指向了本教程中的兩一個示例數(shù)據(jù)集。
????????java -jar event-simulator-for-kafka.jar ????????machine3.domain.com:9092,machine4.domain.com:9092,machine5.domain.com:9092 taxis 1000 ..\data\taxi-simulation.csv 1 true
? ? 此程序推送大量出租車采集的數(shù)據(jù)到kafka,間隔為1秒。
????c.訪問監(jiān)控頁面,觀察事件計數(shù)。你會發(fā)現(xiàn)每秒上百到一千的事件接入到每個GeoEvent Server節(jié)點中。
GeoEvent Server節(jié)點共用一個數(shù)據(jù)存儲,所以每個GeoEvent Server節(jié)點可以保持它的最大速度3000-4000條/秒,并且將它們寫入到時空大數(shù)據(jù)存儲中,總速度相當于9000-12000條每秒。
8.可選:在Portal的Web map地圖查看器中查看數(shù)據(jù)。
? ? a.回到你的web map并且縮放定位到紐約市地區(qū)。
? ? b.地圖現(xiàn)在將以數(shù)據(jù)動態(tài)渲染的形式展示,因為在當前比例尺,已經(jīng)超過了1000個要素。
9.清空。
? ? a.如果模擬器沒有結(jié)束,回到命令窗口,在event-simulator-for-kafka程序正在運行,按ctrl+c結(jié)束進程。
? ? b.回到GeoEvent Manager訪問站點→時空大數(shù)據(jù)存儲,并在data source 那一列taxidata右側(cè)點擊叉號。這將清空數(shù)據(jù)集的數(shù)據(jù)為了下一次練習。
????c.在GeoEvent Manager監(jiān)視器處點擊重置統(tǒng)計。結(jié)束。