3sNews訊 為期兩天的2012地理信息開發(fā)者大會(簡稱:WGDC)在北京國家會議中心舉行,本次大會以“新技術(shù)、新模式、新商業(yè)”為主題,是地理信息領(lǐng)域最具影響力的技術(shù)性盛會,其宗旨是不斷引領(lǐng)和促進(jìn)地理信息技術(shù)的創(chuàng)新與變革。在第二天“Map+與開發(fā)者訓(xùn)練營”分會場,來自《3s新聞周刊》的特約撰稿人蔣波濤博士為大家?guī)眍}為《PaaS平臺Hadoop在GIS數(shù)據(jù)分析中的應(yīng)用》的演講。
地理信息技術(shù)作家蔣波濤
以下為文字實(shí)錄:
我跟大家分享的是《PaaS平臺Hadoop在GIS數(shù)據(jù)分析中的應(yīng)用》。剛才百度和諾基亞都已經(jīng)做好了大餐,包括開源軟件也是,你現(xiàn)在用開源軟件發(fā)布一個(gè)地圖應(yīng)該說是非常簡單的事情,不管是數(shù)據(jù)庫也好,還是切圖的也好,或者是最終能發(fā)布出來也好。我現(xiàn)在要講的東西可能你自己要做很多,充分發(fā)揮自己的思路或者是技巧。當(dāng)然我會講一個(gè)例子,就是如何把我們這種空間的查詢關(guān)系轉(zhuǎn)換一種思路,在大數(shù)據(jù)庫里,或者是在這種數(shù)據(jù)庫處理當(dāng)中轉(zhuǎn)換一種思路,解決問題。
我的介紹包括云計(jì)算大數(shù)據(jù),Hadoop的介紹,介紹一下MapReduce的并行計(jì)算機(jī)制,其實(shí)它和地圖一點(diǎn)關(guān)系都沒有,Map就是一個(gè)映射,就如同Project在測繪領(lǐng)域是投影,而不是工程。還有就是怎么樣用Hadoop里解決我們的問題,它的確可以解決問題,但是解決的絕對不是說把地圖去存儲,去可視化,去做查詢,不是做這個(gè)事情的。最后是一個(gè)結(jié)論。
現(xiàn)在比較熱門的詞匯是云計(jì)算,大數(shù)據(jù),人們都在談?wù)撛朴?jì)算,大家也把它分成了三種類型。IaaS、Paas、SaaS,他們編了一個(gè)大數(shù)據(jù),他們能夠提供的存儲容量非常高了,但是后來看了一下,好像我們調(diào)的影像數(shù)據(jù)加起來也才10幾個(gè)TB,和他們宣傳的大數(shù)據(jù)的量,好像我們地理行業(yè)永遠(yuǎn)夠不上那個(gè)標(biāo)準(zhǔn)。這個(gè)大數(shù)據(jù)可能我們所謂的數(shù)據(jù)也不可能有那么大,或者我們一般的影像數(shù)據(jù)或者是矢量數(shù)據(jù)有沒有那么大。我們現(xiàn)在還在討論一個(gè)問題,包括我們現(xiàn)在GIS的這種公司也在討論自己的軟件,是不是云平臺商,是云GIS的軟件。我覺得這個(gè)討論好像也沒有什么必要。因?yàn)閺脑朴?jì)算本質(zhì)來講,可能軟件或者服務(wù)放在互聯(lián)網(wǎng)任何一個(gè)地方,用戶感覺不到,你只要能夠使用它,通過網(wǎng)絡(luò)使用就夠了。不管是我們開源的軟件也好,或者是商業(yè)公司軟件,不管是超圖或者是什么,如果有一天它的軟件能達(dá)到這種效果了,讓你感覺不到你有什么樣的困難,或者是他能通過在線Web服務(wù)的方式提供的話,都是云計(jì)算的模式。我后來也找了一下維基百科上關(guān)于云計(jì)算的定義,是基于互聯(lián)網(wǎng)的計(jì)算方式,通過這種計(jì)算方式,我們可以共享軟硬件的資源和信息,用戶不用關(guān)心你的資源從哪里來,信息從哪里來,甚至你計(jì)算的服務(wù)器從哪里來。可能是租用的,可能是免費(fèi)的,也可能是收費(fèi)的,這個(gè)都不成問題。我們現(xiàn)在要討論的問題就是說,怎么樣自己來做一個(gè)小型的東西,寫論文可以,或者是最終做商業(yè)實(shí)踐也可以。今天上午方正國際的周總介紹,他們自己也用Hadoop在解決一些問題。
現(xiàn)在把云計(jì)算分為三個(gè)層次,我要介紹的是中間這個(gè)曾經(jīng)。IaaS就是設(shè)施及服務(wù),我們現(xiàn)在把它已經(jīng)抽象成為我們?nèi)ベI一堆服務(wù)器,我們?nèi)パb一個(gè)System Center或者是一個(gè)VMware,你虛擬出一大堆東西出來,或者是有一個(gè)軟件管理這一堆虛擬機(jī),當(dāng)你需要的時(shí)候,虛擬化出一個(gè)新的系統(tǒng)出來,或者是你不需要的時(shí)候關(guān)掉。現(xiàn)在提供IaaS服務(wù)的,除了很多我們傳統(tǒng)的機(jī)房以外,現(xiàn)在盛大、阿里也在提供虛擬機(jī),主要去設(shè)不同的CPU、內(nèi)存、硬盤或者是帶寬,交多少錢就可以去使用,也不用擔(dān)心它在什么地方。其他更多的是SaaS,很多軟件都稱為是SaaS的平臺,就在上面可以使用,我覺得這個(gè)問題不大。
唯一的一點(diǎn)就是說,中間這個(gè)PaaS,因?yàn)樗切枰⒃诨A(chǔ)設(shè)施及服務(wù)上面的一種框架,一種應(yīng)用??赡苡?jì)算的結(jié)果需要提供給SaaS,就顯得特別困難。因此我們看到,很多公司也好,它自己也似乎從來不稱自己的軟件為PasS平臺,這個(gè)可能是比較難的。PaaS難在什么地方?首先是一個(gè)應(yīng)用的框架,它提供一個(gè)東西,一個(gè)插件,比如說插件外面一個(gè)架子,你要在這個(gè)架子里面寫東西,才能完成你自己的任務(wù)。它是一個(gè)Long time,提供一個(gè)運(yùn)行的環(huán)境。一般代碼寫好以后,你可以用這個(gè)Long time去做執(zhí)行和處理的一些工作。它可能是一個(gè)工作流的環(huán)境,也就是說,這個(gè)數(shù)據(jù)的處理是有始有終,中間的過程是預(yù)先給你規(guī)定好的。我們可以在這個(gè)過程當(dāng)中加入自己的一些思路和想法,這也是Hadoop最終要解決的問題。
我們的大數(shù)據(jù)從何而來?社會化的網(wǎng)絡(luò),我們最近注意一下超圖他們做的GIS精彩,開發(fā)者已經(jīng)把微博和GIS聯(lián)系了,產(chǎn)生了大量的數(shù)據(jù)點(diǎn),這是非常重要的一件事情。我知道一個(gè)例子,電子商務(wù)會存在最后一公里的問題,有些電子商務(wù)商可能有一些想法,就是在我們的一些城市里面,比如說收貨比較聚集的地方去建一個(gè)提貨站,你到那里去提貨,減少最后的問題。但是對于電子商務(wù)來講也有問題,它每天的交易量可能上百萬、上千萬,把它變成地址,以后會有存儲,會有檢索和查詢這樣的問題。然后是智能手機(jī)的一些普及,圖片的共享,這是一些非結(jié)構(gòu)化的數(shù)據(jù)。所謂非結(jié)構(gòu)化就是說,不能存到數(shù)據(jù)庫。電子商務(wù)的應(yīng)用中的地名地址數(shù)據(jù)也是一個(gè)龐大的數(shù)據(jù)源,還有我們地理信息數(shù)據(jù)采集的尺度越來越小,帶來的數(shù)據(jù)也越來越多。比如說飛機(jī)飛過一次,拍這個(gè)點(diǎn),這個(gè)點(diǎn)一出來,應(yīng)該是說上千萬、上億的點(diǎn),都出來了,所以說數(shù)據(jù)量太大。
我們來介紹Hadoop這樣一個(gè)軟件體系。為什么放一駕馬車放在這里,是借用一個(gè)故事。我們?nèi)祟愙s一匹馬去拉貨,比如說這個(gè)貨太重了,我們不會去培養(yǎng)一匹更大的馬,繁殖幾代,變成以前的高幾倍,變成馬力更大,我們不會,我們用兩匹或者是三匹馬去拉,這就是一個(gè)變相的思維。同樣我們在現(xiàn)實(shí)的生活或者工作中,處理數(shù)據(jù)的計(jì)算量很大,可能有幾十臺服務(wù)器,或者是在PC機(jī)上去做。我們能不能分解成多個(gè)用戶?在多臺計(jì)算機(jī)上一起做?因?yàn)槲覀円话銇碇v,有些用戶可能是臨時(shí)性的,也不可能給你再去多購買很多硬件。Hadoop就是秉承這樣一個(gè)思路,把任務(wù)分解,然后不同的任務(wù)交給不同的計(jì)算節(jié)點(diǎn),這個(gè)計(jì)算節(jié)點(diǎn)可能很簡單,就是不同的PC機(jī)來執(zhí)行。它可以做什么呢?比如說從數(shù)百萬份的氣象站記錄里面獲得某一年份的最高或者是最低溫度記錄,可以記錄一年或者是幾年的數(shù)據(jù),這種并不適合于Hadoop來做,因?yàn)镠adoop適宜于做少的大文件,這樣的話,它是為每一個(gè)文件開啟一個(gè)計(jì)算進(jìn)程。如果你真的是幾百萬個(gè)這樣的文件,每個(gè)文件有那么一兩兆來給它來做的話,它就要反反復(fù)復(fù)開啟好幾百萬個(gè)進(jìn)程,這個(gè)實(shí)際上是得不償失的。對于柵格數(shù)據(jù)進(jìn)行地圖的分析,這是我自己做過實(shí)驗(yàn)的,的確非常好,它把柵格數(shù)據(jù)當(dāng)成一個(gè)矩陣,互相之間進(jìn)行地圖算法的計(jì)算,最后再融合,形成一份或者是多份數(shù)據(jù)。還可以在架構(gòu)上構(gòu)建地理脫鋪網(wǎng)絡(luò)的數(shù)據(jù)集,我自己也做過相應(yīng)的實(shí)驗(yàn),也是可行的?;蛘呤荳eb海量信息的檢索,這個(gè)實(shí)際上是Hadoop提出的一套初衷,它為什么提出來?最開始就是為了解決這個(gè)問題的,以及最后的這種海量數(shù)據(jù)的挖掘,包括空間數(shù)據(jù)的挖掘,也可以解決這些問題。
谷歌遇到了同樣的問題,它有很多數(shù)據(jù),還有很多非結(jié)構(gòu)化的數(shù)據(jù),比如圖片、視頻越來越多,需要存儲的量越來越大,計(jì)算量也始終保持在很高的水平。他們解決了一些方法,比如說在寒冷或者是低電價(jià)的地方建數(shù)據(jù)中心,減少機(jī)房電費(fèi)的支出。大家都知道一個(gè)事情就是,我們在服務(wù)器上用一塊錢的電,就要在空調(diào)上要用一塊五毛錢的電甚至更多的來解決散熱的問題,很多地方在建計(jì)算中心,建機(jī)房,有的沿海的缺電的省份也在做,海南都要開始做云計(jì)算機(jī)房,我也不知道他們到時(shí)候怎么去解決散熱問題,怎么去解決電力問題。使用改造后的直流電服務(wù)器,或者是使用普通PC服務(wù)器。但是更重要的在下面,就是說他們發(fā)明了很多計(jì)算模型或者是工具,像MapReduce,過程是GFS谷歌的文件系統(tǒng),或者是Big Table等并行計(jì)算模型、文件存儲模型和NoSQL數(shù)據(jù)庫模型。用他們無窮的智慧,將谷歌的產(chǎn)品進(jìn)行開源化。谷歌把這些這套東西介紹出來,Doug Cutting敏銳地捕捉到這一契機(jī),在業(yè)余時(shí)間就開始開發(fā)自己的分布式計(jì)算框架Hadoop。后來被雅虎招安,后來項(xiàng)目被贈(zèng)送給Apache基金會,并成為Apache,后來被商業(yè)社會和學(xué)術(shù)界接受。
我們看一下主要的四個(gè)組件,或者應(yīng)用到的例子。包括Hadoop這種分布式的文件系統(tǒng),也就是說不僅僅是一個(gè)框架,還是一種文件系統(tǒng),這個(gè)文件系統(tǒng)是高可用的,自己就構(gòu)建了一些備份的機(jī)制,能夠保證你的數(shù)據(jù)不會丟失。所以設(shè)備是適合于做這種文件備份系統(tǒng),據(jù)說亞馬遜的存儲服務(wù)也是通過Hadoop的HDFS做出來的,昨天我們也討論過,能不能存儲柵格數(shù)據(jù),我覺得還是非常合適的。MapReduce是一種分布式的計(jì)算模型,提供了兩個(gè)函數(shù)的接口,讓你自己選,一個(gè)是Map的函數(shù),一個(gè)是Reduce的函數(shù)。還有一個(gè)HBase,是面向行的數(shù)據(jù)庫,這種特性是建立在HDFS之上的。我的數(shù)據(jù)如果存儲,一般的數(shù)據(jù)庫容量大了,我要做分庫分表的操作,這個(gè)不用,可以繼續(xù)加一個(gè)節(jié)點(diǎn)上去就可以寫數(shù)據(jù)。數(shù)據(jù)庫不支持查詢,通過這個(gè)來做數(shù)據(jù)查詢的工作。
HDFS是怎么樣保證數(shù)據(jù)具有高可靠性的?當(dāng)我安裝起一個(gè)Hadoop的軟件以后,我把我的數(shù)據(jù)存到這個(gè)HDFS上面,比如你的數(shù)據(jù)有1G,它會按照168個(gè)數(shù)據(jù)塊進(jìn)行切分,并且把每一份數(shù)據(jù)塊都放在不同的數(shù)據(jù)節(jié)點(diǎn)上,一般是三份,可以調(diào)更多,調(diào)四份或者是調(diào)五份。我們舉這個(gè)例子,一個(gè)文件如果被切分到四份,有500多兆的話,切成了四份,數(shù)據(jù)塊會被放在一號二號和三號機(jī),它的優(yōu)點(diǎn)是什么呢?就是說如果我這個(gè)機(jī)器壞了,實(shí)際上對我是沒有影響的。因?yàn)槲覐耐饷鍴adoop的平臺讀這個(gè)數(shù)據(jù)的話是沒有影響的,這就能保證這個(gè)數(shù)據(jù)不會丟失。除非說你所有的兩臺甚至是三臺機(jī)器壞了就很難說了。通過這個(gè)節(jié)點(diǎn),會記錄文件的位置,也會對一些大數(shù)據(jù)量進(jìn)行優(yōu)化和保存。我們可以自己進(jìn)行調(diào)整,有的時(shí)候可能調(diào)整得更小一點(diǎn),調(diào)整到64兆,在用戶數(shù)據(jù)的處理上會更大,關(guān)鍵是看數(shù)據(jù)的規(guī)模有多大。當(dāng)我們講數(shù)據(jù)存到HDFS以后,我們要對它進(jìn)行處理,這個(gè)是MapReduce的一個(gè)并行計(jì)算的框架,它是一種計(jì)算分布式的模型,從一大堆的結(jié)算節(jié)點(diǎn),把它作為一個(gè)集群來解決這個(gè)問題。作為MapReduce它解決問題有一個(gè)很有趣的地方,因?yàn)樗前堰@個(gè)數(shù)據(jù)切開以后,給你進(jìn)行計(jì)算,最后得出一個(gè)結(jié)果。我們前面說過,我的數(shù)據(jù)都被切成一片一片的,放在不同的企業(yè)上。它不會把你這個(gè)數(shù)據(jù),比如一號這個(gè)數(shù)據(jù)需要做計(jì)算了,他不會把你的機(jī)器移到四號機(jī)器上做計(jì)算,就會本身在一號機(jī)器上做完,把結(jié)果可能放到一個(gè)Reduce里面,那臺機(jī)器把數(shù)據(jù)移過去,所以是盡量避免網(wǎng)間數(shù)據(jù)的開銷,稱這種特性叫做移動(dòng)計(jì)算比移動(dòng)數(shù)據(jù)更加經(jīng)濟(jì)。因?yàn)槿绻愕臄?shù)據(jù)增得很大,哪怕在局域網(wǎng)當(dāng)中傳來傳去,還會遇到丟包等事情,最后造成計(jì)算功虧一簣。MapReduce是運(yùn)行在Java上面的,如果你的計(jì)算是失敗了,你錯(cuò)了怎么辦?它會自動(dòng)的再重啟這個(gè)計(jì)算過程,有一個(gè)心跳的檢測,直到你這個(gè)計(jì)算成功為止。
HBase,可能一般的習(xí)慣于放在HDFS上面,但是以后的還是習(xí)慣放在數(shù)據(jù)庫里面。是建立在HDFS的數(shù)據(jù)庫,通過原生的HDFS支持。一個(gè)好處就是能夠使用MapReduce的平臺和算法來處理里面存儲的數(shù)據(jù)。但是它的缺點(diǎn)也很明顯,就是查詢的時(shí)候,可以裝很多數(shù)據(jù),它的數(shù)據(jù)是橫向的擴(kuò)展過去的,但是沒有這種機(jī)制,只能通過硬暴力的方式來解決查詢的問題。為了解決這個(gè)問題,他們還有一個(gè)新的工具就是Hive,Hive是一種數(shù)據(jù)倉庫,能夠基于MR架構(gòu)。這種查詢意味著什么?意味著它跑得再快,可能也不如我們這種關(guān)系數(shù)據(jù)庫里面這種東西跑得快。比如說我查GIS查詢的話,我可能希望我輸入一個(gè)SQL的命令進(jìn)去,可能零點(diǎn)幾秒鐘數(shù)據(jù)就進(jìn)去了,通過Hive的查詢,最快也要20多秒,30秒,甚至是更慢,因?yàn)樗獑?dòng)進(jìn)程,它要處理,要查找,把查找的結(jié)果匯聚到一點(diǎn),最后輸出。
我們按照分布式的并行機(jī)制,可以在上千臺PC機(jī)組成的集成里面進(jìn)行海量的計(jì)算。一般來講,我們做這種完全分布式的部署的話,有一臺主機(jī)的一個(gè)節(jié)點(diǎn),負(fù)責(zé)監(jiān)控所有的節(jié)點(diǎn),就是說負(fù)責(zé)讀取數(shù)據(jù),負(fù)責(zé)分發(fā)錄入,也負(fù)責(zé)監(jiān)督下面的這些子節(jié)點(diǎn)有沒有正常工作,如果沒有正常工作,是不是再提交一次,再計(jì)算一次?會自己通過這種機(jī)制來解決負(fù)載均衡的問題。Reduce深受Lisp的影響,不知道大家使用過Lisp的沒有,它將任務(wù)分為兩個(gè)階段,實(shí)際上兩個(gè)函數(shù),一個(gè)是Map函數(shù),一個(gè)是Reduce函數(shù)。我們所有編程的任務(wù)都到這個(gè)函數(shù)里面實(shí)現(xiàn),從HDFS或者是HBase里面讀取出來,不一定是數(shù)值,可是你想要的任何數(shù)據(jù),任何文本,甚至是對象都可以。讀進(jìn)來之后,你需要對它進(jìn)行一些處理,然后把它輸出為新的對。這個(gè)處理的過程,普遍就是我們處理的過程。輸出可能會通過一個(gè)過程進(jìn)入到Reduce這個(gè)階段,有這么一個(gè)過程,是混寫,會把所有Key相同的來合并,這樣就使我們的數(shù)據(jù)量更小,然后Reduce再把它輸出。
讀入數(shù)據(jù),沖洗數(shù)據(jù),進(jìn)行交換和輸出,這是MapReduce的一個(gè)數(shù)據(jù)庫,比如168的,或者是更小的,可以讀入到一個(gè)Map的過程,通過排序進(jìn)入Reduce的階段,這個(gè)過程中間的過程我們不用去管它,但是我們可以寫自定義的代碼,你排序的規(guī)則是什么,我們一般這種Key可能是一個(gè)值。但是如果你現(xiàn)在記錄一個(gè)位置,記錄一個(gè)值的話,你想要把一堆進(jìn)行排序,比如先排橫坐標(biāo),再排縱坐標(biāo),這種排序需要自己寫相應(yīng)的自定義排序的算法。這個(gè)也并不復(fù)雜,也就是一個(gè)接口實(shí)現(xiàn)各相應(yīng)的功能就夠了。這是一個(gè)Reduce過程,會生成一份結(jié)果,比如我們做柵格處理的時(shí)候,有好幾個(gè)柵格數(shù)據(jù),最后需要加加減減,做成這種計(jì)算,最后生成一份結(jié)果,我們就只能要一個(gè)Reduce?;蛘呤悄阌袃蓚€(gè)Reduce更好,中間會把排序的數(shù)據(jù)傳到不同的Reduce的節(jié)點(diǎn)上去。當(dāng)然,時(shí)間會降低,因?yàn)镽educe實(shí)際上回洗過程是非常耗時(shí)的過程,如果數(shù)據(jù)量很大的情況下,你的輸出又很大的情況下,其實(shí)Reduce非常耗時(shí),這也是我們的一個(gè)經(jīng)驗(yàn),那就看你自己的選擇了,或者是一個(gè)根本就沒有Reduce的過程也可以,你如果一次性把它讀出來,處理了,寫出去,存在一個(gè)文件里面也可以。這是一個(gè)基本的示例,這么一個(gè)過程,我們選的是兩份文件。比如我們假設(shè)一行文件被加入到一個(gè)Map的過程,當(dāng)它讀出來的時(shí)候是How有1個(gè),Browe有1個(gè),Does有1個(gè),如果說How有2個(gè)了,可以經(jīng)過經(jīng)過排序,把Key相同的放在一起。這種數(shù)據(jù)流程看起來非常簡單,但是你開動(dòng)腦筋就會發(fā)現(xiàn),其實(shí)可以做很多事情,這是一個(gè)經(jīng)典的例子,算一個(gè)文檔里面哪些字符有多少個(gè)是最經(jīng)典的一個(gè)例子。
這是我自己做的一個(gè)實(shí)驗(yàn),Hadoop這個(gè)東西也不是萬能的,至少你不能把那個(gè)數(shù)據(jù)直接放上去讀。做的實(shí)驗(yàn)就是用MR來做自動(dòng)構(gòu)面計(jì)算的實(shí)驗(yàn),還有就是用GIS做檢索的實(shí)驗(yàn)。第一個(gè)很簡單,一堆點(diǎn)構(gòu)成一個(gè)拓?fù)渚W(wǎng)絡(luò),可以通過左轉(zhuǎn)或者是右轉(zhuǎn)的方式,從任何一個(gè)點(diǎn)出發(fā),按照那種算法的要求,你可以構(gòu)成一個(gè)面起來。它的好處就是說,不管你選哪一個(gè)點(diǎn)觸發(fā),其實(shí)與其他的點(diǎn)沒有什么關(guān)系的。如果你寫一個(gè)程序,你的那個(gè)程序上同時(shí)運(yùn)行10個(gè)這樣的程序也是可以的,也就是它可以切分這個(gè)任務(wù)。如果你有1萬個(gè)點(diǎn),你只有一臺機(jī)器,那么你就是1萬個(gè)點(diǎn),如果你有這樣一個(gè)機(jī)制,就是說你有5臺機(jī)器,每個(gè)機(jī)器上分兩千個(gè)點(diǎn),5個(gè)節(jié)點(diǎn)同時(shí)來做,所用的時(shí)間肯定比1萬個(gè)點(diǎn)到一臺機(jī)器上做的要好得多。這個(gè)過程就是,我用了兩個(gè)MapReduce的過程,第一個(gè)是把它做拓?fù)渚W(wǎng)絡(luò),把這個(gè)數(shù)據(jù)讀進(jìn)去可能大家比較擔(dān)心,不是原生的這種,還是文本文件式的,記錄一下你這個(gè)點(diǎn)的POI是多少,是用Java編寫的,因此可以直接調(diào)用Java的API,或者是AO的Java的API,是一點(diǎn)問題沒有的,可以繼續(xù)調(diào)用我們基礎(chǔ)數(shù)據(jù)庫的信息,把和它相關(guān)聯(lián)的找出來,然后自己去記錄一下在輸出的地方記錄一下我要哪些點(diǎn),和哪些邊相連,就構(gòu)成一個(gè)拓?fù)渚W(wǎng)絡(luò)了。我把上面的一堆結(jié)果重新讀取出來,選取一個(gè)點(diǎn)開始,所不同的就是,我可能有一萬個(gè)點(diǎn),現(xiàn)在分到四五臺機(jī)器上,現(xiàn)在每個(gè)點(diǎn)做面,做的也不是一個(gè)面,最終還是從我這個(gè)點(diǎn)出發(fā),我們可能循環(huán)多少個(gè)點(diǎn),最終形成一個(gè)面,記錄的是這個(gè)東西。最終它的結(jié)果我們可能把它再記錄一下,再通過其他的一些,把這幾個(gè)點(diǎn)找到,把這個(gè)面構(gòu)成起來。因此,具體的處理邏輯還是需要我們自己來實(shí)現(xiàn)的,這個(gè)是非常簡單的一個(gè)例子。
每天幾百萬條的POI需要保存到數(shù)據(jù)庫中,我覺得這個(gè)東西很現(xiàn)實(shí)。你做電子商務(wù)的,阿里巴巴或者是京東,每天不止幾百萬條,每天的交易量有幾千萬條,如果把幾千萬條的地址地名變成地址,你怎么去存?你把它用點(diǎn)的形式去存嗎?是搞不定的。你無時(shí)無刻都在寫數(shù)據(jù)庫,你寫是一回事,還面臨著去讀它的問題。還有一個(gè)問題就是說,我們現(xiàn)在基站更多的時(shí)候到了上億條。我看到一個(gè)說法,關(guān)系數(shù)據(jù)庫的表,大概在1億條的時(shí)候就跑不動(dòng)了,效率非常低。遇到的問題就是沒有一種空間數(shù)據(jù)庫能夠滿足這種要求或者是需要。
我們解決一下檢索很慢的問題,使用什么樣的數(shù)據(jù)庫來存儲這些數(shù)據(jù)?這些數(shù)據(jù)庫是空間形式嗎?比如說你把它還存儲一個(gè)點(diǎn),如果是通過這樣的點(diǎn)來描述,怎么樣做這種查詢呢?比如說哪怕是你的ArcGIS或者是超圖,從其中一個(gè)點(diǎn)找特定的點(diǎn),耗的時(shí)間是很長的。我們還有沒有其他的更加好的、更有效的空間檢索方式?我們通過Geohash的方式方式存儲這些點(diǎn),把一個(gè)空間分成4份,比如說左上角是00,右下角是11,最大范圍分成4塊,比如說這個(gè)往下繼續(xù)分,01繼續(xù)加上00、11,可以無限的分下去。我們可以注意一下,實(shí)際上是對半分,哪怕是整個(gè)地球的范圍,分布到多少次,就可以把你這個(gè)格子縮小到一個(gè)足夠小的程度,完全能夠標(biāo)注POI點(diǎn)的程度。如果我們把地球上的一個(gè)點(diǎn)精度也這樣分,因?yàn)槲覀冇玫氖荳GS84,因?yàn)槟闶褂玫氖?4這個(gè)坐標(biāo),從-180到180,-90到90的范圍,劃分到這種范圍就分,橫向上你去把它寫成這些0101的值,縱向上也把它做這些值。然后把它們橫向上的,就是說奇位數(shù)為橫坐標(biāo),偶位數(shù)縱坐標(biāo),最終就能夠得到一個(gè)比較短的值。大家感興趣的話可以自己到網(wǎng)上去查一下這種方式。這是5位編碼,也就是畫了10次網(wǎng)格之后的結(jié)果。這個(gè)表示了一個(gè)范圍,其實(shí)它的范圍很大,里面更大的,從6位其實(shí)范圍已經(jīng)很小了。如果你到8位的時(shí)候,實(shí)際上9個(gè)格子就已經(jīng)可以描述一棟房子了。我們自己做過一個(gè)計(jì)算,9位的時(shí)候,格子的長度和寬度是不一樣,不是一個(gè)正方形的格子,是一個(gè)長方形的格子。到第9位的時(shí)候,每個(gè)格子的長度和寬度大概就是0.3米左右,也就是說,精度是絕對足夠的,就是用點(diǎn)來描述地球上的位置也是空的?,F(xiàn)在只不過是用遞進(jìn)的方式,把這個(gè)位置劃到一個(gè)小的方框里面來。下面檢索的問題就解決了,其實(shí)檢索的問題很好解決。我們可以看到,如果對于8位的數(shù)字來講,其實(shí)前7位的值都是一樣的,就是第8位不一樣。如果我們用這種方式去存儲數(shù)據(jù),將來你檢索的時(shí)候怎么來檢索?就是判斷它的前面有幾位相同。比如說我這里有一個(gè)點(diǎn),我檢索一下大概是200米,周圍有哪些其他的POI點(diǎn)的存在,我先把自己的點(diǎn)大概編到一個(gè)7位就足夠了。然后我就去在整個(gè)數(shù)據(jù)庫里面找一項(xiàng)和我前面6位相同的這些格網(wǎng)有哪些,也就是找它周圍的這么8個(gè),或者甚至找更大范圍相同的都可以,可以把這些格網(wǎng)找出來。當(dāng)然一個(gè)問題就是說,不可能精確到200米,因?yàn)楦窬W(wǎng)的寬度不是很固定的。比如我們到了第9級的0.3米,到了第8級的時(shí)候可能有13米多,更大一點(diǎn)的,可能有40多米,1千多米,范圍不是一個(gè)固定的。但是,通過這種方式,足夠讓你在一個(gè)海量的數(shù)據(jù)庫里面檢索區(qū)域內(nèi)相對較少的點(diǎn)出來,然后你再去判斷它的距離,判斷兩個(gè)經(jīng)緯度之間的距離,如果超過了200米,那你就不要了,如果小于200米就包含它。我們通過這種方式,把一個(gè)空間判斷的問題轉(zhuǎn)換成了一種匹配的,相對來講較為簡單的這么一種問題。就是說既能夠解決海量POI數(shù)據(jù)的存儲,又能解決它的檢索,要不然你幾百萬、上千萬的點(diǎn)存到里面去,是很難再查出來的,或者查出來的速度滿足不了。當(dāng)然最后查出來的速度取決于你有多少臺機(jī)器,也不用說非???,也不用說你現(xiàn)在輸入命令進(jìn)去以后,至少可能是40秒或者是1分鐘左右。至少我自己在測那些速度的時(shí)候,基本上都是1分鐘。如果做事后的分析,做技術(shù)查詢也是足夠的。
MapReduce和Hadoop與我們GIS沒有太直接的關(guān)系,就是一個(gè)框架。你怎么去使用它完全取決于你自己的創(chuàng)造力、想法和思路。它適用的范圍是我前面講到的三個(gè)數(shù)據(jù)的存儲、計(jì)算分析,解決海量地址的查詢,或者是其他一切可以劃分為多個(gè)問題來解決的這些技術(shù)問題。其中技術(shù)處理方面的問題都可以,我看到不少的論文都是這樣來解決的,不會直接拿Hadoop來當(dāng)做一個(gè)普通的數(shù)據(jù)鏈,去存儲數(shù)據(jù)和切圖,不會那樣做,還是一個(gè)可并行計(jì)算的工具。
我的演講就是這些內(nèi)容,謝謝大家!
(以上內(nèi)容根據(jù)速記整理,未經(jīng)本人審核)
{{item.content}}