ELK 設置定時清理腳本清理索引
928
2025-04-01
微信原文:教你編譯調試elasticsearch 6.3.2源碼
前言
想深入理解 elasticsearch,閱讀它的源碼是很有必要的,一來可以了解它內部的具體實現,有助于調優,二來可以了解優秀開源項目的代碼架構,提高我們的代碼架構能力等
操作系統:win7
Elasticsearch 源碼版本: 6.3.2
JDK版本: 10.0.2
Gradle版本: 4.7
Intellij Idea版本: 2018.2
環境準備及工程導入
Elasticsearch 6.3.3需要JDK1.9編譯,否則后面步驟會報錯。
Java SE Downloads 地址:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
Elasticsearch github源碼托管地址:
https://github.com/elastic/elasticsearch.git
git?checkout?v6.3.2
也可直接下載源碼包,地址在 https://github.com/elastic/elasticsearch/releases
查看 elasticsearch\gradle\wrapper\gradle-wrapper.properties 發現如下配置:
distributionUrl=https://services.gradle.org/distributions/gradle-4.5-all.zip
Elasticsearch 6.3.2需要安裝gradle-4.5,官方-:
https://services.gradle.org/distributions/gradle-4.5-all.zip
注意:由于國內網速問題,為了加快速度,進行第4步操作
將下載的gradle-4.5-all.zip包放到 elasticsearch\gradle\wrapper 目錄下,
確保和 elasticsearch\gradle\wrapper\gradle-wrapper.properties 在同級目錄,
然后修改 elasticsearch\gradle\wrapper\gradle-wrapper.properties 配置如下:
distributionUrl=gradle-4.5-all.zip
國內下載國外倉庫的jar包速度慢,需要替換Maven地址,設置為本地或者國內可用的Maven倉庫。
需要修改下列文件的 maven URL 配置:
elasticsearch\benchmarks\build.gradle
elasticsearch\client\benchmark\build.gradle
修改源碼中上面build.gradle文件里面的repositories-maven-url的值,
配置為可用的倉庫地址,譬如修改為阿里云maven地址 http://maven.aliyun.com/nexus/content/groups/public/,修改示例如下:
buildscript?{
repositories?{
maven?{
url?'http://maven.aliyun.com/nexus/content/groups/public/'
}
}
dependencies?{
classpath?'com.github.jengelman.gradle.plugins:shadow:2.0.2'
}
}
在USER_HOME/.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
}
}
}
其中USER_HOME/.gradle/是自己的gradle安裝目錄,示例值:C:\Users\Administrator\.gradle,
如果沒有.gradle目錄,可用自己創建,或者先執行第7步,等gradle安裝后再回來修改。
上面腳本把url匹配到的倉庫都替換成了阿里云的倉庫,
如果有未匹配到的導致編譯失敗,可用自己仿照著添加匹配條件。
windows運行cmd,進入DOS命令行,然后切換到elasticsearch源碼的根目錄,執行如下命令,把elasticsearch編譯為 idea 工程:
gradlew?idea
編譯失敗則按照錯誤信息解決問題,可用使用如下命令幫助定位問題:
gradlew?idea?-info
gradlew?idea?-debug
一般是Maven倉庫地址不可用導致jar包無法下載,從而編譯失敗,此時請參考步驟5和6修改相關的倉庫地址。
編譯成功后打印日志:
BUILD?SUCCESSFUL?in?1m?23s
idea 中 File -> New Project From Existing Sources 選擇你下載的 Elasticsearch 根目錄,然后點 open ,之后 Import project from external model -> Gradle , 選中 Use auto-import, 然后就可以了
導入進去后,gradle 又會編譯一遍,需要等一會,好了之后如下:
運行,開始 solve error 模式
在 elasticsearch/server/src/main/org/elasticsearch/bootstrap 下找到Elasticsearch的啟動類 Elasticsearch.java,打開文件,右鍵 Run Elasticsearch.main(),運行main方法
1、 報錯如下:
ERROR:?the?system?property?[es.path.conf]?must?be?set
這是需要配置 es.path.conf 參數,我們先在 elasticsearch 源碼目錄下新建一個 home 目錄,然后在 https://www.elastic.co/downloads/elasticsearch 下載一個同版本號的 Elasticsearch6.3.2 發行版,解壓,將 config 目錄拷貝到 home 目錄中
然后打開 Edit Configurations,在 VM options 加入如下配置:
-Des.path.conf=D:\elasticsearch-6.3.2\home\config
再次運行 Run Elasticsearch.main()
2、報錯如下:
Exception?in?thread?"main"?java.lang.IllegalStateException:?path.home?is?not?configured
at?org.elasticsearch.env.Environment.
...
需要配置 path.home 這個參數,在 VM options 中添加如下配置:
-Des.path.home=D:\elasticsearch-6.3.2
再次RUN
3、報錯如下:
2018-08-22?15:07:17,094?main?ERROR?Could?not?register?mbeans?java.security.AccessControlException:?access?denied?("javax.management.MBeanTrustPermission"?"register")
...
Caused?by:?java.nio.file.NoSuchFileException:?D:\elasticsearch-6.3.2\modules\aggs-matrix-stats\plugin-descriptor.properties
...
在 VM options 中把 path.home 的值修改為如下:
-Des.path.home=D:\elasticsearch-6.3.2\home
然后把 ES6.3.2 發行版中的 modules 文件夾復制到 home 目錄下,然后再次RUN
4、報錯如下:
2018-08-22?15:12:29,876?main?ERROR?Could?not?register?mbeans?java.security.AccessControlException:?access?denied?("javax.management.MBeanTrustPermission"?"register")
...
在 VM options 中加入
-Dlog4j2.disable.jmx=true
1、2、3、4 的配置最終如下:
再次RUN
5、報錯如下:
[2018-08-23T00:53:17,003][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler]?[]?fatal?error?in?thread?[main],?exiting
java.lang.NoClassDefFoundError:?org/elasticsearch/plugins/ExtendedPluginsClassLoader
at?org.elasticsearch.plugins.PluginsService.loadBundle(PluginsService.java:632)?~[main/:?]
at?org.elasticsearch.plugins.PluginsService.loadBundles(PluginsService.java:557)?~[main/:?]
at?org.elasticsearch.plugins.PluginsService.
at?org.elasticsearch.node.Node.
at?org.elasticsearch.node.Node.
at?org.elasticsearch.bootstrap.Bootstrap$5.
at?org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:213)?~[main/:?]
at?org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:326)?~[main/:?]
at?org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:136)?~[main/:?]
at?org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:127)?~[main/:?]
at?org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86)?~[main/:?]
at?org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)?~[main/:?]
at?org.elasticsearch.cli.Command.main(Command.java:90)?~[main/:?]
at?org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:93)?~[main/:?]
at?org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:86)?~[main/:?]
Caused?by:?java.lang.ClassNotFoundException:?org.elasticsearch.plugins.ExtendedPluginsClassLoader
at?jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)?~[?:?]
at?jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:190)?~[?:?]
at?java.lang.ClassLoader.loadClass(ClassLoader.java:499)?~[?:?]
...?15?more
解決方法: 打開 IDEA Edit Configurations ,給 Include dependencies with Provided scope 打上勾即可解決,很簡單吧!!
繼續RUN,又來一個 Exception
6、報錯如下:
[2018-08-23T01:13:38,551][WARN?][o.e.b.ElasticsearchUncaughtExceptionHandler]?[]?uncaught?exception?in?thread?[main]
org.elasticsearch.bootstrap.StartupException:?java.security.AccessControlException:?access?denied?("java.lang.RuntimePermission"?"createClassLoader")
at?org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:140)?~[main/:?]
at?org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:127)?~[main/:?]
at?org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86)?~[main/:?]
at?org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)?~[main/:?]
at?org.elasticsearch.cli.Command.main(Command.java:90)?~[main/:?]
at?org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:93)?~[main/:?]
at?org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:86)?~[main/:?]
Caused?by:?java.security.AccessControlException:?access?denied?("java.lang.RuntimePermission"?"createClassLoader")
at?java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)?~[?:?]
at?java.security.AccessController.checkPermission(AccessController.java:895)?~[?:?]
at?java.lang.SecurityManager.checkPermission(SecurityManager.java:335)?~[?:?]
at?java.lang.SecurityManager.checkCreateClassLoader(SecurityManager.java:397)?~[?:?]
...
Exception:?java.security.AccessControlException?thrown?from?the?UncaughtExceptionHandler?in?thread?"Thread-2"
這個問題也找了挺久,最終才發現解決方法(兩種):
第一種: 在 home/config 目錄下新建 java.policy 文件,填入下面內容
grant?{
permission?java.lang.RuntimePermission?"createClassLoader";
};
然后在 VM options 加入 java.security.policy 的設置,指向該文件即可
-Djava.security.policy=D:\elasticsearch-6.3.2\home\config\java.policy
第二種: 就是在 %JAVA_HOME%/conf/security 目錄下(JDK10是這個路徑,之前的版本不確定),我的目錄是 C:\Program Files\Java\jdk-10.0.2\conf\security,打開 java.policy 文件,在 grant 中加入下面這句,賦予權限
permission?java.lang.RuntimePermission?"createClassLoader";
效果如下:
再RUN,這次可終于運行起來了!!!
來看一下效果,瀏覽器訪問 http://localhost:9200/
瀏覽器訪問 http://localhost:9200/_cat/health?v
一切正常,終于可以愉快的 DEBUG 源碼啦!!!
另一種源碼調試方式:遠程調試
如果上面第五個報錯之后解決不了無法繼續進行,可以選擇這種方式:
在 Elasticsearch 源碼目錄下打開 CMD,輸入下面的命令啟動一個 debug 實例
gradlew?run?--debug-jvm
如果啟動失敗可能需要先執行 gradlew clean 再 gradlew run --debug-jvm 或者 先退出 IDEA
在 IDEA 中打開 Edit Configurations,添加 remote
配置 host 和 port
點擊 debug,瀏覽器訪問 http://localhost:9200/,即可看到ES返回的信息
隨機調試一下, 打開 elasticsearch/server/src/main/org/elasticsearch/rest/action/cat 下的 RestHealthAction 類,在第 54 行出設置一個斷點,然后瀏覽器訪問 http://localhost:9200/_cat/health,可以看到斷點已經捕獲到該請求了
運行成功,可以開始設置斷點進行其他調試
其他可能遇到的問題
1. 錯誤信息如下
JAVA8_HOME?required?to?run?tasks?gradle
配置環境變量 JAVA8_HOME,值為 JDK8 的安裝目錄
2. 錯誤信息如下
[2018-08-22T13:07:23,197][INFO?][o.e.t.TransportService???]?[EFQliuV]?publish_address?{10.100.99.118:9300},?bound_addresses?{[::]:9300}
[2018-08-22T13:07:23,211][INFO?][o.e.b.BootstrapChecks????]?[EFQliuV]?bound?or?publishing?to?a?non-loopback?address,?enforcing?bootstrap?checks
ERROR:?[1]?bootstrap?checks?failed
[1]:?initial?heap?size?[268435456]?not?equal?to?maximum?heap?size?[4273995776];?this?can?cause?resize?pauses?and?prevents?mlockall?from?locking?the?entire?heap
[2018-08-22T13:07:23,219][INFO?][o.e.n.Node???????????????]?[EFQliuV]?stopping?...
2018-08-22?13:07:23,269?Thread-2?ERROR?No?log4j2?configuration?file?found.?Using?default?configuration:?logging?only?errors?to?the?console.?Set?system?property?'log4j2.debug'?to?show?Log4j2?internal?initialization?logging.
Disconnected?from?the?target?VM,?address:?'127.0.0.1:5272',?transport:?'socket'
在 Edit Configurations 的 VM options 加入下面配置
-Xms2g
-Xmx2g
參考文檔:
Eclipse導入Elasticsearch源碼
Elasticsearch源碼分析—環境準備(一)
渣渣菜雞的 ElasticSearch 源碼解析 —— 環境搭建
教你如何在 IDEA 遠程 Debug ElasticSearch
后記
歡迎評論、轉發、分享,您的支持是我最大的動力
更多內容可訪問我的個人博客:http://laijianfeng.org
關注【小旋鋒】微信公眾號,及時接收博文推送
Maven Elasticsearch
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。