win10上编译elasticsearch-6.6.0并用idea调试以及修改源码以解决Master卡顿、创建/删除索引耗时过长的问题

题记


为了验证我的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

一、预编译es源码

下载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所要求的环境。

二、切换jdk并安装gradle

登录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)

三、编译es源码

使用上述编译命令再次编译以让其在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 导入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此工程运行时参数为:

成功运行启动类后,访问如下:

五、通过修改elasticsearch源码解决Master卡顿、创建/删除索引耗时过长的问题

本文题记所指阿里文中所述的“对ES7.4.0的代码做了简单的修改、打包和测试”并贴出的两张图。目前我在elasticsearch-6.6.0中定位到的地方是es6.6.0源码server子模块下org.elasticsearch.cluster.routing.RoutingNode.java类修改前的第146行:

关于修改代码后报错问题,个人能力有限,欢迎交流,待解决!!!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章