溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ElasticSearch筆記整理(二):CURL操作、ES插件、集群安裝與核心概念

發(fā)布時(shí)間:2020-07-10 18:28:33 來(lái)源:網(wǎng)絡(luò) 閱讀:30164 作者:xpleaf 欄目:大數(shù)據(jù)

[TOC]


CURL操作

CURL簡(jiǎn)介

curl是利用URL語(yǔ)法在命令行方式下工作的開(kāi)源文件傳輸工具,使用curl可以簡(jiǎn)單實(shí)現(xiàn)常見(jiàn)的get/post請(qǐng)求。簡(jiǎn)單的認(rèn)為是可以在命令行下面訪問(wèn)url的一個(gè)工具。在centos的默認(rèn)庫(kù)里面是有curl工具的,如果沒(méi)有請(qǐng)yum安裝即可。

curl
    -X 指定http的請(qǐng)求方法 有HEAD GET POST PUT DELETE
    -d 指定要傳輸?shù)臄?shù)據(jù)
    -H 指定http請(qǐng)求頭信息

curl創(chuàng)建索引庫(kù)
    curl -XPUT http://<ip>:9200/index_name/
  PUT或POST都可以創(chuàng)建
  舉例:
    curl -XPUT 'http://localhost:9200/bigdata'

CURL操作(一):索引庫(kù)創(chuàng)建與查詢

創(chuàng)建一個(gè)索引庫(kù):

curl -XPUT http://uplooking01:9200/bigdata
返回值{"acknowledged":"true"}

查看一個(gè)索引庫(kù)信息:

curl -XGET http://uplooking01:9200/bigdata
返回值一個(gè)json字符串
如果想要格式良好的結(jié)果
curl -XGET http://uplooking01:9200/bigdata?pretty

在索引庫(kù)中添加若干索引信息:

curl -XPOST http://uplooking01:9200/bigdata/product/1 -d'{
    "name":"hadoop",
    "author":"Dong Couting",
    "version":"2.9.4"
}'  
curl -XPOST http://uplooking01:9200/bigdata/product/2 -d'{
    "name":"hive",
    "author":"facebook",
    "version":"2.1.0",
    "url":"http://hive.apache.org"
}'
curl -XPUT http://uplooking01:9200/bigdata/product/3 -d'{
    "name":"hbase",
    "author":"apache",
    "version":"1.1.5",
    "url":"http://hbase.apache.org"
}'  

查詢某一個(gè)索引庫(kù)下面的所有數(shù)據(jù):

curl -XGET http://uplooking01:9200/bigdata/product/_search
格式良好的寫(xiě)法:
curl -XGET http://uplooking01:9200/bigdata/product/_search?pretty
{
  "took" : 11,
  "timed_out" : false,  ---->是否超時(shí)
  "_shards" : {         ---->分片個(gè)數(shù)(就是kafka中的partition,一個(gè)索引庫(kù)有幾個(gè)分區(qū))
    "total" : 5,        ---->默認(rèn)分片有5個(gè)
    "successful" : 5,   ---->能夠正常提供服務(wù)的有5個(gè)
    "failed" : 0        ----> (total-successful)=failed
  },
  "hits" : {            ---->查詢結(jié)果集
    "total" : 2,        ---->查詢到了幾條記錄
    "max_score" : 1.0,  ---->記錄中最大的得分
    "hits" : [ {        ---->具體的結(jié)果集數(shù)組
      "_index" : "bigdata", ----->結(jié)果所在索引庫(kù)
      "_type" : "product",  ----->結(jié)果所在索引庫(kù)中的某一個(gè)類型type
      "_id" : "2",          ----->結(jié)果索引id
      "_score" : 1.0,       ----->索引得分
      "_source" : {         ----->索引具體內(nèi)容_source
        "name" : "hive",        
        "author" : "facebook",
        "version" : "2.1.0",
        "url" : "http://hive.apache.org"
      }
    }, {
      "_index" : "bigdata",
      "_type" : "product",
      "_id" : "1",
      "_score" : 1.0,
      "_source" : {
        "name" : "hadoop",
        "author" : "Dong Couting",
        "version" : "2.9.4"
      }
    } ]
  }
}
PUT和POST區(qū)別
  • PUT是冪等方法,POST不是。所以PUT用于更新,POST用于新增比較合適。

  • PUT和DELETE操作是冪等的。所謂冪等是指不管進(jìn)行多少次操作,結(jié)果都一樣。比如用PUT修改一篇文章,然后在做同樣的操作,每次操作后的結(jié)果并沒(méi)有什么不同,DELETE也是一樣。

  • POST操作不是冪等的,比如常見(jiàn)的POST重復(fù)加載問(wèn)題:當(dāng)我們多次發(fā)出同樣的POST請(qǐng)求后,其結(jié)果是創(chuàng)建了若干的資源。

  • 還有一點(diǎn)需要注意的就是,創(chuàng)建操作可以使用POST,也可以使用PUT,區(qū)別就在于POST是作用在一個(gè)集合資源(/articles)之上的,而PUT操作是作用在一個(gè)具體資源之上的(/articles/123),比如說(shuō)很多資源使用數(shù)據(jù)庫(kù)自增主鍵作為標(biāo)識(shí)信息,這個(gè)時(shí)候就需要使用PUT了。而創(chuàng)建的資源的標(biāo)識(shí)信息到底是什么,只能由服務(wù)端提供時(shí),這個(gè)時(shí)候就必須使用POST。

    • ES創(chuàng)建索引庫(kù)和索引時(shí)的注意點(diǎn)

    ? 1)索引庫(kù)名稱必須要全部小寫(xiě),不能以下劃線開(kāi)頭,也不能包含逗號(hào)

    ? 2)如果沒(méi)有明確指定索引數(shù)據(jù)的ID,那么es會(huì)自動(dòng)生成一個(gè)隨機(jī)的ID,需要使用POST參數(shù)

    curl-XPOST http://localhost:9200/bigdata/product/ -d'{"author" : "Doug Cutting"}'

