《Elasticsearch 源码解析与优化实战》第2章 准备编译和调试环境

Posted 宝哥大数据

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Elasticsearch 源码解析与优化实战》第2章 准备编译和调试环境相关的知识,希望对你有一定的参考价值。

由于当时没有截图,本文是转载自网络。

第2章 准备编译和调试环境

2.1 编译源码

2.1.1 准备JDK和Gradle

Elasticsearch是Java语言编写的。运行和编译Elasticsearch时,对JDK版本的选择请参考手册,地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/_installation.html。推荐使用Oracle的JDK版本。本书使用的JDK版本为1.8.0_121。JDK的安装方式不在这里讨论,请读者参考Oracle官方网站。

从Elasticsearch 5.0开始,构建工具由Maven更改为Gradle,本书使用的Gradle版本为4.6,安装方式请参考官方网站。

2.1.2 下载源代码

Elasticsearch的代码托管于GitHub,可以“git clone”最新的Master分支或某个tag,也可以到Releases或Tags下载各个版本的代码包:https://github.com/elastic/elasticsearch/releases。解压源码包到自己的目录,以v6.1.2版本为例:

tar -xzvf elasticsearch-6.1.2.tar.gz

2.1.3 编译项目,打包

本书以Linux平台编译为例。切换到解压后的源码目录,执行编译:

cd elasticsearch-6.1.2
./gradlew assemble

编译完成后,系统打印“BUILD SUCCESSFUL”代表编译成功。完整的打包文件位于./distribution目录,包含tar、zip等多种格式的包。以tar为例,包路径为./distribution/tar/build/distributions/ elasticsearch-6.1.2-SNAPSHOT.tar.gz。默认带有“SNAPSHOT”后缀,如果想去掉“SNAPSHOT”,则可以在编译时添加-Dbuild.snapshot=false,即:

./gradlew assemble -Dbuild.snapshot=false

Elasticsearch的版本号由四位组成,格式为:

 主版本.次版本.修正版本.构建版本

但是最后一位“构建版本”不出现在构建后的包名称中。默认情况下每个号码均不会大于100。当完成对代码的修改,编译、发布时要修改版本号,添加自己的版本号,可以在原修正版本或构建版本的基础上增加。与修改版本号相关的两个文件:buildSrc/version.properties和./core/src/main/java/org/elasticsearch/Version.java。文件位置可能因版本不同而有所不同。

2.1.4 将工程导入IntelliJ IDEA

本书使用的IDE以IntelliJ IDEA 2017.3(后续简称IDEA)为例。进入Elasticsearch源码根目录,执行:

gradle idea

生成IntelliJ的项目文件,正常完成会显示“BUILDSUCCESSFUL”。

首先配置SDK。打开IntelliJ IDEA,在欢迎界面右下角选择“Configure→Project Defaults→Project Structure”,弹出如下图所示的界面。

在Project SDK下拉列表中确认JDK的版本,必要时选择“New→JDK”,选择JDK Home目录,添加正确的JDK。

回到IntelliJ IDEA欢迎界面,选择“Import Project”,选择Elasticsearch-6.1.2目录,单击“Open”,在Import Project界面选择“Gradle”,如下图所示。

单击“Next”,设置工程名称,并确认Grande home和Grande JVM配置正确,如下图所示。

单击完成按钮,待后台任务运行完,工程导入完毕。

2.2 调试Elasticsearch

2.2.1 本地运行、调试项目

在IDE环境中运行可能会遇到很多问题,大部分问题都比较浅显且容易处理,有一些较为罕见的问题和Elasticsearch代码版本、IDE版本、JDK有关。对于初学者来说,不要在这些问题上占用太长时间,否则容易让人丧失学习的动力。

在 IntelliJ IDEA 菜单中选择“Run→Edit Configurations”,单击左侧的加号“+”,选择“Application”,在弹出的配置界面中填写相关配置,如下图所示。

  • Name:为当前配置取一个名字,此处命名为local,以区别以后的远程调试。
  • Main class:填写org.elasticsearch.bootstrap.Elasticsearch。
  • Use classpath of module:对于本书使用的版本来说,填写core_main,不同版本可能会有所不同。
  • VM options:填写内容为
    • -Des.path.home=/Users/xx-so/Documents/mybook/eshome -Des.path.conf=/Users/xx- so/Documents/mybook/eshome/config -Xms1g -Xmx1g -Dlog4j2. disable.jmx=true -Djava.security.policy=/Users/xx-so/Documents/mybook/eshome/config/elasticsearch.policy

在解释上述选项之前,我们需要先为调试环境准备运行时要用的eshome目录,Elasticsearch需要从其中加载模块、读取配置,写入数据和日志。在你的环境上选择一个位置建立eshome目录,名称可以任意。然后复制必要的模块和配置文件到该目录中,可以选择从对应版本的官方二进制包中复制,也可以将上一步编译打包的软件包解压,本书使用后者。切换到源码根目录,执行:

cd distribution/zip/build/distributions/
unzip elasticsearch-6.1.2.zip
cd elasticsearch-6.1.2
cp -r config modules plugins  /Users/xx-so/Documents/mybook/eshome

复制完上述文件之后,现在看一下VM options选项,如下表所示。

现在可以单击“运行”或“调试”按钮让程序在IDE中运行起来了!ES可以单节点运行,暂时不用调节任何配置。

2.2.2 远程调试

除了在本地环境调试ES,有时需要远程调试某个节点。分布式系统总会遇到很多千奇百怪的问题,很多时候问题无法复现,或者某种问题只出现在特定环境中。在排查问题的过程中,除了查看重要的日志,远程调试节点也是一种不错的手段。

远程调试时,需要保证本地代码与远程环境运行的代码版本一致。在 IDEA 菜单中重新单击“Run→EditConfigurations”,单击左侧的加号“+”,选择“Remote”,弹出如下图所示的配置界面。

配置名称此处命名为remote,复制“Command linearguments for running remote JVM”下的JVM参数到远程节点的jvm.options文件中:

agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

重启远程节点,成功后日志信息中会有“Listening fortransport dt_socket at address: 5005”信息。在Host中填写远程调试对象的IP地址,单击“OK”按钮。

单击Debug启动调试,控制台输出:

Connected to the target VM, address: '10.132.0.20:5005', transport: 'socket'

表示连接成功,接下来在本地代码上设置断点,远程节点运行到相应的逻辑就会停住,接下来就和本地调试一样。如果需要调试启动过程,则可以设置suspendcy,让程序等待调试器连接后再开始执行。

之后就在IDEA工具栏“Select Run/Debug Configuration”下拉框中选择调试本地还是远程节点,如下图所示。

远程调试节点时,停止调试不会终止远程节点进程。

关注我的公众号【宝哥大数据】,更多干货。。。

以上是关于《Elasticsearch 源码解析与优化实战》第2章 准备编译和调试环境的主要内容,如果未能解决你的问题,请参考以下文章

《Elasticsearch 源码解析与优化实战》第19章:搜索速度优化

《Elasticsearch 源码解析与优化实战》第19章:搜索速度优化

《Elasticsearch 源码解析与优化实战》第18章:写入速度优化

《Elasticsearch 源码解析与优化实战》第18章:写入速度优化

《Elasticsearch 源码解析与优化实战》样章-第 6 章 数据模型

《Elasticsearch 源码解析与优化实战》第9章:Search流程