为了验证我的es6.6.0是否也存在:关于阿里发现es7.2及以上版本出现“Master卡顿、创建/删除索引耗时过长”的问题,
内核调优 | 如何提升Elasticsearch master调度性能40倍。由于es各大版本差异较大,调试源码可以更深地学习源码,参考以下三文:
参考一:windows系统下安装多版本jdk并切换;
参考二:win10上编译并使用idea调试Elasticsearch 6.3.2源码;
参考三:elasticsearch-7.x源码编译
鉴于此,本文针对我个人的如下环境进行总结:
windows10、原jdk1.8.0_102欲切换为jdk-11.0.6、idea2018.01(由于编译命令是idea,故无法导入eclipse)、maven-3.5.3、Git2.21.0、elasticsearch-6.6.0、gradle-5.0
下载elasticsearch-6.6.0源码并编译
克隆源码:
git clone https://github.com/elastic/elasticsearch.git
git checkout v6.6.0
或者手动下载源码包:https://github.com/elastic/elasticsearch/releases
编译命令:gradlew idea
即在安装GIt后在E:\Workspace\ideaClone目录下鼠标右键“Git Bash Here”进入后操作如下:
首先编译报错显示jdk至少需11版本,另外为加快编译从源码elasticsearch\gradle\wrapper\gradle-wrapper.properties中会发现配置项:
distributionUrl=https://services.gradle.org/distributions/gradle-5.0-all.zip
可手动访问此网址以下载此gradle-5.0的压缩包并放至elasticsearch/gradle/wrapper/目录下。再必须放至此目录的前提下,修改上述配置项为:
distributionUrl=gradle-5.0-all.zip
下面进入第二环节,安装es所要求的环境。
登录Oracle官网后下载windows系统上elasticsearch-6.6.0对应的jdk11,我下载的是“jdk-11.0.6_windows-x64_bin.exe”尽量安装到原jdk1.8目录所在的同一个目录。解压gradle的压缩包。然后在“环境变量”处配置如下图:
注意验证时必须在新打开的cmd中(以前的cmd可以不关闭,但必须新打开新的cmd以进入新的黑框):
java -version
gradle -v
但是执行 java -version依然会看到老版本JDK1.8的信息,解决方案为删除C:\ProgramData\Oracle\Java\javapath\目录下的三个文件:java.exe、javaw.exe、javaws.exe,注意:当我们把该目录下文件都删除掉后,Path路径下的环境变量C:ProgramDataOracleJavajavapath会自动消失,很神奇啊!!!再次打开“新”的cmd就可以看到
java version "11.0.6" 2020-01-14 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.6+8-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.6+8-LTS, mixed mode)
使用上述编译命令再次编译以让其在C:\Users\本笔记本administrator权限的用户名\.gradle\目录,在该目录下用绿化版软件Everything-1.4.1搜索出一份后缀名为.gradle的文件重命名为init.gradle编辑内容为
allprojects{
repositories {
def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/'
all {
ArtifactRepository repo ->
if (repo instanceof MavenArtifactRepository) {
def url = repo.url.toString()
if (url.startsWith('https://repo.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
remove repo
}
}
}
maven {
url REPOSITORY_URL
}
}
}
分别在elasticsearch-7.1\buildSrc\build.gradle、elasticsearch-7.1\distribution\packages\build.gradle、elasticsearch-7.1\plugins\repository-s3\build.gradle三个文件根据如下内容如下。注意:若是本win10笔记本上有VPN可访问外网,可不修改此三个文件。
maven {
url "http://maven.aliyun.com/nexus/content/groups/public/"
}
分别修改成:
编译es源码和下面用“参考二”文中方式用idea打开后自动编译时遇到“参考三”文中的:Must specify license and notice file for project,如下图:
解决办法同“参考三”文中:
将elasticsearch\buildSrc\src\main\groovy\org\elasticsearch\gradle\BuildPlugin.groovy文件第908行,在需要指定licenseFile所抛出的异常将其注释掉即可
虽我很顺利编译成功,但若网友遇到坎坷,可参考“参考三”文中的
定位问题的命令:
gradlew idea -info
gradlew idea -debug
针对依赖项修改下载源:
elasticsearch\benchmarks\build.gradle
elasticsearch\client\benchmark\build.gradle
修改源码中上面build.gradle文件里面的repositories-maven-url的值为阿里源的仓库地址:
buildscript {
repositories {
maven {
url 'http://maven.aliyun.com/nexus/content/groups/public/'
}
}
dependencies {
classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.2'
}
}
注意:之所以我没提前配置,是因为我压根没在elasticsearch-6.6.0源码中此build.gradle文件中找到buildscript脚本,亲自经验证参考二文中楼主的elasticsearch-6.3.2版本中此文件确实有此脚本。
若按照参考二文中“idea 导入elasticsearch工程”方式在刚打开idea后gradle再次编译时报错信息显示依然识别的是jdk1.8(切换前的jdk版本)并且还有另一处诡异的异常。经查,好像是因为我在未卸载jdk1.8和jre1.8的前提下,安装jdk1.11时并未自动进入jre1.11的环节(我清晰地记得安装jdk1.8时是自动进入的),导致按照网友“解决方案2”所指的位置:
果断放弃后采用“参考三”文中的方式:
双击编译后所提示的此ipr文件,便自动导入至idea工程中,多么干净利索!!!
接下来正式进入调试阶段:打开elasticsearch/server/src/main/org/elasticsearch/bootstrap
下Elasticsearch的启动类 Elasticsearch.java
,打开文件后右键Run,
然后按照“参考二”文中的1、2、3、4、5、6共六步骤一一配置即可。其idea此工程运行时参数为:
本文题记所指阿里文中所述的“对ES7.4.0的代码做了简单的修改、打包和测试”并贴出的两张图。目前我在elasticsearch-6.6.0中定位到的地方是es6.6.0源码server子模块下org.elasticsearch.cluster.routing.RoutingNode.java类修改前的第146行:
关于修改代码后报错问题,个人能力有限,欢迎交流,待解决!!!