舉例說(shuō)明冪等操作:
    StringBuilder sb = new StringBuilder();
    sb.append("aaaa");結(jié)果是什么?sb

    String str = new StringBuilder();

    str.substring();---->新的對(duì)象

CURL操作(二):高級(jí)查詢、更新、刪除與批量操作

查詢所有:

只查詢source中的個(gè)別字段
    curl -XGET 'http://uplooking01:9200/bigdata/product/_search?_source=name,author&pretty'

返回結(jié)果只查詢source
    curl -XGET 'http://uplooking01:9200/bigdata/product/1?_source&pretty'

條件查詢:
    curl -XGET 'http://uplooking01:9200/bigdata/product/_search?q=name:hbase&pretty'
        查詢name為hbase的結(jié)果
    curl -XGET 'http://uplooking01:9200/bigdata/product/_search?q=name:h*&pretty'
        查詢name以h打頭的結(jié)果

分頁(yè)查詢:

curl -XGET 'http://uplooking01:9200/bank/acount/_search?pretty&from=0&size=5'

更新:

使用post put都可以
    curl -XPOST http://uplooking01:9200/bigdata/product/AWA184kojrSrzszxL-Zs -d'{"name":"sqoop", "author":"apache"}'
    curl -XPOST http://uplooking01:9200/bigdata/product/AWA184kojrSrzszxL-Zs -d'{"version":"1.4.6"}'
但是這些操作都是全局更新,理解為刪除之前的,重新創(chuàng)建一個(gè)新的,id相同的document。

局部更新(必須使用POST)
    要是用update,同時(shí)要更新的是source中的doc內(nèi)容
    curl -XPOST http://uplooking01:9200/bigdata/product/AWA184kojrSrzszxL-Zs/_update -d'
    {"doc":{"name":"sqoop", "author":"apache"}}'

說(shuō)明:
   ES可以使用PUT或者POST對(duì)文檔進(jìn)行更新,如果指定ID的文檔已經(jīng)存在,則執(zhí)行更新操作
注意:執(zhí)行更新操作的時(shí)候,ES首先將舊的文檔標(biāo)記為刪除狀態(tài),然后添加新的文檔,舊的文檔不會(huì)立即消失,
但是你也無(wú)法訪問(wèn),ES會(huì)繼續(xù)添加更多數(shù)據(jù)的時(shí)候在后臺(tái)清理已經(jīng)標(biāo)記為刪除狀態(tài)的文檔。

刪除:

普通刪除,根據(jù)主鍵刪除
   curl -XDELETE http://localhost:9200/bigdata/product/3/
說(shuō)明:如果文檔存在,es屬性found:true,successful:1,_version屬性的值+1。
   如果文檔不存在,es屬性found為false,但是版本值version依然會(huì)+1,這個(gè)就是內(nèi)部
