ES重启后head插件显示粉红色
zqc0512 回复了问题 • 5 人关注 • 3 个回复 • 2801 次浏览 • 2019-01-09 11:09
有个副本分片一直处于initializing状态
tianqi 回复了问题 • 6 人关注 • 4 个回复 • 5928 次浏览 • 2019-01-17 14:04
ELK 使用小技巧(第 4 期)
rochy 发表了文章 • 6 个评论 • 5554 次浏览 • 2019-01-07 20:43
ELK Tips 主要介绍一些 ELK 使用过程中的小技巧,内容主要来源为 Elastic 中文社区。
一、Logstash
1、Logstash 性能调优主要参数
pipeline.workers
:设置启动多少个线程执行 fliter 和 output;当 input 的内容出现堆积而 CPU 使用率还比较充足时,可以考虑增加该参数的大小;pipeline.batch.size
:设置单个工作线程在执行过滤器和输出之前收集的最大事件数,较大的批量大小通常更高效,但会增加内存开销。输出插件会将每个批处理作为一个输出单元。;例如,ES 输出会为收到的每个批次发出批量请求;调整pipeline.batch.size
可调整发送到 ES 的批量请求(Bulk)的大小;pipeline.batch.delay
:设置 Logstash 管道的延迟时间, 管道批处理延迟是 Logstash 在当前管道工作线程中接收事件后等待新消息的最长时间(以毫秒为单位);简单来说,当pipeline.batch.size
不满足时,会等待pipeline.batch.delay
设置的时间,超时后便开始执行 filter 和 output 操作。
2、使用 Ruby Filter 根据现有字段计算一个新字段
<br /> filter {<br /> ruby {<br /> code => "event.set('kpi', ((event.get('a') + event.get('b'))/(event.get('c')+event.get('d'))).round(2))"<br /> }<br /> }<br />
3、logstash filter 如何判断字段是够为空或者 null
<br /> if ![updateTime]<br />
4、Date Filter 设置多种日期格式
<br /> date {<br /> match => ["logtime", "yyyy-MM-dd HH:mm:ss.SSS","yyyy-MM-dd HH:mm:ss,SSS"]<br /> target => "logtime_utc"<br /> }<br />
二、Elasticsearch
1、高效翻页 Search After
通常情况下我们会使用 from 和 size 的方式实现查询结果的翻页,但是当达到深度分页时,成本变得过高(堆内存占用和时间耗费与 from+size 的大小成正比),因此 ES 设置了限制(
index.max_result_window
),默认值为 10000,防止用户进行过于深入的翻页。
推荐使用 Scroll api 进行高效深度滚动,但滚动上下文代价很高,因此不要将 Scroll 用于实时用户请求。search_after 参数通过提供实时游标来解决深度滚动的问题,其主要思路是使用上一页的结果来帮助检索下一页。
<br /> GET twitter/_search<br /> {<br /> "size": 10,<br /> "query": {<br /> "match" : {<br /> "title" : "elasticsearch"<br /> }<br /> },<br /> "search_after": [1463538857, "654323"],<br /> "sort": [<br /> {"date": "asc"},<br /> {"tie_breaker_id": "asc"}<br /> ]<br /> }<br />
2、ES 文档相似度 BM25 参数设置
ES2.X 默认是以 TF/IDF 算法计算文档相似度,从 ES5.X 开始,BM25 作为默认的相似度计算算法。
<br /> PUT /index<br /> {<br /> "settings" : {<br /> "index" : {<br /> "similarity" : {<br /> "my_similarity" : {<br /> "type" : "DFR",<br /> "basic_model" : "g",<br /> "after_effect" : "l",<br /> "normalization" : "h2",<br /> "normalization.h2.c" : "3.0"<br /> }<br /> }<br /> }<br /> }<br /> }<br /> <br /> PUT /index/_mapping/_doc<br /> {<br /> "properties" : {<br /> "title" : { "type" : "text", "similarity" : "my_similarity" }<br /> }<br /> }<br />
3、ES2.X 得分计算
得分计算脚本:
<br /> double tf = Math.sqrt(doc.freq); <br /> double idf = Math.log((field.docCount+1.0)/(term.docFreq+1.0)) + 1.0; <br /> double norm = 1/Math.sqrt(doc.length); <br /> return query.boost * tf * idf * norm;<br />
- 忽略词频统计及词频位置:将字段的
index_options
设置为docs
;- 忽略字段长度:设置字段的
"norms": { "enabled": false }
;
4、CircuitBreakingException: [parent] Data too large
报错信息:
<br /> [WARN ][r.suppressed ] path: /, params: {}<br /> org.elasticsearch.common.breaker.CircuitBreakingException: [parent] Data too large, data for [<http_request>] would be [1454565650/1.3gb], which is larger than the limit of [1454427340/1.3gb], usages [request=0/0b, fielddata=568/568b, in_flight_requests=0/0b, accounting=1454565082/1.3gb]<br />
jvm 堆内存不够当前查询加载数据所以会报 data too large, 请求被熔断,indices.breaker.request.limit
默认为 jvm heap 的 60%,因此可以通过调整 ES 的 Heap Size 来解决该问题。
5、ES 免费的自动化运维工具推荐
- Ansible: https://github.com/elastic/ansible-elasticsearch
- Puppet: https://github.com/elastic/puppet-elasticsearch
- Cookbook: https://github.com/elastic/cookbook-elasticsearch
- Curator:https://www.elastic.co/guide/e ... .html
6、elasticsearch-hanlp 分词插件包
核心功能:
- 内置多种分词模式,适合不同场景;
- 内置词典,无需额外配置即可使用;
- 支持外置词典,用户可自定义分词算法,基于词典或是模型;
- 支持分词器级别的自定义词典,便于用于多租户场景;
- 支持远程词典热更新(待开发);
- 拼音过滤器、繁简体过滤器(待开发);
- 基于词语或单字的 ngram 切分分词(待开发)。
https://github.com/AnyListen/e ... hanlp
7、节点重启时延迟索引分片重分配
当某个节点短时间离开集群时,一般是不会影响整体系统运行的,可以通过下面的请求延迟索引分片的再分配。
<br /> PUT _all/_settings<br /> {<br /> "settings": {<br /> "index.unassigned.node_left.delayed_timeout": "5m"<br /> }<br /> }<br />
8、ES 数据修改后,查询还是未修改前的数据
默认是 1 秒可见,如果你的需求一定要写完就可见,那在写的时候增加 refresh 参数,强制刷新即可,但强烈建议不这么干,因为这样会把整个集群拖垮。
9、Terms Query 从另一个索引获取 terms
当 Terms Query 需要指定很多 terms 的时候,如果手动设置还是相当麻烦的,可以通过 terms-lookup 的方式从另外一个索引加载需要匹配的 terms。
<br /> PUT /users/_doc/2<br /> {<br /> "followers" : ["1", "3"]<br /> }<br /> <br /> PUT /tweets/_doc/1<br /> {<br /> "user" : "1"<br /> }<br /> <br /> GET /tweets/_search<br /> {<br /> "query" : {<br /> "terms" : {<br /> "user" : {<br /> "index" : "users",<br /> "type" : "_doc",<br /> "id" : "2",<br /> "path" : "followers"<br /> }<br /> }<br /> }<br /> }<br /> <br /> -----------等效下面的语句--------------<br /> <br /> PUT /users/_doc/2<br /> {<br /> "followers" : [<br /> {<br /> "id" : "1"<br /> },<br /> {<br /> "id" : "2"<br /> }<br /> ]<br /> }<br />
10、ES 备份路径设置
报错信息:
<br /> doesn't match any of the locations specified by path.repo because this setting is empty<br />
结局方案,修改 ES 的配置文件:
```在 elasticsearch.yml 中添加下面配置来设置备份仓库路径
path.repo: ["/home/test/backup/zty_logstash"]
```
11、Query cache 和 Filter cache 的区别
Filter cache 被重命名为 Node Query Cache,也就是说 Query cache 等同于 Filter cache;Query Cache 采用了 LRU 的缓存方式(当缓存满的时候,淘汰旧的不用的缓存数据),Query Cache 只缓存被用于 filter 上下文的内容。
12、Shard 大小需要考虑的因素有哪些?
Lucene 底层没有这个大小的限制,20-40GB 的这个区间范围本身就比较大,经验值有时候就是拍脑袋,不一定都好使。
- Elasticsearch 对数据的隔离和迁移是以分片为单位进行的,分片太大,会加大迁移成本;
- 一个分片就是一个 Lucene 的库,一个 Lucene 目录里面包含很多 Segment,每个 Segment 有文档数的上限,Segment 内部的文档 ID 目前使用的是 Java 的整型,也就是 2 的 31 次方,所以能够表示的总的文档数为 Integer.MAX_VALUE - 128 = 2^31 - 128 = 2147483647 - 1 = 2,147,483,519,也就是21.4亿条;
- 同样,如果你不 force merge 成一个 Segment,单个 shard 的文档数能超过这个数;
- 单个 Lucene 越大,索引会越大,查询的操作成本自然要越高,IO 压力越大,自然会影响查询体验;
- 具体一个分片多少数据合适,还是需要结合实际的业务数据和实际的查询来进行测试以进行评估。
13、ES 索引更新时通过 mapping 限制指定字段更新
Elasticsearch 默认是 Dynamic Mapping,新字段会自动猜测数据类型,并自动 merge 到之前的 Mapping,你可以在 Mapping 里面可以配置字段是否支持动态加入,设置参数dynamic即可:true,默认,表示支持动态加入新字段;false,表示忽略该字段的后续索引等操作,但是索引还是成功的;strict支持不支持未知字段,直接抛错。
14、ES 数据快照到 HDFS
ES 做快照和使用 ES-Hadoop 导数据是完全的两种不同的方式,使用 ES-Hadoopp 后期导入的成本可能也不小。
- 如果要恢复快,当然是做快照和还原的方式最快,速度完全取决于网络和磁盘的速度;
- 如果为了节省磁盘,快照的时候,可以选 6.5 最新支持的
source_only
模式,导出的快照要小很多,不过恢复的时候要进行重建,速度慢。
15、segment.memory 简介
segment 的大小,和 indexing buffer 有关,有三种方式会生成 segment:
- 一种是 indexing buffer 写满了会生成 segment 文件,默认是堆内存的10%,是节点共享的;
- 一种是 index buffer 有文档,但是还没满,但是 refresh 时间到了,这个时候就会把 buffer 里面的生成 segment 文件;
- 还有最后一种就是 es 自动的会将小的 segment 文件定期合并产生新的 segment 文件。
三、社区文章精选
- [2018 年 Elastic Advent Calendar 分享活动](https://elasticsearch.cn/article/6149)
- [使用 ES-Hadoop 将 Spark Streaming 流数据写入 ES](https://elasticsearch.cn/article/6318)
- [Elastic Stack 6.5 最新功能](https://elasticsearch.cn/article/6209)
- [让Elasticsearch飞起来!——性能优化实践干货](https://mp.weixin.qq.com/s/GQfEMb2jMvm9PEANkLl3Tg)
---
Any Code,Code Any!
扫码关注『AnyCode』,编程路上,一起前行。

2019年,如何选择高效的搜索开发工具栈?小白求教
HelloClyde 回复了问题 • 7 人关注 • 3 个回复 • 4813 次浏览 • 2019-01-08 09:29
elasticsearch返回结果中相似文档去重
rochy 回复了问题 • 2 人关注 • 1 个回复 • 1422 次浏览 • 2019-01-07 20:41
elasticsearch多表查询结果返回
rochy 回复了问题 • 2 人关注 • 1 个回复 • 2894 次浏览 • 2019-01-07 19:11
term聚合查询很慢,涉及到50+个term,有建议吗?
laoyang360 回复了问题 • 5 人关注 • 4 个回复 • 3597 次浏览 • 2019-01-07 21:05
如何在聚合的统计结果上再次聚合该如何做
rochy 回复了问题 • 4 人关注 • 2 个回复 • 2275 次浏览 • 2019-01-07 15:38
ES数据压缩除了这种"index.codec": "best_compression"压缩方式,还有其他的吗?
rochy 回复了问题 • 3 人关注 • 1 个回复 • 3938 次浏览 • 2019-01-07 12:04
使用 ES-Hadoop 将 Spark Streaming 流数据写入 ES
rochy 发表了文章 • 5 个评论 • 8464 次浏览 • 2019-01-06 00:55
本文将详细介绍利用 ES-Hadoop 将 Spark 处理的数据写入到 ES 中。
一、开发环境
1、组件版本
- CDH 集群版本:6.0.1
- Spark 版本:2.2.0
- Kafka 版本:1.0.1
- ES 版本:6.5.1
2、Maven 依赖
```xml
org.scala-lang
scala-library
2.11.8
org.apache.spark
spark-core_2.11
2.2.0
org.apache.spark
spark-streaming_2.11
2.2.0
org.apache.spark
spark-streaming-kafka-0-10_2.11
2.2.0
org.apache.zookeeper
zookeeper
3.4.5-cdh6.0.1
org.elasticsearch
elasticsearch-spark-20_2.11
6.5.4
commons-httpclient
commons-httpclient
3.1
```
### 3、注意事项
如果使用 CDH 版本的 Spark,则在调试及实际部署运行的时候会出现下面的错误:
```
java.lang.ClassNotFoundException: org.apache.commons.httpclient.protocol.Protocol
```
很显然是缺少 httpclient 相关依赖造成的,对比开源版本与 CDH 版本的 Spark,发现开源版本多出了 `commons-httpclient-3.1.jar`,因此上述 Maven 的 pom 文件添加上对其依赖即可。
## 二、ES-Hadoop
### 1、简介
ES-Hadoop 实现了 Hadoop 生态(Hive、Spark、Pig、Storm 等)与 ElasticSearch 之间的数据交互,借助该组件可以将 Hadoop 生态的数据写入到 ES 中,然后借助 ES 对数据快速进行搜索、过滤、聚合等分析,进一步可以通过 Kibana 来实现数据的可视化。
同时,也可以借助 ES 作为数据存储层(类似数仓的 Stage 层或者 ODS 层),然后借助 Hadoop 生态的数据处理工具(Hive、MR、Spark 等)将处理后的数据写入到 HDFS 中。
> 使用 ES 做为原始数据的存储层,可以很好的进行数据去重、数据质量分析,还可以提供一些即时的数据服务,例如趋势展示、汇总分析等。

### 2、组成
ES-Hadoop 是一个整合性质的组件,它封装了 Hadoop 生态的多种组件与 ES 交互的 API,如果你只需要部分功能,可以使用细分的组件: - elasticsearch-hadoop-mr
- elasticsearch-hadoop-hive
- elasticsearch-hadoop-pig
- elasticsearch-spark-20_2.10
- elasticsearch-hadoop-cascading
- elasticsearch-storm
三、elasticsearch-spark
1、配置
es-hadoop 核心是通过 es 提供的 restful 接口来进行数据交互,下面是几个重要配置项,更多配置信息请参阅[官方说明](https://www.elastic.co/guide/e ... n.html):
es.nodes
:需要连接的 es 节点(不需要配置全部节点,默认会自动发现其他可用节点);es.port
:节点 http 通讯端口;es.nodes.discovery
:默认为 true,表示自动发现集群可用节点;es.nodes.wan.only
:默认为 false,设置为 true 之后,会关闭节点的自动 discovery,只使用es.nodes
声明的节点进行数据读写操作;如果你需要通过域名进行数据访问,则设置该选项为 true,否则请务必设置为 false;es.index.auto.create
:是否自动创建不存在的索引,默认为 true;es.net.http.auth.user
:Basic 认证的用户名;es.net.http.auth.pass
:Basic 认证的密码。
scala<br /> val conf = new SparkConf().setIfMissing("spark.app.name","rt-data-loader").setIfMissing("spark.master", "local[5]")<br /> conf.set(ConfigurationOptions.ES_NODES, esNodes)<br /> conf.set(ConfigurationOptions.ES_PORT, esPort)<br /> conf.set(ConfigurationOptions.ES_NODES_WAN_ONLY, "true")<br /> conf.set(ConfigurationOptions.ES_INDEX_AUTO_CREATE, "true")<br /> conf.set(ConfigurationOptions.ES_NODES_DISCOVERY, "false")<br /> conf.set(ConfigurationOptions.ES_NET_HTTP_AUTH_USER, esUser)<br /> conf.set(ConfigurationOptions.ES_NET_HTTP_AUTH_PASS, esPwd)<br /> conf.set("es.write.rest.error.handlers", "ignoreConflict")<br /> conf.set("es.write.rest.error.handler.ignoreConflict", "com.jointsky.bigdata.handler.IgnoreConflictsHandler")<br />
特别需要注意的配置项为es.nodes.wan.only
,由于在云服务器环境中,配置文件使用的一般为内网地址,而本地调试的时候一般使用外网地址,这样将es.nodes
配置为外网地址后,最后会出现节点找不到的问题(由于会使用节点配置的内网地址去进行连接):
<br /> org.elasticsearch.hadoop.EsHadoopIllegalArgumentException: No data nodes with HTTP-enabled available; <br /> node discovery is disabled and none of nodes specified fit the criterion [xxx.xx.x.xx:9200]<br />
此时将es.nodes.wan.only
设置为 true 即可。推荐开发测试时使用域名,集群部署的时候将该选项置为 false。
2、屏蔽写入冲突
如果数据存在重复,写入 ES 时往往会出现数据写入冲突的错误,此时有两种解决方法。
方法一:设置es.write.operation
为 upsert,这样达到的效果为如果存在则更新,不存在则进行插入,该配置项默认值为 index。
方法二:自定义冲突处理类,类似上述配置中设置了自定义的error.handlers
,通过自定义类来处理相关错误,例如忽略冲突等:
java<br /> public class IgnoreConflictsHandler extends BulkWriteErrorHandler {<br /> public HandlerResult onError(BulkWriteFailure entry, DelayableErrorCollector<byte[]> collector) throws Exception {<br /> if (entry.getResponseCode() == 409) {<br /> StaticLog.warn("Encountered conflict response. Ignoring old data.");<br /> return HandlerResult.HANDLED;<br /> }<br /> return collector.pass("Not a conflict response code.");<br /> }<br /> }<br />
方法二可以屏蔽写入版本比预期的小之类的版本冲突问题。
3、RDD 写入 ES
EsSpark 提供了两种主要方法来实现数据写入:
saveToEs
:RDD 内容为Seq[Map]
,即一个 Map 对象集合,每个 Map 对应一个文档;saveJsonToEs
:RDD 内容为Seq[String]
,即一个 String 集合,每个 String 是一个 JSON 字符串,代表一条记录(对应 ES 的 _source)。
数据写入可以指定很多配置信息,例如:es.resource
:设置写入的索引和类型,索引和类型名均支持动态变量;es.mapping.id
:设置文档 _id 对应的字段名;es.mapping.exclude
:设置写入时忽略的字段,支持通配符。
scala<br /> val itemRdd = rdd.flatMap(line => {<br /> val topic = line.topic()<br /> println("正在处理:" + topic + " - " + line.partition() + " : " + line.offset())<br /> val jsonArray = JSON.parseArray(line.value()).toJavaList(classOf[JSONObject]).asScala<br /> val resultMap = jsonArray.map(jsonObj =>{<br /> var tmpId = "xxx"<br /> var tmpIndex = "xxxxxx"<br /> jsonObj.put("myTmpId", tmpId)<br /> jsonObj.put("myTmpIndex", tmpIndex)<br /> jsonObj.getInnerMap<br /> })<br /> resultMap<br /> })<br /> val mapConf = Map(<br /> ("es.resource" , "{myTmpIndex}/doc"),<br /> ("es.write.operation" , "upsert"),<br /> ("es.mapping.id" , "myTmpId"),<br /> ("es.mapping.exclude" , "myTmp*")<br /> )<br /> EsSpark.saveToEs(itemRdd, mapConf)<br />
es.mapping.exclude
只支持 RDD 为 Map 集合(saveToEs),当为 Json 字符串集合时(saveJsonToEs)会提示不支持的错误信息;这个配置项非常有用,例如 myTmpId 作为文档 id,因此没有必要重复存储到 _source 里面了,可以配置到这个配置项,将其从 _source 中排除。
---
Any Code,Code Any!
扫码关注『AnyCode』,编程路上,一起前行。

请教一个关于es中文 聚合查询 Fielddata is disabled on text 出现的问题
a2615381 回复了问题 • 3 人关注 • 4 个回复 • 7035 次浏览 • 2019-01-07 14:16
es分64位和32位吗
zqc0512 回复了问题 • 3 人关注 • 2 个回复 • 1850 次浏览 • 2019-01-07 10:59
关于elasticsearch中filter的粒度的疑问
kennywu76 回复了问题 • 4 人关注 • 1 个回复 • 3803 次浏览 • 2019-01-07 14:37
TransportClient 批量写出现OOM
laoyang360 回复了问题 • 3 人关注 • 1 个回复 • 1898 次浏览 • 2019-01-05 21:13
ES如何修改字段里面的值
bellengao 回复了问题 • 4 人关注 • 2 个回复 • 16893 次浏览 • 2019-01-04 18:57