讓時空大資料不再神祕——如何直連使用ArcGIS時空大資料儲存

weixin_34320159發表於2017-08-01

ArcGIS的時空大資料採用Elasticsearch作為其儲存技術。首先了解一下ElasticSearch。

如果只想瞭解如何連線請跳過基礎章節直接ctrl+F"如何連線ArcGIS時空大資料儲存中的Elasticsearch"

Elasticsearch基礎

Elasticsearch有幾個核心概念。從一開始理解這些概念會對整個學習過程有莫大的幫助。

接近實時(NRT)

Elasticsearch是一個接近實時的搜尋平臺。這意味著,從索引一個文件直到這個文件能夠被搜尋到有一個輕微的延遲(通常是1秒)。

叢集(cluster)

一個叢集就是由一個或多個節點組織在一起,它們共同持有你整個的資料,並一起提供索引和搜尋功能。一個叢集由一個唯一的名字標識,這個名字預設就是“elasticsearch”。這個名字是重要的,因為一個節點只能通過指定某個叢集的名字,來加入這個叢集。在產品環境中顯式地設定這個名字是一個好習慣,但是使用預設值來進行測試/開發也是不錯的。

節點(node)

一個節點是你叢集中的一個伺服器,作為叢集的一部分,它儲存你的資料,參與叢集的索引和搜尋功能。和叢集類似,一個節點也是由一個名字來標識的,預設情況下,這個名字是一個隨機的漫威漫畫角色的名字,這個名字會在啟動的時候賦予節點。這個名字對於管理工作來說挺重要的,因為在這個管理過程中,你會去確定網路中的哪些伺服器對應於Elasticsearch叢集中的哪些節點。

一個節點可以通過配置叢集名稱的方式來加入一個指定的叢集。預設情況下,每個節點都會被安排加入到一個叫做“elasticsearch”的叢集中,這意味著,如果你在你的網路中啟動了若干個節點,並假定它們能夠相互發現彼此,它們將會自動地形成並加入到一個叫做“elasticsearch”的叢集中。

在一個叢集裡,只要你想,可以擁有任意多個節點。而且,如果當前你的網路中沒有執行任何Elasticsearch節點,這時啟動一個節點,會預設建立並加入一個叫做“elasticsearch”的叢集。

索引(index)

一個索引就是一個擁有幾分相似特徵的文件的集合。比如說,你可以有一個客戶資料的索引,另一個產品目錄的索引,還有一個訂單資料的索引。一個索引由一個名字來標識(必須全部是小寫字母的),並且當我們要對對應於這個索引中的文件進行索引、搜尋、更新和刪除的時候,都要使用到這個名字。

在一個叢集中,如果你想,可以定義任意多的索引。

型別(type)

在一個索引中,你可以定義一種或多種型別。一個型別是你的索引的一個邏輯上的分類/分割槽,其語義完全由你來定。通常,會為具有一組共同欄位的文件定義一個型別。比如說,我們假設你運營一個部落格平臺並且將你所有的資料儲存到一個索引中。在這個索引中,你可以為使用者資料定義一個型別,為部落格資料定義另一個型別,當然,也可以為評論資料定義另一個型別。

文件(document)

一個文件是一個可被索引的基礎資訊單元。比如,你可以擁有某一個客戶的文件,某一個產品的一個文件,當然,也可以擁有某個訂單的一個文件。文件以JSON(Javascript Object Notation)格式來表示,而JSON是一個到處存在的網際網路資料互動格式。

在一個index/type裡面,只要你想,你可以儲存任意多的文件。注意,儘管一個文件,物理上存在於一個索引之中,文件必須被索引/賦予一個索引的type。

分片和複製(shards & replicas)

一個索引可以儲存超出單個結點硬體限制的大量資料。比如,一個具有10億文件的索引佔據1TB的磁碟空間,而任一節點都沒有這樣大的磁碟空間;或者單個節點處理搜尋請求,響應太慢。

為了解決這個問題,Elasticsearch提供了將索引劃分成多份的能力,這些份就叫做分片。當你建立一個索引的時候,你可以指定你想要的分片的數量。每個分片本身也是一個功能完善並且獨立的“索引”,這個“索引”可以被放置到叢集中的任何節點上。

分片之所以重要,主要有兩方面的原因:

- 允許你水平分割/擴充套件你的內容容量

- 允許你在分片(潛在地,位於多個節點上)之上進行分散式的、並行的操作,進而提高效能/吞吐量

至於一個分片怎樣分佈,它的文件怎樣聚合回搜尋請求,是完全由Elasticsearch管理的,對於作為使用者的你來說,這些都是透明的。