管理的一部分,有點(diǎn)像svn版本號(hào),它保證了我們?cè)诙鄠€(gè)節(jié)點(diǎn)間的不同操作的順序被正確標(biāo)記了。
   注意:一個(gè)文檔被刪除之后,不會(huì)立即生效,他只是被標(biāo)記為已刪除。ES將會(huì)在你之后添加
更多索引的時(shí)候才會(huì)在后臺(tái)進(jìn)行刪除。

批量操作-bulk:

Bulk api可以幫助我們同時(shí)執(zhí)行多個(gè)請(qǐng)求
格式:
   action:[index|create|update|delete]
   metadata:_index,_type,_id
   request body:_source(刪除操作不需要)
   {action:{metadata}}\n
   {request body}\n
   {action:{metadata}}\n
   {request body}\n
例如:
{"index":{"_id":"1"}}
{"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"amberduke@pyrami.com","city":"Brogan","state":"IL"}
{"index":{"_id":"6"}}
{"account_number":6,"balance":5686,"firstname":"Hattie","lastname":"Bond","age":36,"gender":"M","address":"671 Bristol Street","employer":"Netagy","email":"hattiebond@netagy.com","city":"Dante","state":"TN"}

  create和index的區(qū)別
    如果數(shù)據(jù)存在,使用create操作失敗,會(huì)提示文檔已經(jīng)存在,使用index則可以成功執(zhí)行。
使用文件的方式
curl -XPOST http://uplooking01:9200/bank/acount/_bulk --data-binary @/home/uplooking/data/accounts.json

關(guān)于批量操作的補(bǔ)充說(shuō)明:

可以查看一下各個(gè)索引庫(kù)信息
curl 'http://localhost:9200/_cat/indices?v'

Bulk請(qǐng)求可以在URL中聲明/_index或者/_index/_type
Bulk一次最大處理多少數(shù)據(jù)量
Bulk會(huì)把將要處理的數(shù)據(jù)載入內(nèi)存中,所以數(shù)據(jù)量是有限制的
最佳的數(shù)據(jù)量不是一個(gè)確定的數(shù)值,它取決于你的硬件,你的文檔大小以及復(fù)雜性,你的索引以及搜索的負(fù)載
一般建議是1000~5000個(gè)文檔,如果你的文檔很大,可以適當(dāng)減少隊(duì)列,大小建議是5~15MB,默認(rèn)不能超過(guò)100M,可以在es的配置文件中修改這個(gè)值
http.max_content_length:100mb

CURL操作(三):ES版本控制

  • 普通關(guān)系型數(shù)據(jù)庫(kù)使用的是(悲觀并發(fā)控制(PCC))

    當(dāng)我們?cè)谧x取一個(gè)數(shù)據(jù)前先鎖定這一行,然后確保只有讀取到數(shù)據(jù)的這個(gè)線程可以修改這一行數(shù)據(jù)。

  • ES使用的是(樂(lè)觀并發(fā)控制(OCC))

    ES不會(huì)阻止某一數(shù)據(jù)的訪問(wèn),然而,如果基礎(chǔ)數(shù)據(jù)在我們讀取和寫(xiě)入的間隔中發(fā)生了變化,更新就會(huì)失敗,這時(shí)候就由程序來(lái)決定如何處理這個(gè)沖突。它可以重新讀取新數(shù)據(jù)來(lái)進(jìn)行更新,又或者將這一情況直接反饋給用戶。

  • ES如何實(shí)現(xiàn)版本控制(使用es內(nèi)部版本號(hào))

? 1:首先得到需要修改的文檔,獲取版本(_version)號(hào)

? curl -XGET http://localhost:9200/bigdata/product/1

? 2:再執(zhí)行更新操作的時(shí)候把版本號(hào)傳過(guò)去

? curl -XPUT http://localhost:9200/bigdata/product/1?version=1 -d '{"name":"hadoop","version":3}'(覆蓋)

? curl -XPOST http://localhost:9200/bigdata/product/1/_update?version=3 -d'{"doc":{"name":"apachehadoop","latest_version": 2.6}}'(部分更新)

? 3:如果傳遞的版本號(hào)和待更新的文檔的版本號(hào)不一致,則會(huì)更新失敗

  • ES如何實(shí)現(xiàn)版本控制(使用外部版本號(hào))

