[TOC]
CURL操作
CURL简介
curl是利用URL语法在命令行方式下工作的开源文件传输工具,使用curl可以简单实现常见的get/post请求。简单的认为是可以在命令行下面访问url的一个工具。在centos的默认库里面是有curl工具的,如果没有请yum安装即可。
curl
-X 指定http的请求方法 有HEAD GET POST PUT DELETE
-d 指定要传输的数据
-H 指定http请求头信息
curl创建索引库
curl -XPUT http://<ip>:9200/index_name/
PUT或POST都可以创建
举例:
curl -XPUT 'http://localhost:9200/bigdata'
CURL操作(一):索引库创建与查询
创建一个索引库:
curl -XPUT http://uplooking01:9200/bigdata
返回值{"acknowledged":"true"}
查看一个索引库信息:
curl -XGET http://uplooking01:9200/bigdata
返回值一个json字符串
如果想要格式良好的结果
curl -XGET http://uplooking01:9200/bigdata?pretty
在索引库中添加若干索引信息:
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"
}'
查询某一个索引库下面的所有数据:
curl -XGET http://uplooking01:9200/bigdata/product/_search
格式良好的写法:
curl -XGET http://uplooking01:9200/bigdata/product/_search?pretty
{
"took" : 11,
"timed_out" : false, ---->是否超时
"_shards" : { ---->分片个数(就是kafka中的partition,一个索引库有几个分区)
"total" : 5, ---->默认分片有5个
"successful" : 5, ---->能够正常提供服务的有5个
"failed" : 0 ----> (total-successful)=failed
},
"hits" : { ---->查询结果集
"total" : 2, ---->查询到了几条记录
"max_score" : 1.0, ---->记录中最大的得分
"hits" : [ { ---->具体的结果集数组
"_index" : "bigdata", ----->结果所在索引库
"_type" : "product", ----->结果所在索引库中的某一个类型type
"_id" : "2", ----->结果索引id
"_score" : 1.0, ----->索引得分
"_source" : { ----->索引具体内容_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用于更新,POST用于新增比较合适。
-
PUT和DELETE操作是幂等的。所谓幂等是指不管进行多少次操作,结果都一样。比如用PUT修改一篇文章,然后在做同样的操作,每次操作后的结果并没有什么不同,DELETE也是一样。
-
POST操作不是幂等的,比如常见的POST重复加载问题:当我们多次发出同样的POST请求后,其结果是创建了若干的资源。
-
还有一点需要注意的就是,创建操作可以使用POST,也可以使用PUT,区别就在于POST是作用在一个集合资源(/articles)之上的,而PUT操作是作用在一个具体资源之上的(/articles/123),比如说很多资源使用数据库自增主键作为标识信息,这个时候就需要使用PUT了。而创建的资源的标识信息到底是什么,只能由服务端提供时,这个时候就必须使用POST。
- ES创建索引库和索引时的注意点
1)索引库名称必须要全部小写,不能以下划线开头,也不能包含逗号
2)如果没有明确指定索引数据的ID,那么es会自动生成一个随机的ID,需要使用POST参数
curl-XPOST http://localhost:9200/bigdata/product/ -d'{"author" : "Doug Cutting"}’
举例说明幂等操作:
StringBuilder sb = new StringBuilder();
sb.append("aaaa");结果是什么?sb
String str = new StringBuilder();
str.substring();---->新的对象
CURL操作(二):高级查询、更新、删除与批量操作
查询所有:
只查询source中的个别字段
curl -XGET 'http://uplooking01:9200/bigdata/product/_search?_source=name,author&pretty'
返回结果只查询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的结果
curl -XGET 'http://uplooking01:9200/bigdata/product/_search?q=name:h*&pretty'
查询name以h打头的结果
分页查询:
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"}'
但是这些操作都是全局更新,理解为删除之前的,重新创建一个新的,id相同的document。
局部更新(必须使用POST)
要是用update,同时要更新的是source中的doc内容
curl -XPOST http://uplooking01:9200/bigdata/product/AWA184kojrSrzszxL-Zs/_update -d'
{"doc":{"name":"sqoop", "author":"apache"}}'
说明:
ES可以使用PUT或者POST对文档进行更新,如果指定ID的文档已经存在,则执行更新操作
注意:执行更新操作的时候,ES首先将旧的文档标记为删除状态,然后添加新的文档,旧的文档不会立即消失,
但是你也无法访问,ES会继续添加更多数据的时候在后台清理已经标记为删除状态的文档。
删除:
普通删除,根据主键删除
curl -XDELETE http://localhost:9200/bigdata/product/3/
说明:如果文档存在,es属性found:true,successful:1,_version属性的值+1。
如果文档不存在,es属性found为false,但是版本值version依然会+1,这个就是内部
管理的一部分,有点像svn版本号,它保证了我们在多个节点间的不同操作的顺序被正确标记了。
注意:一个文档被删除之后,不会立即生效,他只是被标记为已删除。ES将会在你之后添加
更多索引的时候才会在后台进行删除。
批量操作-bulk:
Bulk api可以帮助我们同时执行多个请求
格式:
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的区别
如果数据存在,使用create操作失败,会提示文档已经存在,使用index则可以成功执行。
使用文件的方式
curl -XPOST http://uplooking01:9200/bank/acount/_bulk --data-binary @/home/uplooking/data/accounts.json
关于批量操作的补充说明:
可以查看一下各个索引库信息
curl 'http://localhost:9200/_cat/indices?v'
Bulk请求可以在URL中声明/_index或者/_index/_type
Bulk一次最大处理多少数据量
Bulk会把将要处理的数据载入内存中,所以数据量是有限制的
最佳的数据量不是一个确定的数值,它取决于你的硬件,你的文档大小以及复杂性,你的索引以及搜索的负载
一般建议是1000~5000个文档,如果你的文档很大,可以适当减少队列,大小建议是5~15MB,默认不能超过100M,可以在es的配置文件中修改这个值
http.max_content_length:100mb
CURL操作(三):ES版本控制
-
普通关系型数据库使用的是(悲观并发控制(PCC))
当我们在读取一个数据前先锁定这一行,然后确保只有读取到数据的这个线程可以修改这一行数据。
-
ES使用的是(乐观并发控制(OCC))
ES不会阻止某一数据的访问,然而,如果基础数据在我们读取和写入的间隔中发生了变化,更新就会失败,这时候就由程序来决定如何处理这个冲突。它可以重新读取新数据来进行更新,又或者将这一情况直接反馈给用户。
- ES如何实现版本控制(使用es内部版本号)
1:首先得到需要修改的文档,获取版本(_version)号
curl -XGET http://localhost:9200/bigdata/product/1
2:再执行更新操作的时候把版本号传过去
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:如果传递的版本号和待更新的文档的版本号不一致,则会更新失败
- ES如何实现版本控制(使用外部版本号)
如果你的数据库已经存在了版本号,或者是可以代表版本的时间戳。这时就可以在es的查询url后面添加version_type=external来使用这些号码。
注意:版本号码必须要是大于0小于9223372036854775807(Java中long的最大正值)的整数。
es在处理外部版本号的时候,它不再检查_version是否与请求中指定的数值是否相等,而是检查当前的_version是否比指定的数值小,如果小,则请求成功。
example:
curl -XPUT 'http://localhost:9200/bigdata/product/20?version=10&version_type=external' -d '{"name": "flink"}'
注意:此处url前后的引号不能省略,否则执行的时候会报错
ES插件
ES本身服务相对比较少,其功能的强大之处就体现在插件的丰富性上。有非常多的ES插件用于ES的管理,性能的完善,下面介绍的是几款常用的插件。
BigDesk Plugin
离线安装:
bin/plugin install file:/home/uplooking/soft/bigdesk-master.zip
卸载:
bin/plugin remove bigdesk
在线安装:
bin/plugin install hlstudio/bigdesk
访问(web):
http://uplooking01:9200/_plugin/bigdesk
Elasticsearch-Head Plugin
离线安装
bin/plugin install file:/home/uplooking/soft/
在线安装
bin/plugin install mobz/elasticsearch-head
访问
http://uplooking01:9200/_plugin/head/
Elasticsearch Kibana
即ELK(ElasticSearch LogStach Kibana)
中的其中一个组件。
配置:
server.port: 5601
server.host: "uplooking01"
elasticsearch.url: "http://uplooking01:9200"
elasticsearch.username: "jack"
elasticsearch.password: "uplooking"
访问:
http://uplooking01:5601
常见的报表工具:
折线图
饼形图
柱状图
ES集群安装
如果在一个局域网内的话,只需要修改一个地方:cluster.name 保持统一即可,
这样就可以通过发现机制找到新启动的机器。
如果在不同局域网内的要进行组网,直接禁用发现机制,指定对应的节点主机名即可。
(但实际上在使用2.3.0的版本时,并不能自动发现,所以为了配置集群,需要将该机制禁用并手动配置节点主机名)
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的集群状态:
Green: 所有的主分片和副分片都可用
Yellow:所有的主分片都可以不是所有的副分片都可用
Red: 不是所有的主分片和副分片都可用
ElasticSearch核心概念
Cluster
代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。ES的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看ES集群,在逻辑上是个整体,你与任何一个节点的通信和与整个ES集群通信是等价的。
主节点的职责是负责管理集群状态,包括管理分片的状态和副本的状态,以及节点的发现和删除。
只需要在同一个网段之内启动多个ES节点,就可以自动组成一个集群。
默认情况下ES会自动发现同一网段内的节点,自动组成集群。
集群的查看状态:
http://<ip|host>:9200/_cluster/health?pretty
shards
代表索引分片,ES可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上,构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。
可以在创建索引库的时候指定:
curl -XPUT 'localhost:9200/test1/' -d'{"settings":{"number_of_shards":3}}'
# 默认是一个索引库有5个分片 index.number_of_shards:5
replicas
代表索引副本,ES可以给索引设置副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高ES的查询效率,ES会自动对搜索请求进行负载均衡。
可以在创建索引库的时候指定:
curl -XPUT 'localhost:9200/test2/'-d'{"settings":{"number_of_replicas":2}}'
# 默认是一个分片有1个副本 index.number_of_replicas:1
recovery
代表数据恢复或者叫数据重新分布,ES在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。
gateway
代表ES索引的持久化存储方式,ES默认是先把索引存放到内存中,当内存满了时再持久化到硬盘。当这个ES集群关闭再重新启动时就会从gateway中读取索引数据。ES支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。
discovery.zen
代表ES的自动发现节点机制,ES是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。
如果是不同网段的节点如果组成ES集群,禁用自动发现机制:
discovery.zen.ping.multicast.enabled: false
设置新节点被启动时能够发现的注解列表:
discovery.zen.ping.unicast.hosts: ["master:9200","slave01:9200"]
transport
代表ES内部节点或集群与客户端的交互方式,默认内部是使用tcp协议进行交互,同时它支持http协议(json格式)、thrift、servlet、memcached、zeroMQ等传输协议(通过插件方式集成)。
原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/tech/opensource/193539.html