ElasticSearch-7.8.0 源码编译调试 (详细)

原文链接:ElasticSearch-7.8.0 源码编译调试 (详细) - 知乎

ElasticSearch-7.8.0 源码编译调试 (详细)

Rejjie

一、准备工作

1. 编译工具-Gradle(本文使用: gradle-6.5-all.zip

1) 官网下载链接:https://services.gradle.org/distributions/
2) 有时候官网龟速,这里提供云盘
(链接:https://pan.baidu.com/s/1dVOPpxDh3JWjazrYsT8N9g  提取码:62w2)

2. ElasticSearch - 客户端

1) 官网下载链接:https://www.elastic.co/downloads/elasticsearch
2) 官网龟速,推荐华为云镜像:https://mirrors.huaweicloud.com/elasticsearch/

3. ElasticSearch - 源码包

1) github下载地址:https://github.com/elastic/elasticsearch/archive/v7.8.0.zip

4. Jdk-14 环境 Jdk-9 环境(供groovy使用)

1) jdk-14 -华为云镜像下载地址:https://mirrors.huaweicloud.com/openjdk/14/
2) jdk-9 官网下载地址:http://jdk.java.net/java-se-ri/9

5. Groovy - 3.0.5, 用于编译 ElasticSearch 源码包中的一些模块交互逻辑;

1) 官网下载地址:https://dl.bintray.com/groovy/maven/apache-groovy-sdk-3.0.5.zip

二、设置环境变量

1. Gradle环境变量

---- For Windows (操作路径)

1) 设置环境变量
右击此电脑 ——> 属性 ——> 高级系统设置 ——> 高级 ——> 环境变量
——> 'xxx'的用户变量 ——> 新建 ——> 变量名:GRADLE_HOME——>变量值:你的GRALDE安装目录完整路径 ——> 点 "确定"

2) 加入到系统环境变量 "PATH" 中
'xxx'的用户变量 ——> 选中 "PATH" 变量 ——> 点 "编辑" ——> 点 "新建" ——> 输入 "%GRADLE_HOME%\bin" ——> 点 "确定"

---- For Mac

打开 Teminal 终端,输入如下命令

echo "export GRADLE_HOME='你的GRADLE安装目录完整路径'\nexport PATH=\$GRADLE_HOME/bin:\$PATH\n" >> ~/.bash_profile
source ~/.bash_profile

2. Jdk-14 环境变量

变量名为 JAVA_HOME, 安装目录为上述你所下载的 Jdk-14 安装目录,设置思路同上。

3. Jdk-9 环境变量

为避免冲突,此环境变量名为 `JAVA9_HOME`,安装目录为上述下载的 `jdk-9` 安装目录,设置思路同上。

==注:此环境变量不需加入PATH中,在设置 Groovy 启动文件时再指定即可。==

4. Groovy 环境变量

1)变量名为 GROOVY_HOME, 安装目录为上述你所下载的Groovy安装目录,设置思路同上。
2)修改 GROOVY_HOME 中 bin 目录下的的启动脚本(Windows 为 startGroovy.bat,Linux 为 startGroovy)
   将脚本中的 JAVA_HOME 改为上述我们配置的 JAVA9_HOME

三、提速工作

1. Gradle 换源

编译ElasticSearch需要下载很多依赖包,而其中有很多包的站源是国外的,下载时比较慢。 因此需要给Gradle换成国内镜像源(本文使用阿里云镜像),提升依赖包下载速度。 在 GRADLE_HOME 目录中的 init.d 路径下,创建文件 init.gradle ,并贴上如下内容:


