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行:

關於修改代碼後報錯問題,個人能力有限,歡迎交流,待解決!!!

 

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