elasticsearch 删数据在大数据中能实现哪些功能

主题信息(必填)
主题描述(最多限制在50个字符)
申请人信息(必填)
申请信息已提交审核,请注意查收邮件,我们会尽快给您反馈。
如有疑问,请联系
CSDN &《程序员》编辑/记者,投稿&纠错等事宜请致邮
你只管努力,剩下的交给时光!
如今的编程是一场程序员和上帝的竞赛,程序员要开发出更大更好、傻瓜都会用到软件。而上帝在努力创造出更大更傻的傻瓜。目前为止,上帝是赢的。个人网站:。个人QQ群:、
个人大数据技术博客:
本文会分享ElasticSearch如何应用在大数据中以及ElasticSearch的应用场景,具体包括ElasticSearch vs Lucene,ElasticSearch
Solr,ElasticSearch vs 关系型数据库,ElasticSearch 架构。后使用快捷导航没有帐号?
如何提高ElasticSearch 索引速度
最新回复: 17:21:00
我Google了下,大致给出的答案如下:
使用bulk API
初次索引的时候,把 replica 设置为 0
增大 threadpool.index.queue_size
增大 indices.memory.index_buffer_size
增大 index.translog.flush_threshold_ops
增大 index.translog.sync_interval
增大 index.engine.robin.refresh_interval
这篇文章会讲述上面几个参数的原理,以及一些其他的思路。这些参数大体上是朝着两个方向优化的:
减少磁盘写入
增大构建索引处理资源
一般而言,通过第二种方式的需要慎用,会对集群查询功能造成比较大的影响。
这里还有两种形态的解决方案:
关闭一些特定场景并不需要的功能,比如Translog或者Version等
将部分计算挪到其他并行计算框架上,比如数据的分片计算等,都可以放到Spark上事先算好
上面的参数都和什么有关
其中 5,6 属于 TransLog 相关。
4 则和Lucene相关
3 则因为ES里大量采用线程池,构建索引的时候,是有单独的线程池做处理的
7 的话个人认为影响不大
2 的话,能够使用上的场景有限。个人认为Replica这块可以使用Kafka的ISR机制。所有数据还是都从Primary写和读。Replica尽量只作为备份数据。
为什么要有Translog? 因为Translog顺序写日志比构建索引更高效。我们不可能每加一条记录就Commit一次,这样会有大量的文件和磁盘IO产生。但是我们又想避免程序挂掉或者硬件故障而出现数据丢失,所以有了Translog,通常这种日志我们叫做Write Ahead Log。
为了保证数据的完整性,ES默认是每次request结束后都会进行一次sync操作。具体可以查看如下方法:
该方法会调用IndexShard.sync 方法进行文件落地。
你也可以通过设置index.translog.durability=async 来完成异步落地。这里的异步其实可能会有一点点误导。前面是每次request结束后都会进行sync,这里的sync仅仅是将Translog落地。而无论你是否设置了async,都会执行如下操作:根据条件,主要是每隔sync_interval(5s) ,如果flush_threshold_ops(Integer.MAX_VALUE),flush_threshold_size(512m),flush_threshold_period(30m) 满足对应的条件,则进行flush操作,这里除了对Translog进行Commit以外,也对索引进行了Commit。
所以如果你是海量的日志,可以容忍发生故障时丢失一定的数据,那么完全可以设置,index.translog.durability=async,并且将前面提到的flush*相关的参数调大。
而极端情况,你还可以有两个选择:
设置index.translog.durability=async,接着设置index.translog.disable_flush=true进行禁用定时flush。然后你可以通过应用程序自己手动来控制flush。
通过改写ES 去掉Translog日志相关的功能。
当然,如果去掉Translog日志有两个风险点:
Get最新数据会有点问题。因为根据ID Get最新数据是从Translog里拿的。
我们知道ES通过Shard Replication 保证Node节点出现故障时出现数据的完整性。在Relocating的时候,Replica 从Primary 进行Recover时,Primary会先Snapshot Lucene,然后拷贝数据到Replica,最后通过回放Translog 保证数据的一致性。
Version可以让ES实现并发修改,但是带来的性能影响也是极大的,这里主要有两块:
需要访问索引里的版本号,触发磁盘读写
目前而言,似乎没有办法直接关闭Version机制。你可以使用自增长ID并且在构建索引时,index 类型设置为create。这样可以跳过版本检查。
这个场景主要应用于不可变日志导入,随着ES被越来越多的用来做日志分析,日志没有主键ID,所以使用自增ID是合适的,并且不会进行更新,使用一个固定的版本号也是合适的。而不可变日志往往是追求吞吐量。
当然,如果有必要,我们也可以通过改写ES相关代码,禁用版本管理。
ES是对索引进行了分片(Shard),然后数据被分发到不同的Shard。这样 查询和构建索引其实都存在一个问题:
如果是构建索引,则需要对数据分拣,然后根据Shard分布分发到不同的Node节点上。
如果是查询,则对外提供的Node需要收集各个Shard的数据做Merge
这都会对对外提供的节点造成较大的压力,从而影响整个bulk/query 的速度。
一个可行的方案是,直接面向客户提供构建索引和查询API的Node节点都采用client模式,不存储数据,可以达到一定的优化效果。
另外一个较为麻烦但似乎会更优的解决方案是,如果你使用类似Spark Streaming这种流式处理程序,在最后往ES输出的时候,可以做如下几件事情:
获取所有primary shard的信息,并且给所有shard带上一个顺序的数字序号,得到partition(顺序序号) -& shardId的映射关系
对数据进行repartition,分区后每个partition对应一个shard的数据
遍历这些partions,写入ES。方法为直接通过RPC 方式,类似transportService.sendRequest 将数据批量发送到对应包含有对应ShardId的Node节点上。
这样有三点好处:
所有的数据都被直接分到各个Node上直接处理。避免所有的数据先集中到一台服务器
避免二次分发,减少一次网络IO
防止最先处理数据的Node压力太大而导致木桶短板效应
因为我正好要做日志分析类的应用,追求高吞吐量,这样上面的三个优化其实都可以做了。一个典型只增不更新的日志入库操作,可以采用如下方案:
对接Spark Streaming,在Spark里对数据做好分片,直接推送到ES的各个节点
禁止自动flush操作,每个batch 结束后手动flush。
避免使用Version
我们可以预期ES会产生多少个新的Segment文件,通过控制batch的周期和大小,预判出ES Segment索引文件的生成大小和Merge情况。最大可能减少ES的一些额外消耗
大体是下面这三个点让es比原生的lucene吞吐量下降了不少:
为了数据完整性 ES额外添加了WAL(tanslog)
为了能够并发修改 添加了版本机制
对外提供服务的node节点存在瓶颈
ES的线性扩展问题主要受限于第三点,
具体描述就是:
如果是构建索引,接受到请求的Node节点需要对数据分拣,然后根据Shard分布分发到不同的Node节点上。
如果是查询,则对外提供的Node需要收集各个Shard的数据做Merge
另外,索引的读写并不需要向Master汇报。
顶一个!!
如果附件按钮无法使用,请将Adobe Flash Player 更新到最新版本!
`@trans`drinking_poetry`~trans`
`@trans`drinking_poetry_des`~trans`
联系我们:
版权所有 (C) 华为技术有限公司 。 保留一切权利。粤A2-号ElasticSearch大数据分布式弹性搜索引擎使用—从0到1
vim /etc/init.d/elasticsearch
这个配置会被启动的时候设置到es实例中去。
这个时候试着重启三台机器的es实例,看能不能在_plugin/head中查看到三台机器的集群状态。(记得访问安装了head插件的那台机器,我这里是在10机器上安装的)
红色的就是你设置的node.name节点名称,他们在一个集群里工作。
3.3.安装中文分词器ik(注意对应版本问题)
此时集群应该可以工作了,我们还需要配置中文分词器,毕竟我们使用的中文,elasticsearch的自带的分词器对中文分词支持的不太适合本土。
我是使用的ik分词器,在github上的地址:/medcl/elasticsearch-analysis-ik
先别急的clone,我们先来看下ik分词器所支持的elasticsearch对应的版本。
我们使用的elasticsearch版本为2.3.4。所以我们要找对应的ik版本,要不然启动的时候就直接报加载不了对应版本的ik插件。切换到release版本列表,找到对应的版本然后下载下来。
你可以直接下载到Linux机器上,也可以下载到你的宿主机器上然后复制到虚拟机上。如果你的elasticsearch版本是最新的,你可能就需要下载ik下来编译之后再部署。
当然你可以使用git+maven的方式安装,详细的安装步骤可以参见:/medcl/elasticsearch-analysis-ik
这也比较简单,我这里就不重复了。安装好之后重启es实例。
3.4.elasticsearch集群规划(master尽量不要作为data节点,独立master为commander)
可以这样规划一个集群。master可以两台,这两个节点都是作为commander统筹集群层面的事务,取消这两台的data权利。然后在规划出三个节点的data集群,取消这三个节点的master权利。让他们安心的做好数据存储和检索服务。这是最小的粒度集群结构,可以基于这个结构进行扩展。
这样做有一个好处,就是职责分明,可以最大限度的防止master节点有事data节点,导致不稳定因素发生。比如,data节点的数据复制,数据平衡,路由等等,直接影响master的稳定性。进而可能会发生脑裂问题。
我们进入最后一个环节,所有的东西都准备好了,我们是不是应该操作操作这个强大的搜索引擎了。come on。
4.1.接入集群方式
说到集群,就会有相应的问题随之而来,高可用、高并发、大数据、横向扩展等等。那么elasticsearh的集群大概是个什么原理。
首先client的在接入集群的时候为了保证高可用不是采用 vip漂移实现高可用,类似keepalived 这种。elasticserach在客户端连接的时候使用配置多个IP的方式来首先客户端sdk的负载。这已经是分布式系统常见的做法了。只有类似DB、cache这样中心化的集群需要使用,以为是它们的使用特点决定了。(数据一致性)
elasticsearch的所有节点都可以处理请求,节点越多并发QPS越高,相应的TPS会下降,但是下降的性能不是根据节点的正比例来的。(它使用quorum(法定人数)算法,保证可用性。)所以节点的复制不是我们想当然的那样。
连接es集群的方式有两种,性能高点的就是直接将client扮演成cluster node进去集群,同时取消自己的data权利。这通常都是用来做二次开发用的,你可以github clone下来源码添加自己的场景然后进入集群,可能你会干预选举,也可能会干预sharding,也可能会干预集群平衡。
elasticsearch 使用自己定义的一套DSL语言,使用restful方式使用,根据不同的rest end point来使用。比如,_search、_cat、_query等等。这些都是指点的rest端点。然后你可以post dsl到elasticsearch服务器处理。
elasticsearch search dsl:https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html
elasticsearch dsl api:http://elasticsearch-dsl.readthedocs.io/en/latest/
POST _search { &query&: { &bool& : { &must& : { &query_string& : { &query& : &query some test& } }, &filter& : { &term& : { &user& : &plen& } } } } }
可读性很强,在通过chrome插件Sense辅助编写,会比较方便。
但是一般都不会这么做,一般都是使用sdk连接集群。直接使用dsl的大多是在测试数据的时候或者在调试的时候。看sdk输出的dsl是否正确。就跟调试SQL差不多。
4.1.1.net nest使用(使用pool连接es集群)
.NET程序有开源包nest,直接在Nuget上搜索安装即可。
官网地址:https://www.elastic.co/guide/en/elasticsearch/client/net-api/1.x/nest-connecting.html
使用pool高可用的方式连接集群。
var node1 = new Uri(&http://192.168.0.10:9200&); var node2 = new Uri(&http://192.168.0.20:9200&); var node3 = new Uri(&http://192.168.0.30:9200&);
var connectionPool = new SniffingConnectionPool(new[] { node1, node2, node3 });
var settings = new ConnectionSettings(connectionPool);
var client = new ElasticClient(settings);
此时使用client对象就是软负载的,它会根据一定的策略来均衡的连接后台三个node。(可能是平均的、可能是权重的,具体没研究)
4.1.2.java jest使用
java 的话我是使用jest。我们创建一个maven项目,然后添加jest 相应的jar包maven引用。
io.searchbox
org.elasticsearch
elasticsearch
JestClientFactoryfactory=newJestClientFactory();
Listnodes=newLinkedList();
nodes.add(&http://192.168.0.10:9200&);
nodes.add(&http://192.168.0.20:9200&);
nodes.add(&http://192.168.0.30:9200&);
HttpClientConfigconfig=newHttpClientConfig.Builder(nodes).multiThreaded(true).build();
factory.setHttpClientConfig(config);
JestHttpClientclient=(JestHttpClient)factory.getObject();
SearchSourceBuildersearchSourceBuilder=newSearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.queryStringQuery(&中华人名共和国&));
searchSourceBuilder.field(&name&);
Searchsearch=newSearch.Builder(searchSourceBuilder.toString()).build();
JestResultrs=client.execute(search);
System.out.println(rs.getJsonString());
{ &took&: 71, &timed_out&: false, &_shards&: { &total&: 45, &successful&: 45, &failed&: 0 }, &hits&: { &total&: 6, &max_score&: 0.6614378, &hits&: [ { &_index&: &posts&, &_type&: &post&, &_id&: &1&, &_score&: 0.6614378, &fields&: { &name&: [ &王清培& ] } }, { &_index&: &posts&, &_type&: &post&, &_id&: &5&, &_score&: 0., &fields&: { &name&: [ &王清培& ] } }, { &_index&: &posts&, &_type&: &post&, &_id&: &2&, &_score&: 0., &fields&: { &name&: [ &王清培& ] } }, { &_index&: &posts&, &_type&: &post&, &_id&: &AVaKENIckgl39nrAi9V5&, &_score&: 0., &fields&: { &name&: [ &王清培& ] } }, { &_index&: &class&, &_type&: &student&, &_id&: &1&, &_score&: 0. }, { &_index&: &posts&, &_type&: &post&, &_id&: &3&, &_score&: 0., &fields&: { &name&: [ &王清培& ] } } ] } }
返回的数据横跨多个索引。你可以通过不断的debug来查看链接IP是不是会启动切换,是不是会起到可用性的作用。
4.2.index开发
索引开发一般步骤比较简单,首先建立对应的mapping映射,配置好各个type中的field的特性。
4.2.1.mapping 配置
mapping是es实例用来在index的时候,作为各个字段的操作依据。比如,username,这个字段是否要索引、是否要存储、长度大小等等。虽然elasticsearch可以动态的处理这些,但是出于管理和运维的目的还是建议建立对应的索引映射,这个映射可以保存在文件里,以便将来重建索引用。
POST /demoindex { &mappings&: { &demotype&: { &properties&: { &contents&: { &type&: &string&, &index&: &analyzed& }, &name&: { &store&: true, &type&: &string&, &index&: &analyzed& }, &id&: { &store&: true, &type&: &long& }, &userId&: { &store&: true, &type&: &long& } } } } }
这是一个最简单的mapping,定义了索引名称为demoindex,类型为demotype的mapping。各个字段分别是一个json对象,里面有类型有索引是否需要。
这个在sense里编辑,然后直接post提交。
{ &acknowledged&: true }
通过查看创建好的索引信息确认是否是你提交的mapping设置。
4.2.2.mapping template配置
每次都通过手动的创建类似的mapping始终是个低效率的事情,elasticserach支持建立mapping模板,然后让模板自动匹配使用哪个mapping定义。
PUT log_template { &order&: 10, &template&: &log_*&, &settings&: { &index&: { &number_of_replicas&: &2&, &number_of_shards&: &5& } }, &mappings&: { &_default_&: { &_source_&: { &enable&: false } } } }
创建一个log类型的索引mapping。我们设置了两个基本的属性, &number_of_replicas&: &2& 复制分数, &number_of_shards&: &5& 分片个数。mappings里面设置了source字段默认不开启。
当我们提交所有以&log_xxx&名字格式的索引时将自动命中这个mapping模板。 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
ElasticSearch分布式搜索引擎在导航大数据检索中的应用
下载积分:1500
内容提示:ElasticSearch分布式搜索引擎在导航大数据检索中的应用
文档格式:PDF|
浏览次数:11|
上传日期: 16:40:00|
文档星级:
全文阅读已结束,如果下载本文需要使用
 1500 积分
下载此文档
该用户还上传了这些文档
ElasticSearch分布式搜索引擎在导航大数据检索中的应用
官方公共微信

我要回帖

更多关于 elasticsearch 删数据 的文章

 

随机推荐