【Elasticsearch 5.6.12 源码】——【1】源代码调试环境搭建
版权声明:本文为博主原创,转载请注明出处!
简介
本文主要解决以下问题:
1、从何处以及如何下载Elasticsearch 5.6.12的源代码?
2、如何将源代码导入到IntelliJ IDEA中进行编辑?
3、如何在IDEA中运行并调试Elasticsearch的源代码?
软件环境
本文写作时在Windows 7
系统上搭建了源代码调试环境,工作中使用相同的步骤在Fedora 24
上搭建了开发环境。本文使用的软件环境如下:
- JDK 1.8.0_144
- Gradle 4.8.1
- IntelliJ IDEA 2017.2.7
源码下载
从elastic官方的GitHub仓库中去下载Elasticsearch 的源代码。你可以使用git clone的方式下载,也可以GitHub的下载链接单独下载ZIP文件。本文采用第二种方式,如下图所示:
导入IDEA
Elasticsearch 5.X 使用Gradle包装器进行构建,在将源码导入IDEA前可以使用gradlew
执行源码中提供的脚本自动生成IDEA需要的配置文件。
1、构建源码
将下载完的源码文件解压,在源码文件的根目录执行如下命令:
gradlew idea
因为需要下载相关依赖,执行的时间可能会比较长。因为网络原因配置过程可能会执行失败,这样的情况多试几次即可。最终构建成功的界面如下图所示:
2、导入IDEA
在IDEA中选择File -> New -> Project From Existing Sources...
在弹出的对话框中选择Elasticsearch 5.6.12源码的根目录,点击OK后在之后出现的对话框中选择Import project from external model -> Gradle
,如下图所示:
点击下方的Next
按钮,在接下来的对话框中选中Use auto-import
并点击下方的Finish
按钮后,IDEA及开始导入Elasticsearch的源码。导入成功后,如下图所示:
运行源代码
在源代码的根目录下新建debug-home
目录,做调试源码时的配置及数据目录。将源码根目录下的distribution.src.main.resources.config
目录及里边的内容拷贝到debug-home
目录中,并在debug-home
目录中创建如下图所示的目录:
在debug-home.config
目录中增加debug-security.policy
文件,并在文件内添加如下内容:
grant { // needed to generate runtime classes permission java.lang.RuntimePermission "createClassLoader"; // needed by IndyInterface permission java.lang.RuntimePermission "getClassLoader"; // needed by groovy engine permission java.lang.RuntimePermission "accessDeclaredMembers"; permission java.lang.RuntimePermission "accessClassInPackage.sun.reflect"; permission java.lang.RuntimePermission "accessClassInPackage.jdk.internal.reflect"; // Allow executing groovy scripts with codesource of /untrusted permission groovy.security.GroovyCodeSourcePermission "/untrusted"; // Standard set of classes permission org.elasticsearch.script.ClassPermission "<<STANDARD>>"; // groovy runtime (TODO: clean these up if possible) permission org.elasticsearch.script.ClassPermission "groovy.grape.GrabAnnotationTransformation"; permission org.elasticsearch.script.ClassPermission "groovy.lang.Binding"; permission org.elasticsearch.script.ClassPermission "groovy.lang.GroovyObject"; permission org.elasticsearch.script.ClassPermission "groovy.lang.GString"; permission org.elasticsearch.script.ClassPermission "groovy.lang.Script"; permission org.elasticsearch.script.ClassPermission "groovy.util.GroovyCollections"; permission org.elasticsearch.script.ClassPermission "org.codehaus.groovy.ast.builder.AstBuilderTransformation"; permission org.elasticsearch.script.ClassPermission "org.codehaus.groovy.reflection.ClassInfo"; permission org.elasticsearch.script.ClassPermission "org.codehaus.groovy.runtime.GStringImpl"; permission org.elasticsearch.script.ClassPermission "org.codehaus.groovy.runtime.powerassert.ValueRecorder"; permission org.elasticsearch.script.ClassPermission "org.codehaus.groovy.runtime.powerassert.AssertionRenderer"; permission org.elasticsearch.script.ClassPermission "org.codehaus.groovy.runtime.ScriptBytecodeAdapter"; permission org.elasticsearch.script.ClassPermission "org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation"; permission org.elasticsearch.script.ClassPermission "org.codehaus.groovy.vmplugin.v7.IndyInterface"; permission org.elasticsearch.script.ClassPermission "sun.reflect.ConstructorAccessorImpl"; permission org.elasticsearch.script.ClassPermission "sun.reflect.MethodAccessorImpl"; permission org.elasticsearch.script.ClassPermission "jdk.internal.reflect.ConstructorAccessorImpl"; permission org.elasticsearch.script.ClassPermission "jdk.internal.reflect.MethodAccessorImpl"; permission org.elasticsearch.script.ClassPermission "groovy.lang.Closure"; permission org.elasticsearch.script.ClassPermission "org.codehaus.groovy.runtime.GeneratedClosure"; permission org.elasticsearch.script.ClassPermission "groovy.lang.MetaClass"; permission org.elasticsearch.script.ClassPermission "groovy.lang.Range"; permission org.elasticsearch.script.ClassPermission "groovy.lang.Reference"; permission java.lang.RuntimePermission "createClassLoader"; permission java.io.FilePermission "/proc/sys/net/core/somaxconn", "read"; permission java.util.PropertyPermission "sun.nio.ch.bugLevel", "write"; // needed to generate runtime classes permission java.lang.RuntimePermission "createClassLoader"; permission java.lang.RuntimePermission "accessClassInPackage.sun.misc"; // expression runtime permission org.elasticsearch.script.ClassPermission "java.lang.String"; permission org.elasticsearch.script.ClassPermission "org.apache.lucene.expressions.Expression"; permission org.elasticsearch.script.ClassPermission "org.apache.lucene.search.DoubleValues"; // available functions permission org.elasticsearch.script.ClassPermission "java.lang.Math"; permission org.elasticsearch.script.ClassPermission "org.apache.lucene.util.MathUtil"; permission org.elasticsearch.script.ClassPermission "org.apache.lucene.util.SloppyMath"; permission java.lang.reflect.ReflectPermission "suppressAccessChecks"; };
在debug-home.modules
目录中增加transport-netty4
目录,并在该目录中增加plugin-descriptor.properties
文件,文件内容如下:
# Elasticsearch plugin descriptor file # This file must exist as 'plugin-descriptor.properties' in a folder named `elasticsearch` # inside all plugins. # ### example plugin for "foo" # # foo.zip <-- zip file for the plugin, with this structure: #|____elasticsearch/ #| |____ <arbitrary name1>.jar <-- classes, resources, dependencies #| |____ <arbitrary nameN>.jar <-- any number of jars #| |____ plugin-descriptor.properties <-- example contents below: # # classname=foo.bar.BazPlugin # description=My cool plugin # version=2.0 # elasticsearch.version=2.0 # java.version=1.7 # ### mandatory elements for all plugins: # # 'description': simple summary of the plugin description=Netty 4 based transport implementation # # 'version': plugin's version version=5.6.12 # # 'name': the plugin name name=transport-netty4 # # 'classname': the name of the class to load, fully-qualified. classname=org.elasticsearch.transport.Netty4Plugin # # 'java.version': version of java the code is built against # use the system property java.specification.version # version string must be a sequence of nonnegative decimal integers # separated by "."'s and may have leading zeros java.version=1.8 # # 'elasticsearch.version': version of elasticsearch compiled against elasticsearch.version=5.6.12 ### optional elements for plugins: # # 'has.native.controller': whether or not the plugin has a native controller has.native.controller=false
在IDEA中选择Run -> Edit Configurations...
,在弹出的对话框中按如下图填写:
其中VM options
处填写的内容如下:
-Xms4096m -Xmx4096m -Dlog4j2.disable.jmx=true -Des.path.home=E:\idea_workspace\elasticsearch-5.6.12\debug-home -Des.path.conf=E:\idea_workspace\elasticsearch-5.6.12\debug-home\config -Djava.security.policy=E:\idea_workspace\elasticsearch-5.6.12\debug-home\config\debug-security.policy
修改core
模块中的build.gradle
文件,在其中依赖配置的末尾增加如下图所示的配置:
至此,通过IDEA中的Run -> Debug 'Elasticsearch'
已经可以成功运行Elasticsearch的源码,但是该工程目前仅加载了transport-netty4
这一个非核心模块。如下图所示:

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
HBase的引出
行式存储和列式存储 如上图,第一个行式存储是以行为单位存储数据,三个颜色的代表三个不同行数据,而下面的是列式存储,以列为单位存储数据,四个颜色代表四个不同的列,箭头也是用来表示数据是如何存储的 在传统的RDBMS(关系型数据库)中,保存着一条完整的数据,如果查询数据的某列,需要将这行数据查询出来再进行过滤,这就造成了不必要的浪费,而在列式存储中,id存一起,name存一起,age存一起,一列的数据存一起,所以当我们不需要全部查询一条数据时,列式存储的优势就体现出来了,并且列式存储由于一列一列的存储,一列数据的数据类型都是一样的,而不是像RDBMS那样一行数据包含各种数据类型,所以列式存储的压缩比行式存储压缩好的多 RDBMS的问题 RDBMS存储结构相当严谨(ACID之类的限制),主要是保留用户产品订单等信息,但是这种结构非常适合有限的数据量,对于数据激增的情况,就会显得力不从心了 对于RDBMS激增的问题,首先我们要减少压力,增加用于并行读取的从服务器,将读写分离(增加机器,一台只用于写,一些只应付读,当然应付读数据的服务器总是比写服务器多的,因为大部分的请求都是点击操作是请求数据的...
- 下一篇
HBase内的基本概念
上一篇文章,引出的有点简单哈哈,但是其他的概念是很重要的,还是需要理解记忆的,那么这篇将了解HBase的内部结构,有了这个知识才能够进行后续的编程和学习 HBase简介 首先说一下Hadoop,Hadoop是也是根据谷歌发表的论文的原理进行实现和改进的,Hadoop是一个分布式的,并提供了高可用,文件备份等一些特性,他可以运行在普通的硬件的,也提供的超大文件的存储和备份机制,而且有超强的扩展性和吞吐量 HBase是基于Hadoop的,所以上面说的所有点HBase也具备,HBase采用的是Key/Value的存储方式,所以他就不会因为数据量大,而导致查询性能的下降,并且HBase是一个列式存储的,当表的字段很多的时候,甚至可以将这些字段放在不同的机器上,来分散负载的压力,这样就导致了时间的增加:网络传输的延迟以及需要组织展示数据的耗费的时间等,所以它存储少量数据也不会很快,只是当数据量大的时候它慢的不明显 HBase数据分析是弱项,所以总的来说,当表的数据很大,并且并发挺高,分析需求较弱的时候,就可以考虑HBase了 部署架构 对于HBase的集群的搭建,网上有很多的例子,我自己搭建的是...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS关闭SELinux安全模块
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合Redis,开启缓存,提高访问速度