ArcGIS的時空大數(shù)據(jù)采用Elasticsearch作為其存儲技術(shù)熔吗。首先了解一下ElasticSearch。
如果只想了解如何連接請?zhí)^基礎(chǔ)章節(jié)直接ctrl+F"如何連接ArcGIS時空大數(shù)據(jù)存儲中的Elasticsearch"
Elasticsearch基礎(chǔ)
Elasticsearch有幾個核心概念。從一開始理解這些概念會對整個學(xué)習(xí)過程有莫大的幫助沾瓦。
接近實時(NRT)
Elasticsearch是一個接近實時的搜索平臺。這意味著,從索引一個文檔直到這個文檔能夠被搜索到有一個輕微的延遲(通常是1秒)萧恕。
集群(cluster)
一個集群就是由一個或多個節(jié)點組織在一起,它們共同持有你整個的數(shù)據(jù)肠阱,并一起提供索引和搜索功能票唆。一個集群由一個唯一的名字標(biāo)識,這個名字默認(rèn)就是“elasticsearch”屹徘。這個名字是重要的走趋,因為一個節(jié)點只能通過指定某個集群的名字,來加入這個集群噪伊。在產(chǎn)品環(huán)境中顯式地設(shè)定這個名字是一個好習(xí)慣簿煌,但是使用默認(rèn)值來進(jìn)行測試/開發(fā)也是不錯的。
節(jié)點(node)
一個節(jié)點是你集群中的一個服務(wù)器鉴吹,作為集群的一部分姨伟,它存儲你的數(shù)據(jù),參與集群的索引和搜索功能豆励。和集群類似夺荒,一個節(jié)點也是由一個名字來標(biāo)識的,默認(rèn)情況下肆糕,這個名字是一個隨機(jī)的漫威漫畫角色的名字般堆,這個名字會在啟動的時候賦予節(jié)點。這個名字對于管理工作來說挺重要的诚啃,因為在這個管理過程中淮摔,你會去確定網(wǎng)絡(luò)中的哪些服務(wù)器對應(yīng)于Elasticsearch集群中的哪些節(jié)點。
一個節(jié)點可以通過配置集群名稱的方式來加入一個指定的集群始赎。默認(rèn)情況下和橙,每個節(jié)點都會被安排加入到一個叫做“elasticsearch”的集群中仔燕,這意味著,如果你在你的網(wǎng)絡(luò)中啟動了若干個節(jié)點魔招,并假定它們能夠相互發(fā)現(xiàn)彼此晰搀,它們將會自動地形成并加入到一個叫做“elasticsearch”的集群中。
在一個集群里办斑,只要你想外恕,可以擁有任意多個節(jié)點。而且乡翅,如果當(dāng)前你的網(wǎng)絡(luò)中沒有運行任何Elasticsearch節(jié)點鳞疲,這時啟動一個節(jié)點,會默認(rèn)創(chuàng)建并加入一個叫做“elasticsearch”的集群蠕蚜。
索引(index)
一個索引就是一個擁有幾分相似特征的文檔的集合尚洽。比如說,你可以有一個客戶數(shù)據(jù)的索引靶累,另一個產(chǎn)品目錄的索引腺毫,還有一個訂單數(shù)據(jù)的索引。一個索引由一個名字來標(biāo)識(必須全部是小寫字母的)挣柬,并且當(dāng)我們要對對應(yīng)于這個索引中的文檔進(jìn)行索引潮酒、搜索、更新和刪除的時候凛忿,都要使用到這個名字澈灼。
在一個集群中,如果你想店溢,可以定義任意多的索引。
類型(type)
在一個索引中委乌,你可以定義一種或多種類型床牧。一個類型是你的索引的一個邏輯上的分類/分區(qū),其語義完全由你來定遭贸。通常戈咳,會為具有一組共同字段的文檔定義一個類型。比如說壕吹,我們假設(shè)你運營一個博客平臺并且將你所有的數(shù)據(jù)存儲到一個索引中著蛙。在這個索引中,你可以為用戶數(shù)據(jù)定義一個類型,為博客數(shù)據(jù)定義另一個類型,當(dāng)然咆槽,也可以為評論數(shù)據(jù)定義另一個類型蜕提。
文檔(document)
一個文檔是一個可被索引的基礎(chǔ)信息單元。比如绎谦,你可以擁有某一個客戶的文檔愈捅,某一個產(chǎn)品的一個文檔咧最,當(dāng)然帐偎,也可以擁有某個訂單的一個文檔逐纬。文檔以JSON(Javascript Object Notation)格式來表示,而JSON是一個到處存在的互聯(lián)網(wǎng)數(shù)據(jù)交互格式削樊。
在一個index/type里面豁生,只要你想,你可以存儲任意多的文檔漫贞。注意甸箱,盡管一個文檔,物理上存在于一個索引之中绕辖,文檔必須被索引/賦予一個索引的type摇肌。
分片和復(fù)制(shards & replicas)
一個索引可以存儲超出單個結(jié)點硬件限制的大量數(shù)據(jù)。比如仪际,一個具有10億文檔的索引占據(jù)1TB的磁盤空間围小,而任一節(jié)點都沒有這樣大的磁盤空間;或者單個節(jié)點處理搜索請求树碱,響應(yīng)太慢肯适。
為了解決這個問題,Elasticsearch提供了將索引劃分成多份的能力成榜,這些份就叫做分片框舔。當(dāng)你創(chuàng)建一個索引的時候,你可以指定你想要的分片的數(shù)量赎婚。每個分片本身也是一個功能完善并且獨立的“索引”刘绣,這個“索引”可以被放置到集群中的任何節(jié)點上。
分片之所以重要挣输,主要有兩方面的原因:
- 允許你水平分割/擴(kuò)展你的內(nèi)容容量
- 允許你在分片(潛在地纬凤,位于多個節(jié)點上)之上進(jìn)行分布式的、并行的操作撩嚼,進(jìn)而提高性能/吞吐量
至于一個分片怎樣分布停士,它的文檔怎樣聚合回搜索請求,是完全由Elasticsearch管理的完丽,對于作為用戶的你來說恋技,這些都是透明的。
在一個網(wǎng)絡(luò)/云的環(huán)境里逻族,失敗隨時都可能發(fā)生蜻底,在某個分片/節(jié)點不知怎么的就處于離線狀態(tài),或者由于任何原因消失了瓷耙,這種情況下朱躺,有一個故障轉(zhuǎn)移機(jī)制是非常有用并且是強烈推薦的刁赖。為此目的,Elasticsearch允許你創(chuàng)建分片的一份或多份拷貝长搀,這些拷貝叫做復(fù)制分片宇弛,或者直接叫復(fù)制。
復(fù)制之所以重要源请,有兩個主要原因:
- 在分片/節(jié)點失敗的情況下枪芒,提供了高可用性。因為這個原因谁尸,注意到復(fù)制分片從不與原/主要(original/primary)分片置于同一節(jié)點上是非常重要的舅踪。
- 擴(kuò)展你的搜索量/吞吐量,因為搜索可以在所有的復(fù)制上并行運行
總之良蛮,每個索引可以被分成多個分片抽碌。一個索引也可以被復(fù)制0次(意思是沒有復(fù)制)或多次。一旦復(fù)制了决瞳,每個索引就有了主分片(作為復(fù)制源的原來的分片)和復(fù)制分片(主分片的拷貝)之別货徙。分片和復(fù)制的數(shù)量可以在索引創(chuàng)建的時候指定。在索引創(chuàng)建之后皮胡,你可以在任何時候動態(tài)地改變復(fù)制的數(shù)量痴颊,但是你事后不能改變分片的數(shù)量。
默認(rèn)情況下屡贺,Elasticsearch中的每個索引被分片5個主分片和1個復(fù)制蠢棱,這意味著,如果你的集群中至少有兩個節(jié)點甩栈,你的索引將會有5個主分片和另外5個復(fù)制分片(1個完全拷貝)泻仙,這樣的話每個索引總共就有10個分片。
插入與查詢
插入兩條員工數(shù)據(jù)量没,索引為megacorp饰豺,類型為employee,id為1和2
PUT /megacorp/employee/1
{
"first_name" : "John",
"last_name" :? "Smith",
"age" :? ? ? ? 25,
"about" :? ? ? "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
PUT /megacorp/employee/2
{
"first_name" : "jane",
"last_name" : "smith",
"age" :? ? ? ? 32,
"about" :? ? "I like to collect rock albums",
"interests" :["music"]
}
查詢的兩種寫法
GET /megacorp/employee/_search?q=last_name:smith
或
GET /megacorp/employee/_search
{
? ? "query": {
? ? ? ? "match": {
? ? ? ? ? ? "last_name": "Smith"
? ? ? ? }
? ? ?}
}
查詢結(jié)果:
{
"took": 250,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 0.30685282,
"hits": [
{
"_index": "megacorp",
"_type": "employee",
"_id": "2",
"_score": 0.30685282,
"_source": {
"first_name": "jane",
"last_name": "smith",
"age": 32,
"about": "I like to collect rock albums",
"interests": [
"music"
]
}
},
{
"_index": "megacorp",
"_type": "employee",
"_id": "1",
"_score": 0.30685282,
"_source": {
"first_name": "John",
"last_name": "Smith",
"age": 25,
"about": "I love to go rock climbing",
"interests": [
"sports",
"music"
]
}
}
]
}
}
對查詢結(jié)果的說明:
對于這個響應(yīng)允蜈,我們看到了以下的部分:
- took —— Elasticsearch執(zhí)行這個搜索的耗時,以毫秒為單位
- timed_out —— 指明這個搜索是否超時
- _shards —— 指出多少個分片被搜索了蒿柳,同時也指出了成功/失敗的被搜索的shards的數(shù)量
- hits —— 搜索結(jié)果
- hits.total —— 能夠匹配我們查詢標(biāo)準(zhǔn)的文檔的總數(shù)目
- hits.hits —— 真正的搜索結(jié)果數(shù)據(jù)(默認(rèn)只顯示前10個文檔)
- _score和max_score —— 這個得分是與我們指定的搜索查詢匹配程度的一個相對度量饶套。得分越高,文檔越相關(guān)垒探,得分越低文檔的相關(guān)度越低妓蛮。
ArcGIS 時空大數(shù)據(jù)存儲
上面講完了Elasticsearch的相關(guān)概念,在ArcGIS時空大數(shù)據(jù)存儲中這些概念都扮演了重要的角色圾叼,這里暫且不說蛤克,日后補齊捺癞。先看下ArcGIS時空大數(shù)據(jù)存儲如何像pg庫一樣進(jìn)行連接,進(jìn)行開放构挤。
如何連接ArcGIS時空大數(shù)據(jù)存儲中的Elasticsearch
端口
連接Elasticsearch髓介,首先要知道它使用的端口。在官方文檔中進(jìn)行查詢
端口 9220 和 9320
ArcGIS Data Store 中提供的時空大數(shù)據(jù)存儲通過端口 9220 (HTTP) 和 9320 (TCP) 進(jìn)行通信筋现。如果您使用GeoEvent Server將數(shù)據(jù)寫入時空大數(shù)據(jù)存儲唐础,您需要打開這些端口。
用戶名密碼
其次矾飞,還需要ES的用戶名和密碼一膨。就像其他的數(shù)據(jù)庫中的用戶名密碼一樣,有了用戶名密碼才可以使用ES洒沦。在ArcGIS DataStore中豹绪,使用工具查詢manage的用戶名和密碼。工具的位置在C:\Program Files\ArcGIS\DataStore\tools\listmanageduser
實用工具
管理es的實用工具套件包括kibana和sense申眼。
kibana和es的版本有關(guān)瞒津。經(jīng)過測試,kibana-5.5因版本過高豺型,無法連接時空大數(shù)據(jù)存儲的es仲智。kibana4.5.2是可用的。其余版本沒有進(jìn)行測試姻氨。這里推薦kibana4.5.2钓辆。
可以直接輸datastore的IP:9220來查看ArcGIS Datastore中ES的版本。
sense可以直接從github上下載肴焊。由于是master主分支前联,下載的文件名為sense-master。這是離線安裝所需要的娶眷。這里可以使用在線安裝似嗤。
在kibana目錄運行命令安裝 sense插件
./bin/kibana plugin —install elastic/sense
開始連接
工具安裝完畢后,需要修改kibana.yml中
elasticsearch.username: "els_tctb96n"
elasticsearch.password: "fpinq3kv6ez6r8pw"
elasticsearch.url: "http://ip:9220"
然后在\kibana-4.5.2-windows\bin下届宠,cmd輸入命令kibana烁落,即可運行此工具。
訪問http://localhost:5601/app/status
可以查看當(dāng)前es服務(wù)器的狀態(tài)
訪問http://localhost:5601/app/sense 即可進(jìn)入sense的界面
需要修改ip和端口為datastore機(jī)器的ip和9220端口才可以使用豌注。初次打開需要輸入用戶名密碼伤塌,即kibana.yml中的elasticsearch.username: "els_tctb96n"和elasticsearch.password: "fpinq3kv6ez6r8pw"。
在sense界面轧铁,即可輸入GET每聪、PUT、DELETE等命令與Elasticsearch進(jìn)行交互。
Elasticsearch的入門指南可以參考這本電子書Elasticsearch:權(quán)威指南