Grok Debugger 国内镜像
可以通过在线工具进行调试:
http://grokdebug.herokuapp.com
http://grokconstructor.appspot.com
不过有时候比较慢,甚至不能访问,所以现在为大家搭好了一个国内的镜像,方便使用:
http://grok.elasticsearch.cn/
目前还是英文,源码fork至:https://github.com/elasticsear ... uctor
欢迎提交PR来进行翻译。
PS:
1. Kibana后续将提供Grok Debug的功能;
2.如果你的日志每一行都遵循固定格式,你可以考虑使用 dissect filter,性能更强更简单。
可以通过在线工具进行调试:
http://grokdebug.herokuapp.com
http://grokconstructor.appspot.com
不过有时候比较慢,甚至不能访问,所以现在为大家搭好了一个国内的镜像,方便使用:
http://grok.elasticsearch.cn/
目前还是英文,源码fork至:https://github.com/elasticsear ... uctor
欢迎提交PR来进行翻译。
PS:
1. Kibana后续将提供Grok Debug的功能;
2.如果你的日志每一行都遵循固定格式,你可以考虑使用 dissect filter,性能更强更简单。 收起阅读 »
GZIP造成JAVA Native Memory泄漏案例
近期公司某个线上JAVA应用出现内存泄漏问题,整个排查过程颇费周折,前后耗费了近2周才定位到问题根源并予以修复。排查问题过程中在网上翻查了大量的资料,发现国内几乎没有文章能对同类问题做透彻的分析和找到问题真正根源的。即使国外的各类博客和文章,也少有正确的分析。因此感觉有必要对问题根源和相关案例做一个总结,希望能为国内开发者避免踩上同类陷阱提供一些帮助。
开门见山,先列一下收集到的同类问题案例集:
- Debugging Java Native Memory Leaks
- Tracking Down Native Memory Leaks in Elasticsearch
- CompressingStoredFieldsFormat should reclaim memory more aggressively
- Close InputStream when receiving cluster state in PublishClusterStateAction
- Kafka OOM During Log Recovery Due to Leaked Native Memory
这些案例涉及到的不乏一些流行的开源软件如Lucene, Elasticsearch, Kafka,并且某些Bug版本在大量公司有线上部署。这些案例的问题根源都惊人的一致,即在JAVA里使用GZIP库进行数据流的压缩/解压之后,忘记调用流的close()方法,从而造成native memory的泄漏。
关于这类问题的分析方法和工具,上面收集的案例集里有非常详尽的描述,这里就不再班门弄斧一一赘述了。只结合我们自己的案例,做一个比较简短的介绍和总结。
我们公司这个案例的排查之所以花了近2个礼拜,其中一个重要原因是这个应用是通过Docker部署的。应用上线运行一段时间后,会被Docker的OOM killer给Kill掉,查看JVM监控数据却发现Heap使用得很少,甚至都没有old GC发生过,top里看这个JAVA进程的RSS内存占用远高于分配的Heap大小。很自然的,研发人员第一反应是底层系统的问题,注意力被转移到研究各种Docker内存相关的参数上。 而我知道ElasticCloud曾经也被某些版本的linux内核bug困扰,docker可能会误杀JVM (参见 Memory Issues We'll Remember),bug的内核版本和docker版本和我们线上部署的又很接近,因此这个内核bug也被加入到了怀疑列表中。 事后证明这个方向是错误的,浪费了一些时间。
在一段时间排查无果后,为了缩小排查范围,我们决定将这个应用部署到VM上做对比测试。结果内存泄漏问题依然存在,因而排除掉了Linux内核和docker本身的问题。
同期也参考过一篇关于DirectByteByffer造成堆外内存泄漏问题的分析博客,JVM源码分析之堆外内存完全解读 ,考虑到问题现象和我们类似,我们的应用也有用到netty,DBB泄漏也被列为怀疑对象。然而在JVM启动里参数里对MaxDirectMemorySize做了限制后,经过一段时间对外服务,JAVA进程的RSS仍然会远超过HEAP + MDM设置的大小。
这期间我们也使用过NMT 工具分析HEAP内存占用情况,然而这个工具报告出来的内存远小于RSS,也就是说这多出来的内存并没有被JVM本身用到,泄漏的是native memory。 JAVA应用产生native memory泄漏通常是在使用某些native库时造成的,因此注意力转移到JNI。
最终帮助我们找到正确方向的是开头列的 Debugging Java Native Memory Leaks 这篇由Twitter工程师写的博客。 博客里介绍了如何使用jemalloc来替换glibc的malloc,通过拦截和追踪JVM对native memory的分配申请,从而可以分析出HEAP以外的内存分配由哪些方法调用产生的。博客里提到产生泄漏的原因是忘记关闭GZIPOutputStream,巧合的是我们线上应用也使用了gzip压缩服务请求数据,于是查看了一下相关的代码,果然发现有忘记关闭的stream。 找到根源后,解决问题就简单了,一行代码修复。
对于ElasticSearch用户,要注意的是某些版本存在这个泄漏问题,对于小内存机器上运行的ES服务可能会有较大的影响。 可是官方没有明确列出所有受影响的版本,只在博客里提到5.2.1修复了这些问题。 因此如果你有顾虑的话,可以用top命令看一下ES JAVA进程的RSS消耗,如果大大于分配的HEAP,有可能就是中招啦。
近期公司某个线上JAVA应用出现内存泄漏问题,整个排查过程颇费周折,前后耗费了近2周才定位到问题根源并予以修复。排查问题过程中在网上翻查了大量的资料,发现国内几乎没有文章能对同类问题做透彻的分析和找到问题真正根源的。即使国外的各类博客和文章,也少有正确的分析。因此感觉有必要对问题根源和相关案例做一个总结,希望能为国内开发者避免踩上同类陷阱提供一些帮助。
开门见山,先列一下收集到的同类问题案例集:
- Debugging Java Native Memory Leaks
- Tracking Down Native Memory Leaks in Elasticsearch
- CompressingStoredFieldsFormat should reclaim memory more aggressively
- Close InputStream when receiving cluster state in PublishClusterStateAction
- Kafka OOM During Log Recovery Due to Leaked Native Memory
这些案例涉及到的不乏一些流行的开源软件如Lucene, Elasticsearch, Kafka,并且某些Bug版本在大量公司有线上部署。这些案例的问题根源都惊人的一致,即在JAVA里使用GZIP库进行数据流的压缩/解压之后,忘记调用流的close()方法,从而造成native memory的泄漏。
关于这类问题的分析方法和工具,上面收集的案例集里有非常详尽的描述,这里就不再班门弄斧一一赘述了。只结合我们自己的案例,做一个比较简短的介绍和总结。
我们公司这个案例的排查之所以花了近2个礼拜,其中一个重要原因是这个应用是通过Docker部署的。应用上线运行一段时间后,会被Docker的OOM killer给Kill掉,查看JVM监控数据却发现Heap使用得很少,甚至都没有old GC发生过,top里看这个JAVA进程的RSS内存占用远高于分配的Heap大小。很自然的,研发人员第一反应是底层系统的问题,注意力被转移到研究各种Docker内存相关的参数上。 而我知道ElasticCloud曾经也被某些版本的linux内核bug困扰,docker可能会误杀JVM (参见 Memory Issues We'll Remember),bug的内核版本和docker版本和我们线上部署的又很接近,因此这个内核bug也被加入到了怀疑列表中。 事后证明这个方向是错误的,浪费了一些时间。
在一段时间排查无果后,为了缩小排查范围,我们决定将这个应用部署到VM上做对比测试。结果内存泄漏问题依然存在,因而排除掉了Linux内核和docker本身的问题。
同期也参考过一篇关于DirectByteByffer造成堆外内存泄漏问题的分析博客,JVM源码分析之堆外内存完全解读 ,考虑到问题现象和我们类似,我们的应用也有用到netty,DBB泄漏也被列为怀疑对象。然而在JVM启动里参数里对MaxDirectMemorySize做了限制后,经过一段时间对外服务,JAVA进程的RSS仍然会远超过HEAP + MDM设置的大小。
这期间我们也使用过NMT 工具分析HEAP内存占用情况,然而这个工具报告出来的内存远小于RSS,也就是说这多出来的内存并没有被JVM本身用到,泄漏的是native memory。 JAVA应用产生native memory泄漏通常是在使用某些native库时造成的,因此注意力转移到JNI。
最终帮助我们找到正确方向的是开头列的 Debugging Java Native Memory Leaks 这篇由Twitter工程师写的博客。 博客里介绍了如何使用jemalloc来替换glibc的malloc,通过拦截和追踪JVM对native memory的分配申请,从而可以分析出HEAP以外的内存分配由哪些方法调用产生的。博客里提到产生泄漏的原因是忘记关闭GZIPOutputStream,巧合的是我们线上应用也使用了gzip压缩服务请求数据,于是查看了一下相关的代码,果然发现有忘记关闭的stream。 找到根源后,解决问题就简单了,一行代码修复。
对于ElasticSearch用户,要注意的是某些版本存在这个泄漏问题,对于小内存机器上运行的ES服务可能会有较大的影响。 可是官方没有明确列出所有受影响的版本,只在博客里提到5.2.1修复了这些问题。 因此如果你有顾虑的话,可以用top命令看一下ES JAVA进程的RSS消耗,如果大大于分配的HEAP,有可能就是中招啦。 收起阅读 »
招聘 Elastic search 培训师/项目经理 20k +
薪酬: 月工资20k +
工作地点:北京/上海/深圳 愿意出差,因工作情况会全国飞
任职要求:
1、计算机相关专业,本科以上学历,具有3年以上搜索引擎及相关开发经验;
2、较强的java编程基础,熟悉Git代码管理,有多分支并行开发经验;
3、熟练使用开源搜索工具Logstash,ElasticSearch,熟悉其原理和源代码,能熟练的修改开源工具以适合业务场景的需求;
4、熟悉Lucene以及Kibana,有实际的产品使用经历;
5、具有良好的沟通能力和责任心。
薪酬: 月工资20k +
工作地点:北京/上海/深圳 愿意出差,因工作情况会全国飞
任职要求:
1、计算机相关专业,本科以上学历,具有3年以上搜索引擎及相关开发经验;
2、较强的java编程基础,熟悉Git代码管理,有多分支并行开发经验;
3、熟练使用开源搜索工具Logstash,ElasticSearch,熟悉其原理和源代码,能熟练的修改开源工具以适合业务场景的需求;
4、熟悉Lucene以及Kibana,有实际的产品使用经历;
5、具有良好的沟通能力和责任心。
收起阅读 »
找寻TF_IDF和BM25的评分计算优化排序
2.首先是TFIDF
使用ik_smart分词器,ES为2.3.3
文档是:分词结果是
"伟业我爱我家" 分词结果:【伟业,我,爱我,家】
"我爱我家" 【我,爱我,家】
这两个。
multi_match 匹配,query=我爱我家
排名如下
-----------------------------------------------------------
"伟业我爱我家" "_score": 6.8563557,
详细参数
"我":tf=1,idf=6.7638364,fieldNorm=0.5,queryNorm=0.07292504,
“爱我”: tf=1,idf=6.7638364,fieldNorm=0.5,queryNorm=0.07292504
“家”: tf=1,idf=6.278329,fieldNorm=0.5,queryNorm=0.07292504
----------------------------------------------------------
"我爱我家" "_score": 6.7839246,
"我":tf=1,idf=6.9336233,fieldNorm=0.5,queryNorm=0.07370365,
“爱我”: tf=1,idf=6.9336233,fieldNorm=0.5,queryNorm=0.07370365
“家”: tf=1,idf=6.9336233,fieldNorm=0.5,queryNorm=0.07370365
---------------------------------------------------------
其中queryNorm是由每个term词项的idf综合计算而来,所以在每个文档中,他都是一样的。
然后仔细比较得分,觉得每个得分都可以被推算出来
但是排序结果不符合期望:
queryNorm 官方文档也说了基本没有什么用
tf=1没什么可说
idf有些问题,比如"爱我"在这两个文档中是不同的(这是因为这两个文档在不同的分片中引起的)
那这么说来,TFIDF的得分就仅仅受tf,idf,fieldNorm控制,
而idf因为分片不均匀可能会出现一点差异,fieldNorm又犹由于精度让长度为3或者4 的文档值都为0.5
。综上:tfidf在这种量不多(200万)的短文本检索下,效果很差。
这种情况下,我该怎么优化这个排序呢(让“我爱我家”,排在"伟业我爱我家"前面呢?)
------------------BM25的详情稍后补上-------------------------
2.首先是TFIDF
使用ik_smart分词器,ES为2.3.3
文档是:分词结果是
"伟业我爱我家" 分词结果:【伟业,我,爱我,家】
"我爱我家" 【我,爱我,家】
这两个。
multi_match 匹配,query=我爱我家
排名如下
-----------------------------------------------------------
"伟业我爱我家" "_score": 6.8563557,
详细参数
"我":tf=1,idf=6.7638364,fieldNorm=0.5,queryNorm=0.07292504,
“爱我”: tf=1,idf=6.7638364,fieldNorm=0.5,queryNorm=0.07292504
“家”: tf=1,idf=6.278329,fieldNorm=0.5,queryNorm=0.07292504
----------------------------------------------------------
"我爱我家" "_score": 6.7839246,
"我":tf=1,idf=6.9336233,fieldNorm=0.5,queryNorm=0.07370365,
“爱我”: tf=1,idf=6.9336233,fieldNorm=0.5,queryNorm=0.07370365
“家”: tf=1,idf=6.9336233,fieldNorm=0.5,queryNorm=0.07370365
---------------------------------------------------------
其中queryNorm是由每个term词项的idf综合计算而来,所以在每个文档中,他都是一样的。
然后仔细比较得分,觉得每个得分都可以被推算出来
但是排序结果不符合期望:
queryNorm 官方文档也说了基本没有什么用
tf=1没什么可说
idf有些问题,比如"爱我"在这两个文档中是不同的(这是因为这两个文档在不同的分片中引起的)
那这么说来,TFIDF的得分就仅仅受tf,idf,fieldNorm控制,
而idf因为分片不均匀可能会出现一点差异,fieldNorm又犹由于精度让长度为3或者4 的文档值都为0.5
。综上:tfidf在这种量不多(200万)的短文本检索下,效果很差。
这种情况下,我该怎么优化这个排序呢(让“我爱我家”,排在"伟业我爱我家"前面呢?)
------------------BM25的详情稍后补上-------------------------
收起阅读 »
Emacs与ElasticSearch
mysql会一点 mongodb也看过
但是最终都没有弄成(或许是我性格的原因,想的太多,做的太少(算是过度设计的一种吧))
后来发现了ElasticSearch
觉得他能够实现我的想法(或许只是他简介里的一句话,大致的意思是:多看看数据,而非让他们躺在仓库里)
我会将过程记录下来,希望对后来人有帮助
(不过一切都是在Emacs环境下的,知道的人应该不多,所以能帮到的人也就更少了(其实他们也不用我帮))
mysql会一点 mongodb也看过
但是最终都没有弄成(或许是我性格的原因,想的太多,做的太少(算是过度设计的一种吧))
后来发现了ElasticSearch
觉得他能够实现我的想法(或许只是他简介里的一句话,大致的意思是:多看看数据,而非让他们躺在仓库里)
我会将过程记录下来,希望对后来人有帮助
(不过一切都是在Emacs环境下的,知道的人应该不多,所以能帮到的人也就更少了(其实他们也不用我帮)) 收起阅读 »
分布式搜索引擎教程-Elasticsearch
我应该算是个热心肠的人吧,喜欢乐于助人,不过有些人的提问方式让我非常反感,甚至是厌恶,什么样的人呢,第一种,官方文档,或者百度,或者GOOGLE,等方式轻易的就可以找到解决方案却仍然拿出来提问的人。 第二种就是什么条件、环境都不描述,背景也不说上来就问,怎么样最好,如何性能最快,怎么做才能最稳定的人,我说话比较直,勿怪,对于这类人,你至少要让他知道一些概念,不然根本没法交流。
为了解决这些问题,我想提供一种快速让一些没有经验或者经验不足的朋友去快速了解Elasticsearch,了解ES能做什么,了解ES怎么做才能达到你的要求,带着这些问题,我在头脑里构思了 两个系列的视频,第一个是ES-教程篇, 第二个是ES-实战篇,把实际的生产环境中的一些场景,剥离业务相关的,保密性的东西,以纯技术的方式与大家分享下,看我们是如何踩坑,填坑的。
由于视频是个人行为,非商业性质,所以不可能做到定时更新,这点还请大家见谅,不过我肯定会用心去做。
所有的视频会以两个方式去提供,一个是百度云盘里下载完整的压缩包,里面包含了视频、PPT、以及配置文件信息。另一种是通过优库视频直接看视频,PPT和配置文件到百度云上去下载。
百度云: https://pan.baidu.com/s/1i4ZsORF
优酷:http://i.youku.com/rickywag
感谢你们的支持,如果觉得不错可以打赏我哟。
我应该算是个热心肠的人吧,喜欢乐于助人,不过有些人的提问方式让我非常反感,甚至是厌恶,什么样的人呢,第一种,官方文档,或者百度,或者GOOGLE,等方式轻易的就可以找到解决方案却仍然拿出来提问的人。 第二种就是什么条件、环境都不描述,背景也不说上来就问,怎么样最好,如何性能最快,怎么做才能最稳定的人,我说话比较直,勿怪,对于这类人,你至少要让他知道一些概念,不然根本没法交流。
为了解决这些问题,我想提供一种快速让一些没有经验或者经验不足的朋友去快速了解Elasticsearch,了解ES能做什么,了解ES怎么做才能达到你的要求,带着这些问题,我在头脑里构思了 两个系列的视频,第一个是ES-教程篇, 第二个是ES-实战篇,把实际的生产环境中的一些场景,剥离业务相关的,保密性的东西,以纯技术的方式与大家分享下,看我们是如何踩坑,填坑的。
由于视频是个人行为,非商业性质,所以不可能做到定时更新,这点还请大家见谅,不过我肯定会用心去做。
所有的视频会以两个方式去提供,一个是百度云盘里下载完整的压缩包,里面包含了视频、PPT、以及配置文件信息。另一种是通过优库视频直接看视频,PPT和配置文件到百度云上去下载。
百度云: https://pan.baidu.com/s/1i4ZsORF
优酷:http://i.youku.com/rickywag
感谢你们的支持,如果觉得不错可以打赏我哟。 收起阅读 »
基于ElasticSearch的亿级实时日志系统实践
[原创] ElasticSearch集群故障案例分析: 警惕通配符查询
许多有RDBMS/SQL背景的开发者,在初次踏入ElasticSearch世界的时候,很容易就想到使用(Wildcard Query)来实现模糊查询(比如用户输入补全),因为这是和SQL里like操作最相似的查询方式,用起来感觉非常舒适。然而近期我们线上一个搜索集群的故障揭示了,滥用wildcard query可能带来灾难性的后果。
故障经过
线上有一个10来台机器组成的集群,用于某个产品线的产品搜索。数据量并不大,实时更新量也不高,并发搜索量在几百次/s。通常业务高峰期cpu利用率不超过10%,系统负载看起来很低。 但最近这个集群不定期(1天或者隔几天)会出现CPU冲高到100%的问题,持续时间从1分钟到几分钟不等。最严重的一次持续了20来分钟,导致大量的用户搜索请无求响应,从而造成生产事故。
问题排查
细节太多,此处略过,直接给出CPU无故飙高的原因: 研发在搜索实现上,根据用户输入的关键词,在首尾加上通配符,使用wildcard query来实现模糊搜索,例如使用"*迪士尼*"来搜索含有“迪士尼”关键字的产品。 然而用户输入的字符串长度没有做限制,导致首尾通配符中间可能是很长的一个字符串。 后果就是对应的wildcard Query执行非常慢,非常消耗CPU。
复现方法
1. 创建一个只有一条文档的索引
POST test_index/type1/?refresh=true
{
"foo": "bar"
}
2. 使用wildcard query执行一个首尾带有通配符*的长字符串查询POST /test_index/_search
{
"query": {
"wildcard": {
"foo": {
"value": "*在迪士尼乐园,点亮心中奇梦。它是一个充满创造力、冒险精神与无穷精彩的快地。您可在此游览全球最大的迪士尼城堡——奇幻童话城堡,探索别具一格又令人难忘的六大主题园区——米奇大街、奇想花园、梦幻世界、探险岛、宝藏湾和明日世界,和米奇朋友在一起,感觉欢乐时光开业于2016年上海国际旅游度假区秀沿路亚朵酒店位于上海市浦东新区沪南公路(沪南公路与秀沿路交汇处),临近周浦万达广场、地铁11号线秀沿路站,距离上海南站、人民广场约20公里,距离迪线距*"
}
}
}
}
3. 查看结果{
"took": 3445,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits":
}
}
即使no hits,耗时却是惊人的3.4秒 (测试机是macbook pro, i7 CPU),并且执行过程中,CPU有一个很高的尖峰。线上的查询比我这个范例要复杂得多,会同时查几个字段,实际测试下来,一个查询可能会执行十几秒钟。 在有比较多长字符串查询的时候,集群可能就DOS了。
探查深层次根源
为什么对只有一条数据的索引做这个查询开销这么高? 直觉上应该是瞬间返回结果才对!
回答这个问题前,可以再做个测试,如果继续加大查询字符串的长度,到了一定长度后,ES直接抛异常了,服务器ES里异常给出的cause如下:
Caused by: org.apache.lucene.util.automaton.TooComplexToDeterminizeException: Determinizing automaton with 22082 states and 34182 transitions would result in more than 10000 states. at org.apache.lucene.util.automaton.Operations.determinize(Operations.java:741) ~[lucene-core-6.4.1.jar:6.4.1
该异常来自org.apache.lucene.util.automaton这个包,异常原因的字面含义是说“自动机过于复杂而无法确定状态: 由于状态和转换太多,确定一个自动机需要生成的状态超过10000个上限"
网上查找了大量资料后,终于搞清楚了问题的来龙去脉。为了加速通配符和正则表达式的匹配速度,Lucene4.0开始会将输入的字符串模式构建成一个DFA (Deterministic Finite Automaton),带有通配符的pattern构造出来的DFA可能会很复杂,开销很大。这个链接的博客using-dfa-for-wildcard-matching-problem比较形象的介绍了如何为一个带有通配符的pattern构建DFA。借用博客里的范例,a*bc构造出来的DFA如下图:
Lucene构造DFA的实现
看了一下Lucene的里相关的代码,构建过程大致如下:
1. org.apache.lucene.search.WildcardQuery里的toAutomaton方法,遍历输入的通配符pattern,将每个字符变成一个自动机(automaton),然后将每个字符的自动机链接起来生成一个新的自动机
public static Automaton toAutomaton(Term wildcardquery) {
List<Automaton> automata = new ArrayList<>();
String wildcardText = wildcardquery.text();
for (int i = 0; i < wildcardText.length();) {
final int c = wildcardText.codePointAt(i);
int length = Character.charCount(c);
switch(c) {
case WILDCARD_STRING:
automata.add(Automata.makeAnyString());
break;
case WILDCARD_CHAR:
automata.add(Automata.makeAnyChar());
break;
case WILDCARD_ESCAPE:
// add the next codepoint instead, if it exists
if (i + length < wildcardText.length()) {
final int nextChar = wildcardText.codePointAt(i + length);
length += Character.charCount(nextChar);
automata.add(Automata.makeChar(nextChar));
break;
} // else fallthru, lenient parsing with a trailing \
default:
automata.add(Automata.makeChar(c));
}
i += length;
}
return Operations.concatenate(automata);
}
2. 此时生成的状态机是不确定状态机,也就是Non-deterministic Finite Automaton(NFA)。3. org.apache.lucene.util.automaton.Operations类里的determinize方法则会将NFA转换为DFA
/**
* Determinizes the given automaton.
* <p>
* Worst case complexity: exponential in number of states.
* @param maxDeterminizedStates Maximum number of states created when
* determinizing. Higher numbers allow this operation to consume more
* memory but allow more complex automatons. Use
* DEFAULT_MAX_DETERMINIZED_STATES as a decent default if you don't know
* how many to allow.
* @throws TooComplexToDeterminizeException if determinizing a creates an
* automaton with more than maxDeterminizedStates
*/
public static Automaton determinize(Automaton a, int maxDeterminizedStates) {
代码注释里说这个过程的时间复杂度最差情况下是状态数量的指数级别!为防止产生的状态过多,消耗过多的内存和CPU,类里面对最大状态数量做了限制 /**
* Default maximum number of states that {@link Operations#determinize} should create.
*/
public static final int DEFAULT_MAX_DETERMINIZED_STATES = 10000;
在有首尾通配符,并且字符串很长的情况下,这个determinize过程会产生大量的state,甚至会超过上限。至于NFA和DFA的区别是什么? 如何相互转换? 网上有很多数学层面的资料和论文,限于鄙人算法方面有限的知识,无精力去深入探究。 但是一个粗浅的理解是: NFA在输入一个条件的情况下,可以从一个状态转移到多种状态,而DFA只会有一个确定的状态可以转移,因此DFA在字符串匹配时速度更快。 DFA虽然搜索的时候快,但是构造方面的时间复杂度可能比较高,特别是带有首部通配符+长字符串的时候。
回想Elasticsearch官方文档里对于wildcard query有特别说明,要避免使用通配符开头的term。
" Note that this query can be slow, as it needs to iterate over many terms. In order to prevent extremely slow wildcard queries, a wildcard term should not start with one of the wildcards * or ?."
结合对上面wildcard query底层实现的探究,也就不难理解这句话的含义了!
总结: wildcard query应杜绝使用通配符打头,实在不得已要这么做,就一定需要限制用户输入的字符串长度。 最好换一种实现方式,通过在index time做文章,选用合适的分词器,比如nGram tokenizer预处理数据,然后使用更廉价的term query来实现同等的模糊搜索功能。 对于部分输入即提示的应用场景,可以考虑优先使用completion suggester, phrase/term suggeter一类性能更好,模糊程度略差的方式查询,待suggester没有匹配结果的时候,再fall back到更模糊但性能较差的wildcard, regex, fuzzy一类的查询。
-----------
补记: 有同学问regex, fuzzy query是否有同样的问题,答案是有,原因在于他们底层和wildcard一样,都是通过将pattern构造成DFA来加速字符串匹配速度的。
许多有RDBMS/SQL背景的开发者,在初次踏入ElasticSearch世界的时候,很容易就想到使用(Wildcard Query)来实现模糊查询(比如用户输入补全),因为这是和SQL里like操作最相似的查询方式,用起来感觉非常舒适。然而近期我们线上一个搜索集群的故障揭示了,滥用wildcard query可能带来灾难性的后果。
故障经过
线上有一个10来台机器组成的集群,用于某个产品线的产品搜索。数据量并不大,实时更新量也不高,并发搜索量在几百次/s。通常业务高峰期cpu利用率不超过10%,系统负载看起来很低。 但最近这个集群不定期(1天或者隔几天)会出现CPU冲高到100%的问题,持续时间从1分钟到几分钟不等。最严重的一次持续了20来分钟,导致大量的用户搜索请无求响应,从而造成生产事故。
问题排查
细节太多,此处略过,直接给出CPU无故飙高的原因: 研发在搜索实现上,根据用户输入的关键词,在首尾加上通配符,使用wildcard query来实现模糊搜索,例如使用"*迪士尼*"来搜索含有“迪士尼”关键字的产品。 然而用户输入的字符串长度没有做限制,导致首尾通配符中间可能是很长的一个字符串。 后果就是对应的wildcard Query执行非常慢,非常消耗CPU。
复现方法
1. 创建一个只有一条文档的索引
POST test_index/type1/?refresh=true
{
"foo": "bar"
}
2. 使用wildcard query执行一个首尾带有通配符*的长字符串查询POST /test_index/_search
{
"query": {
"wildcard": {
"foo": {
"value": "*在迪士尼乐园,点亮心中奇梦。它是一个充满创造力、冒险精神与无穷精彩的快地。您可在此游览全球最大的迪士尼城堡——奇幻童话城堡,探索别具一格又令人难忘的六大主题园区——米奇大街、奇想花园、梦幻世界、探险岛、宝藏湾和明日世界,和米奇朋友在一起,感觉欢乐时光开业于2016年上海国际旅游度假区秀沿路亚朵酒店位于上海市浦东新区沪南公路(沪南公路与秀沿路交汇处),临近周浦万达广场、地铁11号线秀沿路站,距离上海南站、人民广场约20公里,距离迪线距*"
}
}
}
}
3. 查看结果{
"took": 3445,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits":
}
}
即使no hits,耗时却是惊人的3.4秒 (测试机是macbook pro, i7 CPU),并且执行过程中,CPU有一个很高的尖峰。线上的查询比我这个范例要复杂得多,会同时查几个字段,实际测试下来,一个查询可能会执行十几秒钟。 在有比较多长字符串查询的时候,集群可能就DOS了。
探查深层次根源
为什么对只有一条数据的索引做这个查询开销这么高? 直觉上应该是瞬间返回结果才对!
回答这个问题前,可以再做个测试,如果继续加大查询字符串的长度,到了一定长度后,ES直接抛异常了,服务器ES里异常给出的cause如下:
Caused by: org.apache.lucene.util.automaton.TooComplexToDeterminizeException: Determinizing automaton with 22082 states and 34182 transitions would result in more than 10000 states. at org.apache.lucene.util.automaton.Operations.determinize(Operations.java:741) ~[lucene-core-6.4.1.jar:6.4.1
该异常来自org.apache.lucene.util.automaton这个包,异常原因的字面含义是说“自动机过于复杂而无法确定状态: 由于状态和转换太多,确定一个自动机需要生成的状态超过10000个上限"
网上查找了大量资料后,终于搞清楚了问题的来龙去脉。为了加速通配符和正则表达式的匹配速度,Lucene4.0开始会将输入的字符串模式构建成一个DFA (Deterministic Finite Automaton),带有通配符的pattern构造出来的DFA可能会很复杂,开销很大。这个链接的博客using-dfa-for-wildcard-matching-problem比较形象的介绍了如何为一个带有通配符的pattern构建DFA。借用博客里的范例,a*bc构造出来的DFA如下图:
Lucene构造DFA的实现
看了一下Lucene的里相关的代码,构建过程大致如下:
1. org.apache.lucene.search.WildcardQuery里的toAutomaton方法,遍历输入的通配符pattern,将每个字符变成一个自动机(automaton),然后将每个字符的自动机链接起来生成一个新的自动机
public static Automaton toAutomaton(Term wildcardquery) {
List<Automaton> automata = new ArrayList<>();
String wildcardText = wildcardquery.text();
for (int i = 0; i < wildcardText.length();) {
final int c = wildcardText.codePointAt(i);
int length = Character.charCount(c);
switch(c) {
case WILDCARD_STRING:
automata.add(Automata.makeAnyString());
break;
case WILDCARD_CHAR:
automata.add(Automata.makeAnyChar());
break;
case WILDCARD_ESCAPE:
// add the next codepoint instead, if it exists
if (i + length < wildcardText.length()) {
final int nextChar = wildcardText.codePointAt(i + length);
length += Character.charCount(nextChar);
automata.add(Automata.makeChar(nextChar));
break;
} // else fallthru, lenient parsing with a trailing \
default:
automata.add(Automata.makeChar(c));
}
i += length;
}
return Operations.concatenate(automata);
}
2. 此时生成的状态机是不确定状态机,也就是Non-deterministic Finite Automaton(NFA)。3. org.apache.lucene.util.automaton.Operations类里的determinize方法则会将NFA转换为DFA
/**
* Determinizes the given automaton.
* <p>
* Worst case complexity: exponential in number of states.
* @param maxDeterminizedStates Maximum number of states created when
* determinizing. Higher numbers allow this operation to consume more
* memory but allow more complex automatons. Use
* DEFAULT_MAX_DETERMINIZED_STATES as a decent default if you don't know
* how many to allow.
* @throws TooComplexToDeterminizeException if determinizing a creates an
* automaton with more than maxDeterminizedStates
*/
public static Automaton determinize(Automaton a, int maxDeterminizedStates) {
代码注释里说这个过程的时间复杂度最差情况下是状态数量的指数级别!为防止产生的状态过多,消耗过多的内存和CPU,类里面对最大状态数量做了限制 /**
* Default maximum number of states that {@link Operations#determinize} should create.
*/
public static final int DEFAULT_MAX_DETERMINIZED_STATES = 10000;
在有首尾通配符,并且字符串很长的情况下,这个determinize过程会产生大量的state,甚至会超过上限。至于NFA和DFA的区别是什么? 如何相互转换? 网上有很多数学层面的资料和论文,限于鄙人算法方面有限的知识,无精力去深入探究。 但是一个粗浅的理解是: NFA在输入一个条件的情况下,可以从一个状态转移到多种状态,而DFA只会有一个确定的状态可以转移,因此DFA在字符串匹配时速度更快。 DFA虽然搜索的时候快,但是构造方面的时间复杂度可能比较高,特别是带有首部通配符+长字符串的时候。
回想Elasticsearch官方文档里对于wildcard query有特别说明,要避免使用通配符开头的term。
" Note that this query can be slow, as it needs to iterate over many terms. In order to prevent extremely slow wildcard queries, a wildcard term should not start with one of the wildcards * or ?."
结合对上面wildcard query底层实现的探究,也就不难理解这句话的含义了!
总结: wildcard query应杜绝使用通配符打头,实在不得已要这么做,就一定需要限制用户输入的字符串长度。 最好换一种实现方式,通过在index time做文章,选用合适的分词器,比如nGram tokenizer预处理数据,然后使用更廉价的term query来实现同等的模糊搜索功能。 对于部分输入即提示的应用场景,可以考虑优先使用completion suggester, phrase/term suggeter一类性能更好,模糊程度略差的方式查询,待suggester没有匹配结果的时候,再fall back到更模糊但性能较差的wildcard, regex, fuzzy一类的查询。
-----------
补记: 有同学问regex, fuzzy query是否有同样的问题,答案是有,原因在于他们底层和wildcard一样,都是通过将pattern构造成DFA来加速字符串匹配速度的。 收起阅读 »
[杭州活动][2017年5月13日] Open Talk 美联集团(蘑菇街)技术专场
2017年5月13日14:00-17:00
活动场地
杭州市拱墅区丰潭路430号丰元国际大厦A座B1楼硬趣空间(城西银泰对面)
报名链接
http://t.cn/RX8xsh6
活动流程
13:30-14:00 签 到
14:00-14:10 开 场
14:10-15:00 无 相 蘑菇街稳定性 & 性能工作负责人 《蘑菇街稳定性实践》
15:00-15:50 民 达 美丽联合集团图像算法技术专家 《电商中的图像算法与应用》
15:50-16:00 茶 歇
16:00-16:50 吴 邪 美丽联合集团无线应用团队工程师 《无线端面向数据设计实践与可视化编程语言Dson》
16:50-17:30 自由交流
讲师介绍
无相 蘑菇街稳定性&性能工作负责人
2014年底加入蘑菇街,一直参与稳定性工具和平台的开发与建设,包括全链路监控和压测系统的设计和开发。
《蘑菇街稳定性实践》
本次分享主要介绍:蘑菇街大促保障流程,稳定性平台和工具支持:开关预案系统、限流降级系统、全链路监控系统、强弱依赖系统、全链路压测系统、单机压测系统、容量规划系统、业务全息监控系统、java性能在线分析系统等内容。
民达 美丽联合集团图像算法技术专家
2015年加入蘑菇街,现任美丽联合集团(美丽说X蘑菇街)图像算法技术专家,负责图像技术研发工作,带领算法团队与工程和业务团队合作,为集团提供图像技术支持。主要工作包括:图像搜索、图像识别、商品图像内容分析等;业务涉及电商导购、直播等场景。在加入蘑菇街之前,分别在NEC中国研究院、阿里巴巴集团,从事图像技术和机器学习的研究和应用。
《电商中的图像算法与应用》
本次分享主要介绍从电商业务中发现图像算法的价值和利用图像算法,提升电商业务中的用户体验。
吴邪,美丽联合集团无线应用团队工程师
2013年毕业于浙江大学,并加入淘宝从事服务端相关开发工作,后加入阿里云rds团队从事数据库云平台建设。2016年加入美丽联合集团,目前主要负责无线网关数据聚合层。对服务端高性能、高可用设计与编码比较感兴趣。
《无线端面向数据设计实践与可视化编程语言Dson》
本次分享主要介绍mwp-dsl、无线领域前后端开发现状、业界相关内容、mwp-dsl目标、dsl的挑战与核心设计(业务建模,性能与稳定性、安全、易用性)、数据可视化语言Dson、周边配套(开发、测试、管理、运维后台,相关运维体系)、适合的业务场景、后续工作等内容。
往期讲稿/视频回顾
https://opentalk.upyun.com
2017年5月13日14:00-17:00
活动场地
杭州市拱墅区丰潭路430号丰元国际大厦A座B1楼硬趣空间(城西银泰对面)
报名链接
http://t.cn/RX8xsh6
活动流程
13:30-14:00 签 到
14:00-14:10 开 场
14:10-15:00 无 相 蘑菇街稳定性 & 性能工作负责人 《蘑菇街稳定性实践》
15:00-15:50 民 达 美丽联合集团图像算法技术专家 《电商中的图像算法与应用》
15:50-16:00 茶 歇
16:00-16:50 吴 邪 美丽联合集团无线应用团队工程师 《无线端面向数据设计实践与可视化编程语言Dson》
16:50-17:30 自由交流
讲师介绍
无相 蘑菇街稳定性&性能工作负责人
2014年底加入蘑菇街,一直参与稳定性工具和平台的开发与建设,包括全链路监控和压测系统的设计和开发。
《蘑菇街稳定性实践》
本次分享主要介绍:蘑菇街大促保障流程,稳定性平台和工具支持:开关预案系统、限流降级系统、全链路监控系统、强弱依赖系统、全链路压测系统、单机压测系统、容量规划系统、业务全息监控系统、java性能在线分析系统等内容。
民达 美丽联合集团图像算法技术专家
2015年加入蘑菇街,现任美丽联合集团(美丽说X蘑菇街)图像算法技术专家,负责图像技术研发工作,带领算法团队与工程和业务团队合作,为集团提供图像技术支持。主要工作包括:图像搜索、图像识别、商品图像内容分析等;业务涉及电商导购、直播等场景。在加入蘑菇街之前,分别在NEC中国研究院、阿里巴巴集团,从事图像技术和机器学习的研究和应用。
《电商中的图像算法与应用》
本次分享主要介绍从电商业务中发现图像算法的价值和利用图像算法,提升电商业务中的用户体验。
吴邪,美丽联合集团无线应用团队工程师
2013年毕业于浙江大学,并加入淘宝从事服务端相关开发工作,后加入阿里云rds团队从事数据库云平台建设。2016年加入美丽联合集团,目前主要负责无线网关数据聚合层。对服务端高性能、高可用设计与编码比较感兴趣。
《无线端面向数据设计实践与可视化编程语言Dson》
本次分享主要介绍mwp-dsl、无线领域前后端开发现状、业界相关内容、mwp-dsl目标、dsl的挑战与核心设计(业务建模,性能与稳定性、安全、易用性)、数据可视化语言Dson、周边配套(开发、测试、管理、运维后台,相关运维体系)、适合的业务场景、后续工作等内容。
往期讲稿/视频回顾
https://opentalk.upyun.com 收起阅读 »
packetbeat的oracle协议扩展
出于版权考虑,packetbeat并没有加入oracle协议的支持,只能自己动手。
好在beats充分考虑了扩展性,把公共的基础工作抽象成框架,新协议的扩展只需要专注于协议的分析和解码。
tns协议是oracle客户端和服务端通信协议,应用可以通过OCI、JDBC等接口去访问数据库。
tns协议有多个版本,不同版本之间差异也比较大,11g是主流tns版本为314。
目前完成308、310、313、314、315版本的解析
packetbeat支持pcap、pf_ring等抓包方式,通过kafka+es+kibana展示,效果如图
出于版权考虑,packetbeat并没有加入oracle协议的支持,只能自己动手。
好在beats充分考虑了扩展性,把公共的基础工作抽象成框架,新协议的扩展只需要专注于协议的分析和解码。
tns协议是oracle客户端和服务端通信协议,应用可以通过OCI、JDBC等接口去访问数据库。
tns协议有多个版本,不同版本之间差异也比较大,11g是主流tns版本为314。
目前完成308、310、313、314、315版本的解析
packetbeat支持pcap、pf_ring等抓包方式,通过kafka+es+kibana展示,效果如图
收起阅读 »
【线下活动】2017-05-21 Elastic Meetup 北京站日程安排
协办:HULU 北京研发中心
时间:2017-05-21 13:30PM-18:00PM
地点:北京市朝阳区望京大科技园浦项中心b座21楼 hulu
分享主题:
个人介绍:倪顺,Hulu软件工程师,ELK粉。主要负责用户播放日志数据的收集,处理和可视化,以及服务监控。
主题:Elasticsearch 和 Kibana 在 Hulu视频的应用实践
内容介绍:Elasticsearch作为优秀的开源工具,很早就在Hulu内部使用。Hulu是一家视频公司,我们在用Elastic stack优化视频播放体验。本次分享中,主要包括:1)Kibana可视化视频播放日志数据;2)Elastic Stack使用的经验tips。
个人介绍:黄鑫,运维开发工程师,Pythonista,在监控和部署领域耕耘多年,一年前接触了 ELK。
主题:ELK CI/CD 部署实践
内容介绍:
使用 SaltStack 对 ELK 维护。配置管理,持续集成和持续部署的设计和实施。日常运维管理。
- 背景介绍
- 可用性设计
- 配置管理和持续集成
- 持续部署
- 发现的问题和未来展望
个人介绍:罗喆,最早加入快手的视频技术工程师,负责移动直播系统的构建和调优,并且搭建了基于大数据的质量监测系统,之前曾在腾讯从事实时视音频传输优化工作。
主题:Elastic Stack驱动的直播体验优化
内容介绍:
移动端视频直播业务经过2016年的井喷期,已经进入下半场,大家的关注点已经从如何构建完善的直播平台的粗放增长阶段,转入精细化运营阶段。如何在巨大的流量、复杂的应用场景、复杂的网络条件下,持续优化用户体验,是我们亟待回答的问题。构建大数据驱动的直播优化体系是快手为应对这一难题所提出的解决方案。
为此,我们基于完善的Elastic Stack建立了流媒体大数据分析和可视化平台。一切优化均围绕着数据进行:找到用户痛点,指导优化方向,评估优化效果,走出了一条行之有效的数据驱动之路。
演讲提纲:
1. 快手直播的业务背景,移动直播体验优化的方法论
2. Elastic Stack系统构建历程和真实优化案例
协办:HULU 北京研发中心
时间:2017-05-21 13:30PM-18:00PM
地点:北京市朝阳区望京大科技园浦项中心b座21楼 hulu
分享主题:
个人介绍:倪顺,Hulu软件工程师,ELK粉。主要负责用户播放日志数据的收集,处理和可视化,以及服务监控。
主题:Elasticsearch 和 Kibana 在 Hulu视频的应用实践
内容介绍:Elasticsearch作为优秀的开源工具,很早就在Hulu内部使用。Hulu是一家视频公司,我们在用Elastic stack优化视频播放体验。本次分享中,主要包括:1)Kibana可视化视频播放日志数据;2)Elastic Stack使用的经验tips。
个人介绍:黄鑫,运维开发工程师,Pythonista,在监控和部署领域耕耘多年,一年前接触了 ELK。
主题:ELK CI/CD 部署实践
内容介绍:
使用 SaltStack 对 ELK 维护。配置管理,持续集成和持续部署的设计和实施。日常运维管理。
- 背景介绍
- 可用性设计
- 配置管理和持续集成
- 持续部署
- 发现的问题和未来展望
个人介绍:罗喆,最早加入快手的视频技术工程师,负责移动直播系统的构建和调优,并且搭建了基于大数据的质量监测系统,之前曾在腾讯从事实时视音频传输优化工作。
主题:Elastic Stack驱动的直播体验优化
内容介绍:
移动端视频直播业务经过2016年的井喷期,已经进入下半场,大家的关注点已经从如何构建完善的直播平台的粗放增长阶段,转入精细化运营阶段。如何在巨大的流量、复杂的应用场景、复杂的网络条件下,持续优化用户体验,是我们亟待回答的问题。构建大数据驱动的直播优化体系是快手为应对这一难题所提出的解决方案。
为此,我们基于完善的Elastic Stack建立了流媒体大数据分析和可视化平台。一切优化均围绕着数据进行:找到用户痛点,指导优化方向,评估优化效果,走出了一条行之有效的数据驱动之路。
演讲提纲:
1. 快手直播的业务背景,移动直播体验优化的方法论
2. Elastic Stack系统构建历程和真实优化案例 收起阅读 »
【线下活动】2017-06-10南京Elastic Meetup日程安排
Elastic中文社区 趋势科技
2. 时间地点
活动时间:2017年6月10日 13:30 - 18:00
活动地点:雨花区软件大道48号苏豪国际广场B座 趋势科技中国研发中心(靠花神庙地铁站)
3. 主题
分享一:The State of Elastic Stack
演讲者简介:
曾勇(Medcl) Elastic工程师与布道师
Elasticsearch爱好者,2015年加入Elastic,Elastic 中文社区的发起人,Elastic在中国的首位员工。
主题简介:
Elastic Stack是Elastic公司的开源产品:Elasticsearch、Logstash、Kibana和Beats的统称,这些产品发布速度貌似有点快,在最近已经发布了的版本中有哪些值得关注的特性,然后Elastic的工程师手头上又在忙着码哪些新的特性呢?
机器学习、AI目前非常火,Elastic在最近的5.0也发布了一个机器学习的模块,这次也会带来demo演示。
分享二: Elastic Stack的容器化使用与Alert
演讲者简介:
瞿盛熙 嘀哒物流科技有限公司运维组组长
主题简介:
介绍嘀哒物流在公有云上的Elastic Stack部署以及日志分析与监控
1.目的和环境
2.部署:自动化,容器化下kubernetes与single mode的考量
3.日志分析与alert
4.监控:prometheus与docker
分享三:Elasticsearch辅助的智能客服机器人
演讲者简介:
杨文俊 趋势科技个人消费者部机器学习工程师
从2013年开始投入大数据处理与机器学习,目前依托Elasticsearch的搜索能力构建了一系列的智能服务。
主题简介:
1. 将原始的日文记录导入Elasticsearch之中
2. 使用Elasticsearch对原始内容进行初次过滤
3. 在过滤的基础之上,调用wmd + word2vec进行rerank,并综合进行判定
分享四: Elastic在华为电信软件运维中的应用简介
演讲者简介:
肖曙旭 华为电信软件业务云运维开发部软件工程师
华为日志服务特性负责人。从2015年起开始接触Elasticsearch并使用至今。先后负责服务调用链和日志服务特性的设计和开发,依托Elasticsearch实现搜索相关能力。
主题简介:
1. 日志采集代理。提供按正则表达式匹配或者分隔符的逻辑行分割方式;支持逻辑行内按分隔符提取字段,或者按正则表达式提取字段;支持一些简易算子对字段进行处理。
2. 日志汇聚。不同的日志类型通过不同的Topic区分
3. 流式处理。日志数据二次处理,或者一些实时分析的逻辑处理。
4. 参考kibana开发搜索和可视化能力,同时支持关键词告警,环比告警等告警能力,以及整个日志服务通道的自身监控能力。
分享五:基于ES的SQL报警引擎
演讲者简介:
张立丹 南京云利来软件科技有限公司
2010年参加工作,工作内容包括:Windows音频驱动及声卡固件;Linux高并发服务器;数据采集及分析。自2015年开始接触Elasticsearch,在工作中使用ES进行网络数据(TCP/HTTP/DNS等)的安全分析。
主题简介:
1. SQL:将ES的DSL抽象成 SQL
2. RDL:规则描述语言
3. 报警规则
Elastic中文社区 趋势科技
2. 时间地点
活动时间:2017年6月10日 13:30 - 18:00
活动地点:雨花区软件大道48号苏豪国际广场B座 趋势科技中国研发中心(靠花神庙地铁站)
3. 主题
分享一:The State of Elastic Stack
演讲者简介:
曾勇(Medcl) Elastic工程师与布道师
Elasticsearch爱好者,2015年加入Elastic,Elastic 中文社区的发起人,Elastic在中国的首位员工。
主题简介:
Elastic Stack是Elastic公司的开源产品:Elasticsearch、Logstash、Kibana和Beats的统称,这些产品发布速度貌似有点快,在最近已经发布了的版本中有哪些值得关注的特性,然后Elastic的工程师手头上又在忙着码哪些新的特性呢?
机器学习、AI目前非常火,Elastic在最近的5.0也发布了一个机器学习的模块,这次也会带来demo演示。
分享二: Elastic Stack的容器化使用与Alert
演讲者简介:
瞿盛熙 嘀哒物流科技有限公司运维组组长
主题简介:
介绍嘀哒物流在公有云上的Elastic Stack部署以及日志分析与监控
1.目的和环境
2.部署:自动化,容器化下kubernetes与single mode的考量
3.日志分析与alert
4.监控:prometheus与docker
分享三:Elasticsearch辅助的智能客服机器人
演讲者简介:
杨文俊 趋势科技个人消费者部机器学习工程师
从2013年开始投入大数据处理与机器学习,目前依托Elasticsearch的搜索能力构建了一系列的智能服务。
主题简介:
1. 将原始的日文记录导入Elasticsearch之中
2. 使用Elasticsearch对原始内容进行初次过滤
3. 在过滤的基础之上,调用wmd + word2vec进行rerank,并综合进行判定
分享四: Elastic在华为电信软件运维中的应用简介
演讲者简介:
肖曙旭 华为电信软件业务云运维开发部软件工程师
华为日志服务特性负责人。从2015年起开始接触Elasticsearch并使用至今。先后负责服务调用链和日志服务特性的设计和开发,依托Elasticsearch实现搜索相关能力。
主题简介:
1. 日志采集代理。提供按正则表达式匹配或者分隔符的逻辑行分割方式;支持逻辑行内按分隔符提取字段,或者按正则表达式提取字段;支持一些简易算子对字段进行处理。
2. 日志汇聚。不同的日志类型通过不同的Topic区分
3. 流式处理。日志数据二次处理,或者一些实时分析的逻辑处理。
4. 参考kibana开发搜索和可视化能力,同时支持关键词告警,环比告警等告警能力,以及整个日志服务通道的自身监控能力。
分享五:基于ES的SQL报警引擎
演讲者简介:
张立丹 南京云利来软件科技有限公司
2010年参加工作,工作内容包括:Windows音频驱动及声卡固件;Linux高并发服务器;数据采集及分析。自2015年开始接触Elasticsearch,在工作中使用ES进行网络数据(TCP/HTTP/DNS等)的安全分析。
主题简介:
1. SQL:将ES的DSL抽象成 SQL
2. RDL:规则描述语言
3. 报警规则 收起阅读 »
[线下活动] 2017-05-14 Elastic Meetup 上海日程
协办:众安保险
时间:2017-05-14 13:30PM-18:00PM
地点:上海市虹口区四川北路859号中信广场42楼
PPT 下载:https://pan.baidu.com/s/1eS157 ... %252F
分享主题:
个人介绍:杨智健, 众安保险搜索组负责人。
主题:es在众安保险的实践
内容介绍: es在众安保险业务线和日志类的实践,和相关平台化建设。
录像:https://v.qq.com/x/page/x0509wkr513.html
个人介绍:Medcl, Elastic工程师与布道师,2015年加入Elastic公司, Elastic中文社区的发起人。
主题:ElasticStack 5.x 最新进展
内容介绍:ElasticStack 5.x 新增了很多新的激动人心的特性,本次分享将为大家一一解读。
录像:https://v.qq.com/x/page/m0509dt9f80.html
个人介绍:魏彬, rockybean,穿衣助手技术负责人,Elastic Stack 粉丝。
主题:用 Elastic Stack 来诊断下你的redis slowlog
内容介绍:
1. Elastic Stack 之 ElasticSearch Beats Kibana 简介
2. redis 和 slowlog 简介
3. 实现原理介绍
4. Kibana图形化结果展示介绍
5. 代码解析
6. 开源过程中的几点心得分享
录像:https://v.qq.com/x/page/m0509j6kyzj.html
个人介绍: 柯诗豪,携程旅行网高级软件工程师。
主题:基于Docker的ES PaaS云平台
内容介绍:伴随着公司越来越多的团队开始使用ES,部署和管理ES集群成本增加。所以建立了基于Docker通过Mesos提供的资源管理机制的ES PaaS平台,用户可以在平台上快捷的创建、配置和管理ES集群。
录像:https://v.qq.com/x/page/n0509pzjgxq.html
个人介绍: 彭科,13年从武汉理工毕业 ,16年进入斗鱼大数据基础架构组,主要负责日志监控平台和一些大数据技术的预研。目前已经从斗鱼离职,接下来会去一家云计算创业公司,从事大数据产品研发和AI方向研究。
主题:基于Elastic Stack+Kafka的日志监控平台架构演进
内容介绍:基于在斗鱼的工作经验,基于Elastic Stack和kafka做TB级日志监控平台搭建,架构演讲,踩过哪些坑,如何调优,与大数据组件技术对比,如何结合使用,如何监控基础组件与业务,分享一些自己的心得。
录像:https://v.qq.com/x/page/m05099qj8f9.html
协办:众安保险
时间:2017-05-14 13:30PM-18:00PM
地点:上海市虹口区四川北路859号中信广场42楼
PPT 下载:https://pan.baidu.com/s/1eS157 ... %252F
分享主题:
个人介绍:杨智健, 众安保险搜索组负责人。
主题:es在众安保险的实践
内容介绍: es在众安保险业务线和日志类的实践,和相关平台化建设。
录像:https://v.qq.com/x/page/x0509wkr513.html
个人介绍:Medcl, Elastic工程师与布道师,2015年加入Elastic公司, Elastic中文社区的发起人。
主题:ElasticStack 5.x 最新进展
内容介绍:ElasticStack 5.x 新增了很多新的激动人心的特性,本次分享将为大家一一解读。
录像:https://v.qq.com/x/page/m0509dt9f80.html
个人介绍:魏彬, rockybean,穿衣助手技术负责人,Elastic Stack 粉丝。
主题:用 Elastic Stack 来诊断下你的redis slowlog
内容介绍:
1. Elastic Stack 之 ElasticSearch Beats Kibana 简介
2. redis 和 slowlog 简介
3. 实现原理介绍
4. Kibana图形化结果展示介绍
5. 代码解析
6. 开源过程中的几点心得分享
录像:https://v.qq.com/x/page/m0509j6kyzj.html
个人介绍: 柯诗豪,携程旅行网高级软件工程师。
主题:基于Docker的ES PaaS云平台
内容介绍:伴随着公司越来越多的团队开始使用ES,部署和管理ES集群成本增加。所以建立了基于Docker通过Mesos提供的资源管理机制的ES PaaS平台,用户可以在平台上快捷的创建、配置和管理ES集群。
录像:https://v.qq.com/x/page/n0509pzjgxq.html
个人介绍: 彭科,13年从武汉理工毕业 ,16年进入斗鱼大数据基础架构组,主要负责日志监控平台和一些大数据技术的预研。目前已经从斗鱼离职,接下来会去一家云计算创业公司,从事大数据产品研发和AI方向研究。
主题:基于Elastic Stack+Kafka的日志监控平台架构演进
内容介绍:基于在斗鱼的工作经验,基于Elastic Stack和kafka做TB级日志监控平台搭建,架构演讲,踩过哪些坑,如何调优,与大数据组件技术对比,如何结合使用,如何监控基础组件与业务,分享一些自己的心得。
录像:https://v.qq.com/x/page/m05099qj8f9.html 收起阅读 »
ES5.2.2支持geo排序+聚合
具体查询条件,这里不写了;
查询结果如下:
{ "took": 90, "timed_out": false, "_shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": { "total": 10, "max_score": null, "hits": [ { "_index": "testindex", "_type": "testdoc07", "_id": "1-1000000", "_score": null, "_source": { "comId": 1, "comName": "佛山消防支队", "elemetType": 2, "equipCode": "1000000", "equipName": "灭火剂0", "equipValue": 73, "location": { "lat": 23.027237, "lon": 113.123618 }, "phone": "15986190299", "userName": "李成龙" }, "sort": [ 3740.583503580435 ] }, { "_index": "testindex", "_type": "testdoc07", "_id": "1-1000003", "_score": null, "_source": { "comId": 1, "comName": "佛山消防支队", "elemetType": 2, "equipCode": "1000003", "equipName": "灭火剂3", "equipValue": 47, "location": { "lat": 23.027237, "lon": 113.123618 }, "phone": "15986190299", "userName": "李成龙" }, "sort": [ 3740.583503580435 ] }, { "_index": "testindex", "_type": "testdoc07", "_id": "1-1000001", "_score": null, "_source": { "comId": 1, "comName": "佛山消防支队", "elemetType": 2, "equipCode": "1000001", "equipName": "灭火剂1", "equipValue": 12, "location": { "lat": 23.027237, "lon": 113.123618 }, "phone": "15986190299", "userName": "李成龙" }, "sort": [ 3740.583503580435 ] }, { "_index": "testindex", "_type": "testdoc07", "_id": "1-1000004", "_score": null, "_source": { "comId": 1, "comName": "佛山消防支队", "elemetType": 2, "equipCode": "1000004", "equipName": "灭火剂4", "equipValue": 2, "location": { "lat": 23.027237, "lon": 113.123618 }, "phone": "15986190299", "userName": "李成龙" }, "sort": [ 3740.583503580435 ] }, { "_index": "testindex", "_type": "testdoc07", "_id": "1-1000002", "_score": null, "_source": { "comId": 1, "comName": "佛山消防支队", "elemetType": 2, "equipCode": "1000002", "equipName": "灭火剂2", "equipValue": 57, "location": { "lat": 23.027237, "lon": 113.123618 }, "phone": "15986190299", "userName": "李成龙" }, "sort": [ 3740.583503580435 ] }, { "_index": "testindex", "_type": "testdoc07", "_id": "2-1000018", "_score": null, "_source": { "comId": 2, "comName": "禅城大队", "elemetType": 2, "equipCode": "1000018", "equipName": "灭火剂8", "equipValue": 61, "location": { "lat": 23.057237, "lon": 113.103618 }, "phone": "13925403119", "userName": "郭武斌" }, "sort": [ 7648.2045946025555 ] }, { "_index": "testindex", "_type": "testdoc07", "_id": "2-1000014", "_score": null, "_source": { "comId": 2, "comName": "禅城大队", "elemetType": 2, "equipCode": "1000014", "equipName": "灭火剂4", "equipValue": 81, "location": { "lat": 23.057237, "lon": 113.103618 }, "phone": "13925403119", "userName": "郭武斌" }, "sort": [ 7648.2045946025555 ] }, { "_index": "testindex", "_type": "testdoc07", "_id": "2-1000016", "_score": null, "_source": { "comId": 2, "comName": "禅城大队", "elemetType": 2, "equipCode": "1000016", "equipName": "灭火剂6", "equipValue": 81, "location": { "lat": 23.057237, "lon": 113.103618 }, "phone": "13925403119", "userName": "郭武斌" }, "sort": [ 7648.2045946025555 ] }, { "_index": "testindex", "_type": "testdoc07", "_id": "2-1000015", "_score": null, "_source": { "comId": 2, "comName": "禅城大队", "elemetType": 2, "equipCode": "1000015", "equipName": "灭火剂5", "equipValue": 87, "location": { "lat": 23.057237, "lon": 113.103618 }, "phone": "13925403119", "userName": "郭武斌" }, "sort": [ 7648.2045946025555 ] }, { "_index": "testindex", "_type": "testdoc07", "_id": "2-1000017", "_score": null, "_source": { "comId": 2, "comName": "禅城大队", "elemetType": 2, "equipCode": "1000017", "equipName": "灭火剂7", "equipValue": 90, "location": { "lat": 23.057237, "lon": 113.103618 }, "phone": "13925403119", "userName": "郭武斌" }, "sort": [ 7648.2045946025555 ] } ] }, "aggregations": { "aggEquip": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ { "key": "1000000", "doc_count": 1, "sumEquipValue": { "value": 73 } }, { "key": "1000001", "doc_count": 1, "sumEquipValue": { "value": 12 } }, { "key": "1000002", "doc_count": 1, "sumEquipValue": { "value": 57 } }, { "key": "1000003", "doc_count": 1, "sumEquipValue": { "value": 47 } }, { "key": "1000004", "doc_count": 1, "sumEquipValue": { "value": 2 } }, { "key": "1000014", "doc_count": 1, "sumEquipValue": { "value": 81 } }, { "key": "1000015", "doc_count": 1, "sumEquipValue": { "value": 87 } }, { "key": "1000016", "doc_count": 1, "sumEquipValue": { "value": 81 } }, { "key": "1000017", "doc_count": 1, "sumEquipValue": { "value": 90 } }, { "key": "1000018", "doc_count": 1, "sumEquipValue": { "value": 61 } }, { "key": "10000210", "doc_count": 1, "sumEquipValue": { "value": 70 } }, { "key": "10000211", "doc_count": 1, "sumEquipValue": { "value": 55 } }, { "key": "1000027", "doc_count": 1, "sumEquipValue": { "value": 19 } }, { "key": "1000028", "doc_count": 1, "sumEquipValue": { "value": 25 } }, { "key": "1000029", "doc_count": 1, "sumEquipValue": { "value": 3 } }, { "key": "10000311", "doc_count": 1, "sumEquipValue": { "value": 97 } }, { "key": "10000312", "doc_count": 1, "sumEquipValue": { "value": 79 } }, { "key": "10000313", "doc_count": 1, "sumEquipValue": { "value": 95 } }, { "key": "10000314", "doc_count": 1, "sumEquipValue": { "value": 6 } }, { "key": "10000315", "doc_count": 1, "sumEquipValue": { "value": 8 } } ] } } }
具体查询条件,这里不写了;
查询结果如下:
{ "took": 90, "timed_out": false, "_shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": { "total": 10, "max_score": null, "hits": [ { "_index": "testindex", "_type": "testdoc07", "_id": "1-1000000", "_score": null, "_source": { "comId": 1, "comName": "佛山消防支队", "elemetType": 2, "equipCode": "1000000", "equipName": "灭火剂0", "equipValue": 73, "location": { "lat": 23.027237, "lon": 113.123618 }, "phone": "15986190299", "userName": "李成龙" }, "sort": [ 3740.583503580435 ] }, { "_index": "testindex", "_type": "testdoc07", "_id": "1-1000003", "_score": null, "_source": { "comId": 1, "comName": "佛山消防支队", "elemetType": 2, "equipCode": "1000003", "equipName": "灭火剂3", "equipValue": 47, "location": { "lat": 23.027237, "lon": 113.123618 }, "phone": "15986190299", "userName": "李成龙" }, "sort": [ 3740.583503580435 ] }, { "_index": "testindex", "_type": "testdoc07", "_id": "1-1000001", "_score": null, "_source": { "comId": 1, "comName": "佛山消防支队", "elemetType": 2, "equipCode": "1000001", "equipName": "灭火剂1", "equipValue": 12, "location": { "lat": 23.027237, "lon": 113.123618 }, "phone": "15986190299", "userName": "李成龙" }, "sort": [ 3740.583503580435 ] }, { "_index": "testindex", "_type": "testdoc07", "_id": "1-1000004", "_score": null, "_source": { "comId": 1, "comName": "佛山消防支队", "elemetType": 2, "equipCode": "1000004", "equipName": "灭火剂4", "equipValue": 2, "location": { "lat": 23.027237, "lon": 113.123618 }, "phone": "15986190299", "userName": "李成龙" }, "sort": [ 3740.583503580435 ] }, { "_index": "testindex", "_type": "testdoc07", "_id": "1-1000002", "_score": null, "_source": { "comId": 1, "comName": "佛山消防支队", "elemetType": 2, "equipCode": "1000002", "equipName": "灭火剂2", "equipValue": 57, "location": { "lat": 23.027237, "lon": 113.123618 }, "phone": "15986190299", "userName": "李成龙" }, "sort": [ 3740.583503580435 ] }, { "_index": "testindex", "_type": "testdoc07", "_id": "2-1000018", "_score": null, "_source": { "comId": 2, "comName": "禅城大队", "elemetType": 2, "equipCode": "1000018", "equipName": "灭火剂8", "equipValue": 61, "location": { "lat": 23.057237, "lon": 113.103618 }, "phone": "13925403119", "userName": "郭武斌" }, "sort": [ 7648.2045946025555 ] }, { "_index": "testindex", "_type": "testdoc07", "_id": "2-1000014", "_score": null, "_source": { "comId": 2, "comName": "禅城大队", "elemetType": 2, "equipCode": "1000014", "equipName": "灭火剂4", "equipValue": 81, "location": { "lat": 23.057237, "lon": 113.103618 }, "phone": "13925403119", "userName": "郭武斌" }, "sort": [ 7648.2045946025555 ] }, { "_index": "testindex", "_type": "testdoc07", "_id": "2-1000016", "_score": null, "_source": { "comId": 2, "comName": "禅城大队", "elemetType": 2, "equipCode": "1000016", "equipName": "灭火剂6", "equipValue": 81, "location": { "lat": 23.057237, "lon": 113.103618 }, "phone": "13925403119", "userName": "郭武斌" }, "sort": [ 7648.2045946025555 ] }, { "_index": "testindex", "_type": "testdoc07", "_id": "2-1000015", "_score": null, "_source": { "comId": 2, "comName": "禅城大队", "elemetType": 2, "equipCode": "1000015", "equipName": "灭火剂5", "equipValue": 87, "location": { "lat": 23.057237, "lon": 113.103618 }, "phone": "13925403119", "userName": "郭武斌" }, "sort": [ 7648.2045946025555 ] }, { "_index": "testindex", "_type": "testdoc07", "_id": "2-1000017", "_score": null, "_source": { "comId": 2, "comName": "禅城大队", "elemetType": 2, "equipCode": "1000017", "equipName": "灭火剂7", "equipValue": 90, "location": { "lat": 23.057237, "lon": 113.103618 }, "phone": "13925403119", "userName": "郭武斌" }, "sort": [ 7648.2045946025555 ] } ] }, "aggregations": { "aggEquip": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ { "key": "1000000", "doc_count": 1, "sumEquipValue": { "value": 73 } }, { "key": "1000001", "doc_count": 1, "sumEquipValue": { "value": 12 } }, { "key": "1000002", "doc_count": 1, "sumEquipValue": { "value": 57 } }, { "key": "1000003", "doc_count": 1, "sumEquipValue": { "value": 47 } }, { "key": "1000004", "doc_count": 1, "sumEquipValue": { "value": 2 } }, { "key": "1000014", "doc_count": 1, "sumEquipValue": { "value": 81 } }, { "key": "1000015", "doc_count": 1, "sumEquipValue": { "value": 87 } }, { "key": "1000016", "doc_count": 1, "sumEquipValue": { "value": 81 } }, { "key": "1000017", "doc_count": 1, "sumEquipValue": { "value": 90 } }, { "key": "1000018", "doc_count": 1, "sumEquipValue": { "value": 61 } }, { "key": "10000210", "doc_count": 1, "sumEquipValue": { "value": 70 } }, { "key": "10000211", "doc_count": 1, "sumEquipValue": { "value": 55 } }, { "key": "1000027", "doc_count": 1, "sumEquipValue": { "value": 19 } }, { "key": "1000028", "doc_count": 1, "sumEquipValue": { "value": 25 } }, { "key": "1000029", "doc_count": 1, "sumEquipValue": { "value": 3 } }, { "key": "10000311", "doc_count": 1, "sumEquipValue": { "value": 97 } }, { "key": "10000312", "doc_count": 1, "sumEquipValue": { "value": 79 } }, { "key": "10000313", "doc_count": 1, "sumEquipValue": { "value": 95 } }, { "key": "10000314", "doc_count": 1, "sumEquipValue": { "value": 6 } }, { "key": "10000315", "doc_count": 1, "sumEquipValue": { "value": 8 } } ] } } }
收起阅读 »