allprojects{
    repositories {
        def ALIYUN_REPOSITORY_URL = 'https://maven.aliyun.com/repository/public/'
        def ALIYUN_GRADLE_PLUGIN_URL = 'https://maven.aliyun.com/repository/gradle-plugin/'
        all { ArtifactRepository repo ->
            if(repo instanceof MavenArtifactRepository){
                def url = repo.url.toString()
                if (url.startsWith('https://repo1.maven.org/maven2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
                    remove repo
                }
                if (url.startsWith('https://jcenter.bintray.com/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
                    remove repo
                }
                if (url.startsWith('https://plugins.gradle.org/m2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GRADLE_PLUGIN_URL."
                    remove repo
                }
            }
        }
        maven { url ALIYUN_REPOSITORY_URL }
        maven { url ALIYUN_GRADLE_PLUGIN_URL }
    }
}

2. ElasticSearch 源码包换 Gradle 分发地址

打开你下载下来的 ElasticSearch 源码包,进入目录 gradle/wrapper。然后,重新将 GRADLE_HOME 打包成 gradle-6.5-all.zip,拷贝到该目录下。

随后,打开文件 gradle-wrapper.properties,如下:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
#distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip
distributionUrl=gradle-6.5-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionSha256Sum=c9910513d0eed63cd8f5c7fec4cb4a05731144770104a0871234a4edc3ba3cef

上述文件原计划的 distributionUrl 默认为官网下载地址。
意思是在编译源码初期,程序会去搜寻指定好的 gradle-6.5-all.zip 压缩文件,然后解压下载。
但官网有时下载特别慢,会导致编译第一步就卡壳了。

本文初已提供了 gradle-6.5-all.zip 的快速下载方式,便于使用。
所以这里并不需要再次进行下载,

因此在文件中指定 distributionUrl = gradle-6.5-all.zip,就在本地文件目录即可。
这样可以快速跳过编译前期漫长的下载 gradle-6.5-all.zip 的等待时间。

四、编译 ElasticSearch 源码

1. 用 IntelliJ Idea 打开 ElasticSearch 源码根目录中的 build.gradle 文件,如下图:

点击“Open as Project” 打开项目;

2. 打开后,根据如下图中操作,进入配置界面。

点“Import Gradle Project”

3. 如下图中进行配置,配置完成后,点 "OK" 。

4. 如下图中操作,进行源码编译。

5. 正在编译中,喝口茶,休息一会儿去吧;

6. 编译完成后的界面;

五、启动 ElasticSearch 源码

1. 本地启动源码

1) 创建一个 Java-Application 启动配置

2) 填写配置

VM options 如下:

-Des.path.home=E:\WorkSpace\JavaStudio\EStuido\Elastic-stack-7.8.0\client\elasticsearch-7.8.0-client-for-windows
-Des.path.conf=E:\WorkSpace\JavaStudio\EStuido\Elastic-stack-7.8.0\client\elasticsearch-7.8.0-client-for-windows\config
-Dlog4j2.disable.jmx=true
-Xmx4g
-Xms4g

其中,
-Des.path.home -- 指定上文中你所下载的 ElasticSearch 客户端安装路径;
-Des.path.conf -- 指定客户端安装路径中的配置路径;

3) 点 “Apply”,点 “OK”;

等等!!等等!!等等!!
在运行源码之前,还有一些小细节需要注意。

小细节1:默认安装的 Jdk-14 环境中没有足够权限构建类加载器的,这会导致ElasticSearch源码启动时报安全权限错误;


来,打开你所配置的 JAVA_HOME/conf/security/java.policy 文件,
在文件中的 grant 结构末尾加上以下权限指令:

permission java.lang.RuntimePermission "createClassLoader";
小细节2:记得在配置文件中设置 node.name, 不然会启动失败,报空指针错误;


ElasticSearch-7.8.0 在加载配置文件时,如果没有设置 node.name,程序会去获取系统中的HOSTNAME环境变量作为默认值,若系统中没有配置环境变量HOSTNAME,则获取到的值为空,导致在验参阶段时会跳出空指针错误。

因此,为避免该错误,可以对 -Des.path.conf 路径中的配置文件elasticsearch.yml,进行如下设置,以指定节点名:

# ---------------------------------- Cluster -----------------------------------
#
# Use a descriptive name for your cluster:
#
cluster.name: es-source-demo
#
# ------------------------------------ Node ------------------------------------
#
# Use a descriptive name for the node:
#
node.name: es-source-node

到这里,我宣布,ElasticSearch-7.8.0 源码启动前的所有工作准备完毕。

4) 启动源码。

来吧,展示。

点击右上角的绿色小三角,Run !

到这里,已经可以成功地以源码形式去运行 ElasticSearch 了。

下面再介绍一种远程源码调试方式。

2. 远程调试源码

1) 创建一个 Remote 远程启动配置

如上图配置

2) 调整 ElasticSearch 远程客户端 jvm.options 配置

在远程的 ElasticSearch 客户端 config 目录下的 jvm.options 文件加入 Jvm 的配置参数,如下:

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

然后在远程机器上把 ElasticSearch 客户端 Run 起来。启动命令如下:

./elasticsearch -d

3) 在 IntelliJ Idea 上,使用上述配置好的 Remote 启动配置,把源码跑起来。

六、小结

ElasticSearch 作为一个优秀的开源搜索引擎框架,已经得到互联网各大厂们的充分认可。无论是作为搜索引擎、日志系统等领域,都称得上是一个成熟的解决方案。

本文是在一个“实操者”的视角下完成的,所以你们会看到上文有很多细节,甚至对一些专业从业者来说有点“笨”的操作细节。本着“在实战过程中去思考”的学习理念,这些细节值得我们一步一步去推敲,直至了解一个“软件工程”的实战构建全貌。

笔者作为一个爱学习的技术菜鸟,希望能拥有一个“一边打断点,一边调试”环境,站在源码的角度,好好去窥探一下大牛们的代码思维,系统架构设计思路。通过调试源码的方式,一步步地去总结自身对分布式系统学习的一些知识。所以有了这篇文章,欢迎广大技术爱好者进行交流分享!

这是进行 ElasticSearch 源码分析的第一步,路漫漫,加油!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值