Elasticsearch6.1.2源码下载和编译构建

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 为了深入学习elasticsearch,研究其源码是种有效途径,本文简述了从下载到编译构建再运行起来的全部过程

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码): https://github.com/zq2599/blog_demos

本篇概览

  • 为了深入学习elasticsearch,研究其源码是种有效途径,本文简述了从下载到编译构建再运行起来的全部过程;

环境信息

  1. 操作系统:Ubuntu 18.04.2 LTS
  2. JDK:1.8.0_191
  3. Gradle:4.6
  4. elasticsearch:6.1.2
  • 请确保JDK和Gradle已安装在Ubuntu电脑上,并且环境变量设置成功;

账号问题

  • 由于elasticsearch要求以非root身份启动,因此本次实战用的不是root账号,以下命令可用来创建admin账号:
groupadd admin && useradd -d /home/admin -g admin -m admin

下载源码

在这里插入图片描述

  • 将源码下载到Ubuntu电脑上,执行tar -zxf elasticsearch-6.1.2.tar.gz解压后,得到新的文件夹elasticsearch-6.1.2;

修改源码

  • 为了证明修改的源码可以正常构建和运行,我们来修改一个java文件,在里面打印一些日志;
  • 进入前面解压得到的文件夹elasticsearch-6.1.2
  • 打开文件core/src/main/java/org/elasticsearch/node/Node.java,增加一个静态方法,作用是打印当前线程堆栈情况,内容如下:
public static void printTrack(Logger logger, String prefix){
        StackTraceElement[] st = Thread.currentThread().getStackTrace();
        if(null==st){
            logger.info("invalid stack");
            return;
        }
        StringBuffer sbf =new StringBuffer();
        for(StackTraceElement e:st){
            if(sbf.length()>0){
                sbf.append(" <- ");
                sbf.append(System.getProperty("line.separator"));
            }
            sbf.append(java.text.MessageFormat.format("{0}.{1}() {2}"
                ,e.getClassName()
                ,e.getMethodName()
                ,e.getLineNumber()));
        }
        logger.info(prefix
            + "\n************************************************************\n"
            + sbf.toString()
            + "\n************************************************************");
    }
  • 找到Node.java的如下方法:
protected Node(final Environment environment, Collection<Class<? extends Plugin>> classpathPlugins) {
        final List<Closeable> resourcesToClose = new ArrayList<>(); // register everything we need to release in the case of an error
        boolean success = false;
        {
            // use temp logger just to say we are starting. we can't use it later on because the node name might not be set
            Logger logger = Loggers.getLogger(Node.class, NODE_NAME_SETTING.get(environment.settings()));
            logger.info("initializing ...");
        }
  • logger.info("initializing ...");这一行代码下面增加下面这一行内容,作用是在elasticsearch启动时打印Node类实例的调用堆栈:
printTrack(logger, "Here is stack of Node instance");
  • 保存好再退出,接下来可以编译了;

编译构建

  • 进入文件夹elasticsearch-6.1.2,执行命令./gradlew assemble即可开始编译,下载依赖会消耗大量时间,因此请耐心等待,编译过程中CPU占用略高,如下图:

在这里插入图片描述

  • 大约10多分钟后,编译构建成功,控制台如下所示:
...
> Task :test:fixtures:old-elasticsearch:javadocJar
Building without git revision id.

> Task :test:fixtures:old-elasticsearch:sourcesJar
Building without git revision id.


BUILD SUCCESSFUL in 11m 3s
473 actionable tasks: 473 executed
  • 编译完成后,进入目录elasticsearch-6.1.2/distribution/tar/build/distributions可以见到构建成功的结果:elasticsearch-6.1.2-SNAPSHOT.tar.gz,这就是可用的elasticsearch-6.1.2;
  • 构建结果文件以SNAPSHOT作为文件名后缀,如果不想要此后缀,在编译的时候改用以下命令即可:
./gradlew assemble -Dbuild.snapshot=false

验证构建的elasticsearch是否可用

  • 解压elasticsearch-6.1.2-SNAPSHOT.tar.gz到一个目录下;
  • 进入目录elasticsearch-6.1.2-SNAPSHOT/config,修改network.host的配置为0.0.0.0,如下图:

在这里插入图片描述

  • 进入目录elasticsearch-6.1.2-SNAPSHOT/bin,执行./elasticsearch命令启动服务;
  • 在控制台可以看到新增的代码打出的日志,将Node类的调用堆栈打印出来了,我们也借此机会了解到elasticsearch启动时的涉及到的关键类:
[2019-04-20T04:02:55,785][INFO ][o.e.n.Node               ] [] initializing ...
[2019-04-20T04:02:55,789][INFO ][o.e.n.Node               ] [] Here is stack of Node instance
************************************************************
java.lang.Thread.getStackTrace() 1,559 <-
org.elasticsearch.node.Node.printTrack() 953 <-
org.elasticsearch.node.Node.<init>() 255 <-
org.elasticsearch.node.Node.<init>() 245 <-
org.elasticsearch.bootstrap.Bootstrap$5.<init>() 212 <-
org.elasticsearch.bootstrap.Bootstrap.setup() 212 <-
org.elasticsearch.bootstrap.Bootstrap.init() 322 <-
org.elasticsearch.bootstrap.Elasticsearch.init() 121 <-
org.elasticsearch.bootstrap.Elasticsearch.execute() 112 <-
org.elasticsearch.cli.EnvironmentAwareCommand.execute() 86 <-
org.elasticsearch.cli.Command.mainWithoutErrorHandling() 124 <-
org.elasticsearch.cli.Command.main() 90 <-
org.elasticsearch.bootstrap.Elasticsearch.main() 92 <-
org.elasticsearch.bootstrap.Elasticsearch.main() 85
************************************************************
  • 我的ubutnu电脑的IP地址是192.168.50.75,因此用浏览器访问此地址:http://192.168.50.75:9200 ,返回内容如下所示:

在这里插入图片描述

  • 至此编译构建elasticsearch6.1.2成功,在您编译构建elasticsearch的时候,希望本文能给您提供参考;

建议

欢迎关注阿里云开发者社区博客:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
电子书阅读分享《Elasticsearch全观测技术解析与应用(构建日志、指标、APM统一观测平台)》
电子书阅读分享《Elasticsearch全观测技术解析与应用(构建日志、指标、APM统一观测平台)》
|
18天前
|
存储 运维 监控
超越传统模型:从零开始构建高效的日志分析平台——基于Elasticsearch的实战指南
【10月更文挑战第8天】随着互联网应用和微服务架构的普及,系统产生的日志数据量日益增长。有效地收集、存储、检索和分析这些日志对于监控系统健康状态、快速定位问题以及优化性能至关重要。Elasticsearch 作为一种分布式的搜索和分析引擎,以其强大的全文检索能力和实时数据分析能力成为日志处理的理想选择。
57 6
|
15天前
|
人工智能
云端问道12期-构建基于Elasticsearch的企业级AI搜索应用陪跑班获奖名单公布啦!
云端问道12期-构建基于Elasticsearch的企业级AI搜索应用陪跑班获奖名单公布啦!
163 2
|
2月前
|
存储 缓存 自然语言处理
深度解析ElasticSearch:构建高效搜索与分析的基石
【9月更文挑战第8天】在数据爆炸的时代,如何快速、准确地从海量数据中检索出有价值的信息成为了企业面临的重要挑战。ElasticSearch,作为一款基于Lucene的开源分布式搜索和分析引擎,凭借其强大的实时搜索、分析和扩展能力,成为了众多企业的首选。本文将深入解析ElasticSearch的核心原理、架构设计及优化实践,帮助读者全面理解这一强大的工具。
147 7
|
6月前
|
JSON 监控 Java
Elasticsearch 8.X reindex 源码剖析及提速指南
Elasticsearch 8.X reindex 源码剖析及提速指南
83 0
|
3月前
|
消息中间件 监控 Kafka
Filebeat+Kafka+Logstash+Elasticsearch+Kibana 构建日志分析系统
【8月更文挑战第13天】Filebeat+Kafka+Logstash+Elasticsearch+Kibana 构建日志分析系统
159 3
|
3月前
|
机器学习/深度学习 自然语言处理 搜索推荐
构建智能搜索应用:Elasticsearch与自然语言处理的融合
【8月更文第28天】随着大数据和人工智能技术的发展,用户对搜索应用的需求已经从简单的关键词匹配转向了更加智能化、人性化的交互方式。本文将探讨如何利用Elasticsearch和自然语言处理(NLP)技术构建一个能够理解用户意图并提供精准搜索结果的智能搜索系统。
200 0
|
3月前
|
自然语言处理 Java 关系型数据库
ElasticSearch 实现分词全文检索 - SpringBoot 完整实现 Demo 附源码【完结篇】
ElasticSearch 实现分词全文检索 - SpringBoot 完整实现 Demo 附源码【完结篇】
44 0
|
5月前
|
存储 自然语言处理 网络协议
【elastic search】下载安装、使用教程
【elastic search】下载安装、使用教程
68 1
|
5月前
Elasticsearch下载
Elasticsearch下载
301 0