在一個網路/雲的環境裡,失敗隨時都可能發生,在某個分片/節點不知怎麼的就處於離線狀態,或者由於任何原因消失了,這種情況下,有一個故障轉移機制是非常有用並且是強烈推薦的。為此目的,Elasticsearch允許你建立分片的一份或多份拷貝,這些拷貝叫做複製分片,或者直接叫複製。

複製之所以重要,有兩個主要原因:

- 在分片/節點失敗的情況下,提供了高可用性。因為這個原因,注意到複製分片從不與原/主要(original/primary)分片置於同一節點上是非常重要的。

- 擴充套件你的搜尋量/吞吐量,因為搜尋可以在所有的複製上並行執行

總之,每個索引可以被分成多個分片。一個索引也可以被複制0次(意思是沒有複製)或多次。一旦複製了,每個索引就有了主分片(作為複製源的原來的分片)和複製分片(主分片的拷貝)之別。分片和複製的數量可以在索引建立的時候指定。在索引建立之後,你可以在任何時候動態地改變複製的數量,但是你事後不能改變分片的數量。

預設情況下,Elasticsearch中的每個索引被分片5個主分片和1個複製,這意味著,如果你的叢集中至少有兩個節點,你的索引將會有5個主分片和另外5個複製分片(1個完全拷貝),這樣的話每個索引總共就有10個分片。

插入與查詢

插入兩條員工資料,索引為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"

        }

     }

}

查詢結果:

{

"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"

]

}

}

]

}

}

對查詢結果的說明:

對於這個響應,我們看到了以下的部分:

- took —— Elasticsearch執行這個搜尋的耗時,以毫秒為單位

- timed_out —— 指明這個搜尋是否超時

- _shards —— 指出多少個分片被搜尋了,同時也指出了成功/失敗的被搜尋的shards的數量

- hits —— 搜尋結果

- hits.total —— 能夠匹配我們查詢標準的文件的總數目

- hits.hits —— 真正的搜尋結果資料(預設只顯示前10個文件)

- _score和max_score —— 這個得分是與我們指定的搜尋查詢匹配程度的一個相對度量。得分越高,文件越相關,得分越低文件的相關度越低。

ArcGIS 時空大資料儲存

上面講完了Elasticsearch的相關概念,在ArcGIS時空大資料儲存中這些概念都扮演了重要的角色,這裡暫且不說,日後補齊。先看下ArcGIS時空大資料儲存如何像pg庫一樣進行連線,進行開放。

如何連線ArcGIS時空大資料儲存中的Elasticsearch

連線Elasticsearch,首先要知道它使用的埠。在官方文件中進行查詢

埠 9220 和 9320

ArcGIS Data Store 中提供的時空大資料儲存通過埠 9220 (HTTP) 和 9320 (TCP) 進行通訊。如果您使用GeoEvent Server將資料寫入時空大資料儲存,您需要開啟這些埠。

使用者名稱密碼

其次,還需要ES的使用者名稱和密碼。就像其他的資料庫中的使用者名稱密碼一樣,有了使用者名稱密碼才可以使用ES。在ArcGIS DataStore中,使用工具查詢manage的使用者名稱和密碼。工具的位置在C:\Program Files\ArcGIS\DataStore\tools\listmanageduser

5650937-dd34b56329778c4e.png
查詢es使用者名稱密碼

實用工具

管理es的實用工具套件包括kibana和sense。

kibana和es的版本有關。經過測試,kibana-5.5因版本過高,無法連線時空大資料儲存的es。kibana4.5.2是可用的。其餘版本沒有進行測試。這裡推薦kibana4.5.2

可以直接輸datastore的IP:9220來檢視ArcGIS Datastore中ES的版本。


5650937-7f159a593acafe28.png
時空大資料中es的版本為2.3.2

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

可以檢視當前es伺服器的狀態

5650937-b29722add0452a12.png
當前es伺服器狀態

訪問http://localhost:5601/app/sense 即可進入sense的介面


5650937-f1ebbb1309cfdcc2.png
sense介面

需要修改ip和埠為datastore機器的ip和9220埠才可以使用。初次開啟需要輸入使用者名稱密碼,即kibana.yml中的elasticsearch.username: "els_tctb96n"和elasticsearch.password: "fpinq3kv6ez6r8pw"。

在sense介面,即可輸入GET、PUT、DELETE等命令與Elasticsearch進行互動。

Elasticsearch的入門指南可以參考這本電子書Elasticsearch:權威指南

引用:Elasticsearch基礎教程

相關文章