IDEA调试Elasticsearch源码


1、Mac上安装es


最近在调研Elasticsearch(后续简称es)的translog,在Mac上安装了es单机版和集群版本,这里推荐使用docker搭建,简单叙述下过程:
安装Docker环境
首先需要在Mac上安装Docker运行环境,这里推荐直接安装 docker-for-mac,安装完成并启动成功后Mac右上方会显示running

安装完docker-for-mac后,建议修改镜像源,默认镜像源拉取镜像太慢了。修改方式如下:依次点击Preferences -> Docker Engine

安装es单机版

  1. 拉取镜像,docker pull docker.elastic.co/elasticsearch/elasticsearch:7.12.0
  2. 启动容器,docker run –name es01-test -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” docker.elastic.co/elasticsearch/elasticsearch:7.12.0
  3. 当容器退出后,下次需要启动该容器,可以执行 docker ps -a 显示当前所有容器(docker ps显示运行时容器,-a会显示包括非运行在内所有容器),找到对应的container id名称,然后 docker start 891f7a68c705
    docker-ps

安装es集群版本

  1. 创建docker-compose.yml
    version: '2.2'
    services:
      es01:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.12.0
        container_name: es01
        environment:
          - node.name=es01
          - cluster.name=es-docker-cluster
          - discovery.seed_hosts=es02,es03
          - cluster.initial_master_nodes=es01,es02,es03
          - bootstrap.memory_lock=true
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
        ulimits:
          memlock:
            soft: -1
            hard: -1
        volumes:
          - data01:/usr/share/elasticsearch/data
        ports:
          - 9200:9200
        networks:
          - elastic
      es02:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.12.0
        container_name: es02
        environment:
          - node.name=es02
          - cluster.name=es-docker-cluster
          - discovery.seed_hosts=es01,es03
          - cluster.initial_master_nodes=es01,es02,es03
          - bootstrap.memory_lock=true
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
        ulimits:
          memlock:
            soft: -1
            hard: -1
        volumes:
          - data02:/usr/share/elasticsearch/data
        networks:
          - elastic
      es03:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.12.0
        container_name: es03
        environment:
          - node.name=es03
          - cluster.name=es-docker-cluster
          - discovery.seed_hosts=es01,es02
          - cluster.initial_master_nodes=es01,es02,es03
          - bootstrap.memory_lock=true
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
        ulimits:
          memlock:
            soft: -1
            hard: -1
        volumes:
          - data03:/usr/share/elasticsearch/data
        networks:
          - elastic
    
    volumes:
      data01:
        driver: local
      data02:
        driver: local
      data03:
        driver: local
    
    networks:
      elastic:
        driver: bridge
  2. 在同目录下执行 docker-compose up 创建集群
  3. 执行 curl -X GET “localhost:9200/_cat/nodes?v=true&pretty” 确认集群是否启动

2、IDEA编译es源码

环境准备:

  • JDK 16:版本要求可以参考CONTRIBUTING.md,es对jdk版本要求较高,建议直接使用最新版本,下载完成后,建议配置JAVA_HOME
  • IDEA 2021.1:低版本的IDEA貌似不太支持高版本的JDK,根据自己情况选择。
  • ElasticSearch 7.8.1代码分支:刚开始编译master分支代码和7.12.0一直有问题,后改成7.8.1版本
  • ElasticSearch 7.8.1服务端:建议下载服务端完整包,后续启动时候一些配置路径可以直接指向完整安装包中的目录
  • Gradle 7.0:下载完成后,建议配置GRADLE_HOME和PATH,最好修改gradle镜像源为阿里云,在 ~/.gradle目录创建 init.gradle 文件

github pull代码
es代码挺大的,第一次拉取很慢,后面从google应用商店下载了github加速插件,拉代码速度提升很明显。安装完成后,会有一个加速按钮

编译es代码

  1. 切换分支 git checkout v7.8.1
  2. 两种方式导入IDEA:我是使用第二种方式导入的,第一种一直报错。
    • cd到代码根目录,执行./gradlew idea,会下载6.5版本的gradle来编译源代码(或者执行gradle idea,直接使用之前环境准备配置的es版本),生成 IML, IPR, IWS 3个文件,然后导入 elasticsearch.ipr。
    • IDEA直接 File -> Open 打开es根目录的 build.gradle,然后等待编译源码

运行es代码
es启动类位于 :elasticsearch\server\src\main\java\org\elasticsearch\bootstrap\Elasticsearch.java

  1. ERROR: the system property [es.path.conf] must be set
    添加VM options: -Des.path.conf=/Users/dianping/Downloads/elasticsearch-7.8.1/config,这里可以直接指向成之前下载的es 7.8.1的config目录
  2. Exception in thread “main” java.lang.IllegalStateException: path.home is not configured
    添加VM options: -Des.path.home=/Users/dianping/Downloads/elasticsearch-7.8.1
  3. Exception in thread “main” java.lang.NullPointerException: Cannot invoke “String.hashCode()” because ““ is null
    直接注释**InternalSettingsPreparer.checkSettingsForTerminalDeprecation()**for循环代码,不影响启动
  4. ERROR Could not register mbeans java.security.AccessControlException: access denied (“javax.management.MBeanTrustPermission” “register”)
    添加VM options:-Dlog4j2.disable.jmx=true 禁用jmx
  5. java.security.AccessControlException: access denied (“java.lang.RuntimePermission” “createClassLoader”)
    创建java.policy文件,然后 -Djava.security.policy=/Users/dianping/Downloads/elasticsearch-7.8.1/config/java.policy
    grant {
    	permission java.lang.RuntimePermission "createClassLoader";
    };

解决上述问题后,es应该就能在IDEA中启动了,后续调试的话即可debug模式启动 Elasticsearch.java main函数


文章作者: 叶明
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 叶明 !
评论
 本篇
IDEA调试Elasticsearch源码 IDEA调试Elasticsearch源码
本文首先会介绍在Mac上如何通过docker来安装es单机版本和集群版本,然后重点叙述如何使用IDEA编译Elasticsearch源码并进行调试
2021-04-22
下一篇 
Mybatis如何从DAO到SQL Mybatis如何从DAO到SQL
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。在项目中通过配置不同的mapper和xml,然后即可方便的对数据库进行操作。对于Mybatis的使用方法大家应该都很熟悉,本文不再赘述,本文重点叙述Mybatis的原理,详细分析Mybatis如何完成从mapper到sql的转化过程
2021-04-03
  目录