前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Elasticsearch6.1.2源码下载和编译构建

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

作者头像
程序员欣宸
发布2019-05-29 17:15:02
1.1K0
发布2019-05-29 17:15:02
举报
文章被收录于专栏:实战docker

为了深入学习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账号:

代码语言:javascript
复制
groupadd admin && useradd -d /home/admin -g admin -m admin

下载源码

  1. 源码下载地址是:https://github.com/elastic/elasticsearch/releases
  2. 上述网站中有各个版本的release,找到我们需要 的6.1.2版本,然后下载压缩包,如下图:
  1. 将源码下载到Ubuntu电脑上,执行tar -zxf elasticsearch-6.1.2.tar.gz解压后,得到新的文件夹elasticsearch-6.1.2;

修改源码

为了证明修改的源码可以正常构建和运行,我们来修改一个java文件,在里面打印一些日志;

  1. 进入前面解压得到的文件夹elasticsearch-6.1.2;
  2. 打开文件core/src/main/java/org/elasticsearch/node/Node.java,增加一个静态方法,作用是打印当前线程堆栈情况,内容如下:
代码语言:javascript
复制
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************************************************************");
    }
  1. 找到Node.java的如下方法:
代码语言:javascript
复制
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类实例的调用堆栈:

代码语言:javascript
复制
printTrack(logger, "Here is stack of Node instance");

保存好再退出,接下来可以编译了;

编译构建

  1. 进入文件夹elasticsearch-6.1.2,执行命令./gradlew assemble即可开始编译,下载依赖会消耗大量时间,因此请耐心等待,编译过程中CPU占用略高,如下图:
  1. 大约10多分钟后,编译构建成功,控制台如下所示:
代码语言:javascript
复制
...
> 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
  1. 编译完成后,进入目录elasticsearch-6.1.2/distribution/tar/build/distributions可以见到构建成功的结果:elasticsearch-6.1.2-SNAPSHOT.tar.gz,这就是可用的elasticsearch-6.1.2;
  2. 构建结果文件以SNAPSHOT作为文件名后缀,如果不想要此后缀,在编译的时候改用以下命令即可:
代码语言:javascript
复制
./gradlew assemble -Dbuild.snapshot=false

验证构建的elasticsearch是否可用

  1. 解压elasticsearch-6.1.2-SNAPSHOT.tar.gz到一个目录下;
  2. 进入目录elasticsearch-6.1.2-SNAPSHOT/config,修改network.host的配置为0.0.0.0,如下图:
  1. 进入目录elasticsearch-6.1.2-SNAPSHOT/bin,执行./elasticsearch命令启动服务;
  2. 在控制台可以看到新增的代码打出的日志,将Node类的调用堆栈打印出来了,我们也借此机会了解到elasticsearch启动时的涉及到的关键类:
代码语言:javascript
复制
[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
************************************************************
  1. 我的ubutnu电脑的IP地址是192.168.50.75,因此用浏览器访问此地址:http://192.168.50.75:9200 ,返回内容如下所示:

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

建议

除了修改和编译源码,通过IntelliJ IDEA远程调试elasticsearch也是有效的学习手段,推荐您参考文章《IntelliJ IDEA远程调试Elasticsearch6.1.2》

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年04月20日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境信息
  • 账号问题
  • 下载源码
  • 修改源码
  • 编译构建
  • 验证构建的elasticsearch是否可用
  • 建议
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档