我们需要查看数据的统计量时,均值是最重要的特征之一。对于海量数据,这类简单的聚合ES可以做到秒级别返回。聚合是ES的特色功能。那么ES是如何实现这一功能的呢?我们知道,ES的数据存储在各个节点中,所以ES的实现AvgAggregation时基本思路就是先统计各个节点,然后汇总。先了解ES是如何统计单个节点:参考AvgAggregator@OverridepublicLeafBucketCollec
看《黑客与画家》讲到"防止垃圾邮件的一种方法",觉得很适合用来表述数学公式与机器学习之间的关系。涉及到机器学习的数学公式比较简单,概率论基础教程都会讲到。解决的问题也很典型:垃圾邮件的识别。防止垃圾邮件有很多种方法,最直观的一种就是“规则”,各种if-else的条件。这种方法能够解决一个问题,但是解决不了一类问题。而且,这个规则的制定需要非常熟悉业务,好在通常我们面临的业务问题
ES的官方文档中关于检索和排序的关系说得特别好:Searchneedstoanswerthequestion"Whichdocumentscontainthisterm?",whilesortingandaggregationsneedtoansweradifferentquestion:"Whatisthevalueofthisfieldforthisdocument?".搜索要解决的问题是:&
各个业务数据“汇总到hive,经过ETL处理后,导出到数据库“是大数据产品的典型业务流程。这其中,sqoop(离线)和kafka(实时)几乎是数据总线的标配了。但是有些业务也有不标准的,比如hive数据导入到ES.hive数据导入到ES,官方组件是elasticsearch-hadoop.其用法在前面的博客中已有介绍。那么其实现原理是怎样的呢?或者说,es-hadoop这家伙到底是怎么把hive表
github上es项目讲述其易用性时,用来举例的就有getapi。curl-XPUT'http://localhost:9200/twitter/doc/1?pretty'-H'Content-Type:application/json'-d'{"user":"kimchy","post_date":"2009-11-15×××3:12:00","message":"TryingoutElastic
ES中,有一类参数是可以动态调整的,比如副本数量:number_of_replicas。在插件开发中,如何添加自己的自定义参数呢?在插件的入口,添加onModule(ClusterModulemodule)即可。publicclassShgyPluginextendsPlugin{@OverridepublicStringname(){return"shgy-plugin";}@Overridep
开发中需要用到ES的插件,开发ES插件需要了解ES的内部结构,于是再次开始学习ES的源码。一方面了解插件开发的套路,一方面了解get接口的实现细节。了解ES的原理,源码是文档最好的补充。源码甚至比文档更有助于了解ES的内部核心。首先从git上clone下源码:gitclonehttps://github.com/elastic/elasticsearch.gitcdelasticsearchgit
es提供template功能的出发点在哪里呢?作为NoSQL数据库,ES在数据入库前是不做schema设定的,也就是不限定数据字段.这对日志类型的数据来说,是个利好的场景.但是这种不设定schema的做法,有时有太过自由.有些业务场景,我们需要预先设定field的分词方式.这时固然可以使用mappings解决.但是业务接入前要通知一下,先建个索引,想想有点不智能.有没有更灵活一点的做法呢?temp
一、前言无论是在数据库,还是其他的业务系统,日志是非常重要的。日志通常在系统中有如下的作用:1. 业务问题定位。系统开发中,谁没写几个BUG? 有了日志,就能方便快速定位问题,修复系统。这也是我们用日志最多的地方。2. 系统运行流程监控。 雁过必留痕,通过日志可以进行系统校验,确保系统是按预定的流程运行,而不是你以为的方式。毕竟计算机运行的方式是它以为,而不是你以为。3.
关于LDA主题模型,一度是NLP领域一个非常火的模型,后来深度学习大放异彩,它的热度才慢慢降了下来。由于数学基础很差,一直没有理解LDA的整个核心。到目前为止,也只是理解了皮毛。记录一下关于LDA主题模型相关的学习资料。LDA主题模型属于编码简单,但是数学功底要求较高的一个机器学习模型,在搜索引擎和广告领域有用到。按照《LDA数学八卦》作者靳志辉老师的说法,是一个比较简单的模型,前提是需要数学功底
《基业长青》有个核心问题:为什么像宝洁,3M这样公司能够生存长达一个世纪依然枝繁叶茂?公司必须有着超出利润之外的追求。这就是公司的核心价值观和企业文化之所在。超大组织必须有一个沟通对话的基础,这也是宗教的来源。公司的文化必须能够传承。这要求公司不能仅仅依靠CEO的个人魅力和远见。与其报时,不如造钟。公司的成长是自我更新进化,而非一蹴而就。这在互联网时代特别需要警醒。公司必须有推陈出新的能力。目标,
数据库相关的知识,看了《高性能MySQL》和《数据库系统实现》两本。两本书综合看效果更好。《高性能MySQL》从使用的角度入手,《数据库系统实现》从原理的角度入手。以前学习数据库相关的知识时有个执念,一定要弄明白它是怎么实现的,就直接买了一个《MySQL内核:Innodb存储引擎》,结果看不懂,束之高阁。数据库的知识,个人觉得如下的顺序比较合理。硬盘《数据库系统实现》在第二章就单独用一章的篇幅讲解
性能优化是我们开发中经常要做的事情。通常我们也就在代码层面做一下优化,抑或在流程层面进行改造,基本很少进行架构层面的优化。架构一般都是推翻重构的。《性能之巅》这本书是二刷。第一次看这本书,留下的唯一印象就是3.3HzCPU寄存器延时的阐释,让我意识到硬盘读写和网络传输跟CPU运算的巨大差距。这个差距催生了许多从软件层面解决问题算法跟数据结构,比如用于数据库索引的B+tree,比如各种排队模型。所谓
花了大概半个月的时间,将《设计数据密集型应用》看了一遍,不愧是豆瓣10.0的好书。作者在一本书里面,讲解了MySQL,Redis,Solr,Mongodb,Elasticsearch,Kafka,Hive,Hbase,Spark,Flink,Mapreduce,Neo4j,Titan,InfiniteGraph等几乎所有数据存储,数据处理的组件。在一本书里面,囊括几乎所有类型的数据库,队列,NoS
《数据化管理:洞悉零售及电子商务运营》看这本书的出发点是希望了解运营如何使用数据。在上家公司,做了一些简单的数据分析工作,觉得很有意思,大部分时候想出出符合数据的结论也很痛苦。随着互联网进入存量市场,精细化运营越来越重要。随着公司累计数据越来越多,数据如何产生价值也越来越重要。累计的数据可以方便地构造出成百上千的指标,那么哪些价值高,哪些费力不讨好,哪些随着业务发展越来越重要,哪些随着业务发展逐步
ES作为一个NoSQL,典型的应用场景就是存储数据。即用户可以通过api添加数据到es中。由于Lucene内部的实现,每次添加的数据并不是实时落盘的。而是在内存中维护着索引信息,直到缓冲区满了或者显式的commit,数据才会落盘,形成一个segement,保存在文件中。那么假如由于某种原因,ES的进程突然挂了,那些在内存中的数据就会丢失。而实际上,用户调用api,返回结果确认用户数据已经添加到索引
使用healthapi可以查看es集群的健康度。healthapi的用法如下:curl'http://localhost:9200/_cluster/health'healthapi的返回值中有一个核心的字段status,status有3种取值:green,yellow,red。分别代表集群的3种状态:主分片和副本都已经分配,主分片已经分配副本分片没有,制定分片没有分配。也就是说,healthap
ES的deleteapi使用非常简单。curl-XDELETE'http://localhost:9200/index/type/doc_id'前面学习了getapi的主要流程,这里探索一下deleteapi的实现原理。优先选择deleteapi而非indexapi,主要是觉得删除貌似更容易,选择deleteapi学习曲线应该比较平缓。ES相关功能Action的命名很统一,比如getapi,对应实
前面研究过ES的getapi的整体思路,作为编写ES插件时的借鉴。当时的重点在与理解整体流程,主要是shardOperation()的方法内部的调用逻辑,就弱化了shards()方法。实际上shards()方法在理解ES的结构层面,作用更大一些。我们还是从getapi入手来理解shards()。先回顾一下getapi的使用流程:添加文档到ES:curl-XPUT'http://localhost:
池技术是性能优化的重要手段:连接池,线程池已经是开发中的标配了。面试中这个知识点也是高频问题。抽空学习了Java的ThreadPoolExecutor,把学习的思路记录一下。由于线程的创建和销毁都是系统层面的操作,涉及到系统资源的占用和回收,所以创建线程是一个重量级的操作。为了提升性能,就引入了线程池;即线程复用。Java不仅提供了线程池,还提供了线程池的操作工具类。我们由浅入深了解一下。impo
AbstractQueuedSynchronizer是JUC的核心框架,其设计非常精妙。使用了Java的模板方法模式。首先试图还原一下其使用场景:对于排他锁,在同一时刻,N个线程只有1个线程能获取到锁;其他没有获取到锁的线程被挂起放置在队列中,待获取锁的线程释放锁后,再唤醒队列中的线程。线程的挂起是获取锁失败时调用Unsafe.park()方法;线程的唤醒是由其他线程释放锁时调用Unsafe.un
Java语言从设计之初就把多线程作为语言的核心,至少从以下几点可以看出:1.Object对象的wait和notify机制。2.Thread类在lang包中。3.synchronizedvolatile关键字。虽然多线程是Java语言本身的特性,但是线程并不是Java语言独有的东西,而是操作系统的特性。Java在语言层面进行了封装,使其使用更简单。多线程存在的价值在哪里呢?内存读写,磁盘IO,网络传
回想最开始学习JavaIO相关的操作时,被各种Reader/Stream绕晕。现在再回头梳理这一块的知识点,感觉清晰了很多。Java作为编程语言,大部分东西都是从系统层面带来的,所以学习的知识点虽然在Java,但是背后的答案却在操作系统层面。首先理解核心概念:IO,究竟什么是IO?所谓IO就是内存与外设相关的数据传输。常用的外设有硬盘,网卡,打印机,鼠标...我们接触最频繁的IO操作是硬盘上文件的
ES作为一个分布式系统,需要多个节点协同,来管理集群,处理用户请求。那么很自然有个问题,ES的集群是如何组建起来的?所谓集群,就是多台计算机一起协同工作。既然是协同工作,那么就必须步调一致,步调一致才能得解放。需要有领导这个角色来协调资源,这个角色在ES中命名为Master。Master这个角色,不是ES的独有的,基本上所有的分布式系统都有这个角色的存在,比如Zookeeper,Mongo等。Ma
Luene的核心应用场景是全文检索。简单来说,就是通过用户输入的关键词来匹配相关文档,然后根据匹配程度返回TopN的查询结果给用户。这里需要解决的一个核心问题就是如何快速返回TopN的结果,这本质上是一个排序的问题。说起排序,我们有很多选择,冒泡,快排,归并...。这些排序算法在数据量小的时候,不是问题。一旦数据量过大,就成为问题了。例如对1000万的数组排序:Integer[]a=newInte
集成测试在es源码中的用法比较简单。我选择的切入口是delete-by-query插件。将es插件的源码导入intellij后,直接运行类DeleteByQueryRestIT,就会运行所有的集成测试用例。-ea-Dtests.security.manager=false这个运行结果,会让我产生两个疑问:这个类里面没有test注解的方法,其入口在哪里?resource/rest-api-spec目
看JavaAPI的Object类,一共11个方法。按使用的频度排名:toString()这个方法最常用在打日志,定位代码问题。equals()和hashCode(),这两个方法的使用经典例子是HashMap的源码publicVput(Kkey,Vvalue){if(table==EMPTY_TABLE){inflateTable(threshold);}if(key==null)returnput
ES的聚合是其一大特色。然而出于性能的考虑,ES的聚合是以分片Shard为单位,而非Index为单位,所以有些聚合的准确性是需要注意的。比如:TermAggregations.es的基数聚合使用到了hyperloglog算法。出于好奇,了解了一下。在海量数据场景下,我们通常会遇到这样的两个问题:数据排重。比如在推送消息场景,消息重复对用户是打扰,用户发券场景,重复发券就是损失了。pv/uv统计。这
大数据方兴未艾,Hive在业界,是大数据的标配了。因此hive数据添加到ES的应用场景还是比较常见的。学习ES官方的es-hadoop,有从hive导数据到ES.实验可行。hive的版本:hive-1.1.0-cdh5.9.0具体的步骤如下:step1将elasticsearch-hadoop-hive-version.jar添加到hivewgethttps://artifacts.elastic
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号