准备开始深入 学习elasticsearch,对于深入一门技术,自己最喜欢的就是通过源码来学习,一方面能够从源码学习到架构知识,另外还能把es理论和实现相结合,更加深刻的理解es的构造。
不过es从我源码下载到成功启动,真的花费了很长时间,而且官网上(源码目录中CONTRIBUTING.md有部分介绍)以及网络上对应的学习资料也比较少。也可能搜索的关键字不当,直到最近才构建成功。这里也是做一个启动成功后的记录。
1.环境准备
- 操作系统:win10
- Elasticsearch 源码版本: 7.3.0
- JDK版本: 11
- Intellij Idea版本: 2019.3
现在这个版本还算比较新,不知道你们看到这篇文章的时候 jdk是否上20了,哈哈哈哈。。。
2. elasticsearch下载
- 使用git先把源代码拉下来
git clone https://github.com/elastic/elasticsearch.git
2)把对应的发布代码也给下载下来
下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch;至于为什么会下载后面会用能得到。
3.构建
由于es使用的gradle来构建,说实话我们可以下载gradle来构建,也可以让项目自己下载gradle,我其实就是让项目自己下载的gradle,因为我自己也用的不太熟。
先说在这里我犯了一个很大的错误,当时我从源代码拉取下来后,默认是maser的代码,那么我当时想的就是切换到对应的版本7.3,因为平时项目用的比较多的就是切换分支,这个问题也是导致我一直没启动起来的项目的重大原因。实际上es的发布版本都是基于tag来做的,这个就需要大家去了解下git的branch和tag的区别了。大家这里一定要搞对,当时我切换分支后发现有些类还没有,真是气煞人也。
继续。
1) 切换tag
git checkout v7.3.0
2) Intellij Idea导入项目
记住新的版本通过在源码目录中执行 gradle idea
是不支持的,会抛出异常给你。
此时用Intellij idea 导入后会自动匹配gradle下载对应的版本,(具体的版本在./gradle/wrapper/gradle-wrapper.propertiesde distributionUrl中指明)
这里你会发现很多jar包下载超级慢,所以这里需要设置镜像下载,网上有说修改当前项目中的下载镜像,我是直接修改全局的gradle下载地址
在USER_HOME/.gradle/下面创建新文件 init.gradle,输入下面的内容并保存。这里的脚本把url匹配到的仓库都替换成了阿里云的仓库,
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
}
}
}
再次更新jar包导入,你会发现抛出了一个错误,内容大概会有下面的内容:
repository [${repository.name}] on project with path [${project.path}] is using http for artifacts on
这里也很明显不支持http,就是我们上面的镜像下载导致的。我们直接项目搜索出来抛异常的位置:
BuildPlugin.groovy脚本构建的时候有一个校验,然后我们直接给注释掉就ok了。
private static void assertRepositoryURIUsesHttps(final ArtifactRepository repository, final Project project, final URI uri) {
if (uri != null && uri.toURL().getProtocol().equals("http")) {
// throw new GradleException("repository [${repository.name}] on project with path [${project.path}] is using http for artifacts on [${uri.toURL()}]")
}
}
然后再次构建,就发现成功了。
4.启动
我们先找到启动类org.elasticsearch.bootstrap.Elasticsearch,你会发现启动错误一堆有一堆,不过也不用担心可以一个一个的解决。这里我就直接贴需要做的事情了,具体的原理我还未探究。详细的来自参考网络
-
1)首先在当前目录中新建home目录,然后将我们下载的发布版本目录中config目录和module目录都复制到我们新建的home目录中
i: 同时在config目录中新建文件java.policy并添加内容grant { permission java.lang.RuntimePermission "createClassLoader"; };
ii:在elasticsearch.yml中放开注释,不然启动没有节点名称会报空指针异常
node.name: node-1
-
2)配置vm-option
这里的D:\software\ELK\es-sound-source\elasticsearch
指当前项目的位置-Des.path.conf=D:\software\ELK\es-sound-source\elasticsearch\home\config -Des.path.home=D:\software\ELK\es-sound-source\elasticsearch\home -Dlog4j2.disable.jmx=true -Djava.security.policy=D:\software\ELK\es-sound-source\elasticsearch\home\config\java.policy
另外启动前勾选上如下图中的√
- 3) 再次启动Elasticsearch
这次你就会发现你的服务启动了
....
[2020-06-09T17:32:43,106][INFO ][o.e.h.AbstractHttpServerTransport] [node-1] publish_address {127.0.0.1:9200}, bound_addresses {127.0.0.1:9200}, {[::1]:9200}
[2020-06-09T17:32:43,107][INFO ][o.e.n.Node ] [node-1] started
本地服务访问一下http://localhost:9200/
{
"name": "node-1",
"cluster_name": "elasticsearch",
"cluster_uuid": "TBc-L_IsTryvf6xzsoBqFQ",
"version": {
"number": "7.3.0",
"build_flavor": "unknown",
"build_type": "unknown",
"build_hash": "Unknown",
"build_date": "Unknown",
"build_snapshot": true,
"lucene_version": "8.1.0",
"minimum_wire_compatibility_version": "6.8.0",
"minimum_index_compatibility_version": "6.0.0-beta1"
},
"tagline": "You Know, for Search"
}
或者访问一下http://localhost:9200/_cat/health?v
差不多这里就结束了,大致方向就是这样,如果有疑问请留言一起探讨。
上面的不少内容参考网络上