摘要
本文整理和记录ES 8.x的编译过程问题与解决方案,主要解决gradle下载问题以及国内源、Hadoop环境设置与hadoop附件缺失、编译时jdk版本指定、esql的compute超时报错、编译时警告导致编译失败等问题!
本地目录结构
. ├── build.sh ├── hadoop_deps ├── jdk21 ├── plat_json ├── snap_fix ├── source │ └── v8.11.4.tar.gz
build.sh是最后自己编写的自动化这个编译流程的脚本,在当前文档里不需要。
source里存放源码文件,其他见名知意。
源码下载
选择当前8.11的最后一个版本:
wget https://github.com/elastic/elasticsearch/archive/refs/tags/v8.11.4.tar.gz
附件下载与准备
jdk21
自己搜索下载和jdk 21版本,编译和运行时将使用该JDK(不要使用系统自带的Java):
# arm64版本 wget https://download.oracle.com/java/21/latest/jdk-21_linux-aarch64_bin.tar.gz # x86_64版本 wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.tar.gz
根据自己的需要,如果只需要编译一个系统架构的,只需要下载1个对应的jdk即可。
Hadoop dll
配置环境变量:
export HADOOP_HOME=/usr/hdp/3.0.1.0-187/hadoop export PATH=$HADOOP_HOME/bin:$PATH
在之前编译时发现即使是在Linux平台编译,源码中也是强制需要Windows相关的包。所以,本着能不改则不改的剃刀原则,搜索下载好以下文件:
- hadoop.dll
- hdfs.dll
- winutils.exe
## 下载地址可以参考: wget https://gitcode.com/cdarlint/winutils/blob/master/hadoop-3.1.0/bin/hadoop.dll wget https://gitcode.com/cdarlint/winutils/blob/master/hadoop-3.1.0/bin/hdfs.dll wget https://gitcode.com/cdarlint/winutils/blob/master/hadoop-3.1.0/bin/winutils.exe
注意,这些文件要放在Hadoop HOME的bin目录下。
网络类源码修改
由于gradle的初始地址网络连接失败或网速差,编译时一定要先修改gradle的下载地址:
cd source/elasticsearch-8.11.4 vim gradle/wrapper/gradle-wrapper.properties 修改保存: distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-8.5-all.zip
这样指定下载地址为国内的镜像源,感谢镜像服务提供者。
开始编译
环境基本信息
CentOS Linux release 7.4.1708 (Core) Linux 5.4.6-1.el7.elrepo.x86_64 CPU: Intel(R) Xeon(R) Gold 6130T CPU @ 2.10GHz
指定Gradle使用的jdk
必须指定,否则报错。
cd source/elasticsearch-8.11.4 vim gradle.properties # 按照以下内容修改,jdk位置改为自己下载解压的位置 # java homes resolved by environment variables org.gradle.java.installations.auto-detect=true org.gradle.java.home=/opt/ES8All/jdk21/amd/jdk-21.0.2
编译过程与问题
cd source/elasticsearch-8.11.4 ./gradlew :distribution:archives:linux-tar:assemble
下载gradle
过程记录1:这一步就是前面配置的下载地址,如果不改为国内地址很可能下载失败!
Downloading https://mirrors.cloud.tencent.com/gradle/gradle-8.5-all.zip ....................10%.....................20%.....................30%.....................40%.....................50%.....................60%....................70%.....................80%.....................90%.....
初始化过程
过程记录2:
Starting a Gradle Daemon (subsequent builds will be faster) 0% INITIALIZING [25s] > Evaluating settings > :build-tools > Resolve dependencies of :build-tools:classpath > jetty-bom-9.4.50.v20221201.pom > 4.7 KiB/17.2 KiB downloaded > IDLE > IDLE
配置过程
过程记录3:
> Task :build-tools-internal:compileJava Note: Some input files use or override a deprecated API. Note: Recompile with -Xlint:deprecation for details.
compute超时失败
过程记录4:
这是一个编译失败的坑(之前是编译成功的):x-pack:plugin Connect timed out。
A problem occurred configuring project ':x-pack:plugin:esql:compute'. > java.net.SocketTimeoutException: Connect timed out
尝试重试多次还是一样的报错,配置了根目录的依赖下载源后也报错:
vim source/elasticsearch-8.11.4/build.gradle repositories { mavenLocal() maven { url 'https://maven.aliyun.com/repository/public/' } mavenCentral() maven { url 'https://maven.aliyun.com/repository/gradle-plugin' } }
尝试2,刷新或gradle clean一下重试:
./gradlew build --refresh-dependencies ./gradlew :distribution:archives:linux-tar:assemble --stacktrace
尝试,3,在下载好的 gradle 中的 init.d 文件夹中新建一个 init.gradle 文件,配置以下信息:
allprojects { repositories { mavenLocal() maven { url 'https://maven.aliyun.com/repository/public/' } maven { url 'https://maven.aliyun.com/repository/central' } mavenCentral() } }
这样还是一样超时报错,估计不是网络的问题。
尝试4,其他版本的情况比较,重试了8.11.1和8.11.3以及8.11.4均为相同的报错!
我下载了8.12.2尝试,结果没有这个报错。因此,那8.11的编译问题仍然聚焦在esql的compute模块,通过对比文件差异,最后修改8.11的build文件解决(主要识别一下是否是大量改动)。
警告变Eroor
过程记录5:第二个坑,警告变Eroor,导致编译失败!
error: warnings found and -Werror specified Note: Some input files use or override a deprecated API. Note: Recompile with -Xlint:deprecation for details.
解决办法:
cd build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/ vim ElasticsearchJavaBasePlugin.java # 注释掉这一行,在约126行: compilerArgs.add("-Werror");
编译成功
过程记录6(ok,end):
distribution:archives:buildLinux > Resolve files of ...
编译成功:
编译产物的位置:
cd distribution/archives/linux-tar/build/distributions/
名字是:elasticsearch-8.11.4-SNAPSHOT-linux-x86_64.tar.gz。
编译结果试用
解压包:
tar zxf elasticsearch-8.11.4-SNAPSHOT-linux-x86_64.tar.gz cd elasticsearch-8.11.4-SNAPSHOT/
目录结构:
bin config jdk lib LICENSE.txt logs modules NOTICE.txt plugins README.asciidoc
启动运行:
cd elasticsearch-8.11.4-SNAPSHOT/ chown -R elastic:elastic ./ su elastic ./bin/elasticsearch # 以下是部分日志内容 Security is enabled Profiling is enabled starting ... bound_addresses {[::1]:9300}, {127.0.0.1:9300}
需要注意,ES 8的用户验证和HTTP加密均为默认强制开启,并自动生成一个30分钟有效的token用于让kibana连接。
访问一下
重置密码:
./bin/elasticsearch-reset-password -u elastic -i
后台访问或者页面访问,要输入密码:
curl -k -u elastic:密码 https://localhost:9200
返回值:
{ "name" : "worker", "cluster_name" : "elasticsearch", "cluster_uuid" : "ohgsgVIlTpyxgCU0iOoU3Q", "version" : { "number" : "8.11.4-SNAPSHOT", "build_flavor" : "default", "build_type" : "tar", "build_hash" : "unknown", "build_date" : "2024-03-19T00:46:56.182189965Z", "build_snapshot" : true, "lucene_version" : "9.8.0", "minimum_wire_compatibility_version" : "7.17.0", "minimum_index_compatibility_version" : "7.0.0" }, "tagline" : "You Know, for Search" }
Todo
源码修改编译
gradle离线编译ES
编译自动化