您好,登錄后才能下訂單哦!
[TOC]
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'
創(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不是。所以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。
? 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ì)象
查詢所有:
只查詢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
普通關(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)行更新,又或者將這一情況直接反饋給用戶。
? 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ì)更新失敗
? 如果你的數(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本身服務(wù)相對(duì)比較少,其功能的強(qiáng)大之處就體現(xiàn)在插件的豐富性上。有非常多的ES插件用于ES的管理,性能的完善,下面介紹的是幾款常用的插件。
離線安裝:
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
離線安裝
bin/plugin install file:/home/uplooking/soft/
在線安裝
bin/plugin install mobz/elasticsearch-head
訪問(wèn)
http://uplooking01:9200/_plugin/head/
即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)表工具:
折線圖
餅形圖
柱狀圖
如果在一個(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: 不是所有的主分片和副分片都可用
代表一個(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
代表索引分片,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
代表索引副本,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
代表數(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ù)。
代表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ù)。
代表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"]
代表ES內(nèi)部節(jié)點(diǎn)或集群與客戶端的交互方式,默認(rèn)內(nèi)部是使用tcp協(xié)議進(jìn)行交互,同時(shí)它支持http協(xié)議(json格式)、thrift、servlet、memcached、zeroMQ等傳輸協(xié)議(通過(guò)插件方式集成)。
免責(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)容。