? 如果你的數(shù)據(jù)庫(kù)已經(jīng)存在了版本號(hào),或者是可以代表版本的時(shí)間戳。這時(shí)就可以在es的查詢url后面添加version_type=external來(lái)使用這些號(hào)碼。

? 注意:版本號(hào)碼必須要是大于0小于9223372036854775807(Java中l(wèi)ong的最大正值)的整數(shù)。

     es在處理外部版本號(hào)的時(shí)候,它不再檢查_(kāi)version是否與請(qǐng)求中指定的數(shù)值是否相等,而是檢查當(dāng)前的_version是否比指定的數(shù)值小,如果小,則請(qǐng)求成功。
example:
     curl -XPUT 'http://localhost:9200/bigdata/product/20?version=10&version_type=external' -d '{"name": "flink"}'
     注意:此處url前后的引號(hào)不能省略,否則執(zhí)行的時(shí)候會(huì)報(bào)錯(cuò)

ES插件

ES本身服務(wù)相對(duì)比較少,其功能的強(qiáng)大之處就體現(xiàn)在插件的豐富性上。有非常多的ES插件用于ES的管理,性能的完善,下面介紹的是幾款常用的插件。

BigDesk Plugin

離線安裝:
    bin/plugin install file:/home/uplooking/soft/bigdesk-master.zip
卸載:
    bin/plugin remove bigdesk
在線安裝:
    bin/plugin install hlstudio/bigdesk
訪問(wèn)(web):
    http://uplooking01:9200/_plugin/bigdesk

Elasticsearch-Head Plugin

離線安裝
    bin/plugin install file:/home/uplooking/soft/
在線安裝
    bin/plugin install mobz/elasticsearch-head
訪問(wèn)
    http://uplooking01:9200/_plugin/head/

Elasticsearch Kibana

ELK(ElasticSearch LogStach Kibana)中的其中一個(gè)組件。

配置:
    server.port: 5601
    server.host: "uplooking01"
    elasticsearch.url: "http://uplooking01:9200"
    elasticsearch.username: "jack"
    elasticsearch.password: "uplooking"

訪問(wèn):
    http://uplooking01:5601

常見(jiàn)的報(bào)表工具:
    折線圖
    餅形圖
    柱狀圖

ES集群安裝

如果在一個(gè)局域網(wǎng)內(nèi)的話,只需要修改一個(gè)地方:cluster.name 保持統(tǒng)一即可,
這樣就可以通過(guò)發(fā)現(xiàn)機(jī)制找到新啟動(dòng)的機(jī)器。
如果在不同局域網(wǎng)內(nèi)的要進(jìn)行組網(wǎng),直接禁用發(fā)現(xiàn)機(jī)制,指定對(duì)應(yīng)的節(jié)點(diǎn)主機(jī)名即可。
(但實(shí)際上在使用2.3.0的版本時(shí),并不能自動(dòng)發(fā)現(xiàn),所以為了配置集群,需要將該機(jī)制禁用并手動(dòng)配置節(jié)點(diǎn)主機(jī)名)

cluster.name: bigdata-08-28
node.name: hadoop
path.data: /home/uplooking/data/elasticsearch
path.logs:  /home/uplooking/logs/elasticsearch
network.host: uplooking01
discovery.zen.ping.multicast.enabled: false
discovery.zen.ping.unicast.hosts: ["uplooking01", "uplooking02", "uplooking03"]

ElasticSearch的集群狀態(tài):

Green:  所有的主分片和副分片都可用
Yellow:所有的主分片都可以不是所有的副分片都可用
Red:    不是所有的主分片和副分片都可用

ElasticSearch核心概念

Cluster

代表一個(gè)集群,集群中有多個(gè)節(jié)點(diǎn),其中有一個(gè)為主節(jié)點(diǎn),這個(gè)主節(jié)點(diǎn)是可以通過(guò)選舉產(chǎn)生的,主從節(jié)點(diǎn)是對(duì)于集群內(nèi)部來(lái)說(shuō)的。ES的一個(gè)概念就是去中心化,字面上理解就是無(wú)中心節(jié)點(diǎn),這是對(duì)于集群外部來(lái)說(shuō)的,因?yàn)閺耐獠縼?lái)看ES集群,在邏輯上是個(gè)整體,你與任何一個(gè)節(jié)點(diǎn)的通信和與整個(gè)ES集群通信是等價(jià)的。

