ES 8.x的全程编译实践与问题解决

慈云数据 2024-04-01 技术支持 42 0

摘要

本文整理和记录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

    编译自动化

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon