摘要
本文整理和记录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"
}