主節(jié)點(diǎn)的職責(zé)是負(fù)責(zé)管理集群狀態(tài),包括管理分片的狀態(tài)和副本的狀態(tài),以及節(jié)點(diǎn)的發(fā)現(xiàn)和刪除。

只需要在同一個(gè)網(wǎng)段之內(nèi)啟動(dòng)多個(gè)ES節(jié)點(diǎn),就可以自動(dòng)組成一個(gè)集群。

默認(rèn)情況下ES會(huì)自動(dòng)發(fā)現(xiàn)同一網(wǎng)段內(nèi)的節(jié)點(diǎn),自動(dòng)組成集群。

集群的查看狀態(tài):

http://<ip|host>:9200/_cluster/health?pretty

shards

代表索引分片,ES可以把一個(gè)完整的索引分成多個(gè)分片,這樣的好處是可以把一個(gè)大的索引拆分成多個(gè),分布到不同的節(jié)點(diǎn)上,構(gòu)成分布式搜索。分片的數(shù)量只能在索引創(chuàng)建前指定,并且索引創(chuàng)建后不能更改。

可以在創(chuàng)建索引庫(kù)的時(shí)候指定:

curl -XPUT 'localhost:9200/test1/' -d'{"settings":{"number_of_shards":3}}'

# 默認(rèn)是一個(gè)索引庫(kù)有5個(gè)分片 index.number_of_shards:5

replicas

代表索引副本,ES可以給索引設(shè)置副本,副本的作用一是提高系統(tǒng)的容錯(cuò)性,當(dāng)某個(gè)節(jié)點(diǎn)某個(gè)分片損壞或丟失時(shí)可以從副本中恢復(fù)。二是提高ES的查詢效率,ES會(huì)自動(dòng)對(duì)搜索請(qǐng)求進(jìn)行負(fù)載均衡

可以在創(chuàng)建索引庫(kù)的時(shí)候指定:

curl -XPUT 'localhost:9200/test2/'-d'{"settings":{"number_of_replicas":2}}'

# 默認(rèn)是一個(gè)分片有1個(gè)副本 index.number_of_replicas:1

recovery

代表數(shù)據(jù)恢復(fù)或者叫數(shù)據(jù)重新分布,ES在有節(jié)點(diǎn)加入或退出時(shí)會(huì)根據(jù)機(jī)器的負(fù)載對(duì)索引分片進(jìn)行重新分配,掛掉的節(jié)點(diǎn)重新啟動(dòng)時(shí)也會(huì)進(jìn)行數(shù)據(jù)恢復(fù)。

gateway

代表ES索引的持久化存儲(chǔ)方式,ES默認(rèn)是先把索引存放到內(nèi)存中,當(dāng)內(nèi)存滿了時(shí)再持久化到硬盤(pán)。當(dāng)這個(gè)ES集群關(guān)閉再重新啟動(dòng)時(shí)就會(huì)從gateway中讀取索引數(shù)據(jù)。ES支持多種類型的gateway,有本地文件系統(tǒng)(默認(rèn)),分布式文件系統(tǒng),Hadoop的HDFS和amazon的s3云存儲(chǔ)服務(wù)。

discovery.zen

代表ES的自動(dòng)發(fā)現(xiàn)節(jié)點(diǎn)機(jī)制,ES是一個(gè)基于p2p的系統(tǒng),它先通過(guò)廣播尋找存在的節(jié)點(diǎn),再通過(guò)多播協(xié)議來(lái)進(jìn)行節(jié)點(diǎn)之間的通信,同時(shí)也支持點(diǎn)對(duì)點(diǎn)的交互。

如果是不同網(wǎng)段的節(jié)點(diǎn)如果組成ES集群,禁用自動(dòng)發(fā)現(xiàn)機(jī)制:
    discovery.zen.ping.multicast.enabled: false

設(shè)置新節(jié)點(diǎn)被啟動(dòng)時(shí)能夠發(fā)現(xiàn)的注解列表:
    discovery.zen.ping.unicast.hosts: ["master:9200","slave01:9200"]

transport

代表ES內(nèi)部節(jié)點(diǎn)或集群與客戶端的交互方式,默認(rèn)內(nèi)部是使用tcp協(xié)議進(jìn)行交互,同時(shí)它支持http協(xié)議(json格式)、thrift、servlet、memcached、zeroMQ等傳輸協(xié)議(通過(guò)插件方式集成)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI