文档章节

java连接elasticsearch

 张欢19933
发布于 2017/09/01 16:18
字数 1363
阅读 83
收藏 1

使用 Java API 连接到ElasticSearch集群的方法有两种。

1. 成为ElasticSearch节点

      第一种连接ElasticSearch节点的方式可能会让那些没有接触过ElasticSearch java API的人感到吃惊,即思路是把应用程序当成ElasticSearch集群中的一个节点,并和其他节点一样对待。当然(在绝大多数情况下),我们不希望自己的应用程序被当作数据节点来存储数据,或者被推选为主节点。

我们声明了Client接口、Node接口和NodeBuilder,并用他们来建立到ElasticSearch的连接。下面的代码片段创建了一个到客户端的实例:

Node node = NodeBuilder.nodeBuilder().clusterName(CLUSTERNAME).client(true).node();
Clientclient = node.client();

      我们使用NodeBuilder类创建了一个节点,其中NodeBuilder可根据需要配置并建立节点。集群名称很重要,我们可以通过clusterName( )方法指定它。如果没有提供集群名称,则NodeBuilder会使用默认名称,即(elasticsearch),这时你可能会连接到一个你不希望连接的集群。另一个要点是client()的调用,该方法可以把最终调用的节点指定为客户端节点,而客户端节点不会持有数据。这一点请务必谨慎对待,除非你知道你在做什么,如果忽略了,如果忽略了可能会引发各种奇怪的问题。你的集群可能会丢失部分或者全部的数据。事实上集群可能会把一部分数据迁移到你的电脑上,当你关闭本地的节点实例后,集群会发现一个节点挂了。当可以持有数据的客户端为多个时,索引会更容易丢失。比如说,如果索引没有副本,而部分索引分片又迁移到了你的电脑上,那么关闭客户端肯定会带来集群丢失部分索引。因此,请务必使用client(true),除非你真的知道你在干什么。

      另外需要说明一下local(true)方法。因为它的存在,ElasticSearch可以在当前虚拟机内作为一个独立的节点而存在。这意味着多个ElasticSearch节点可以并存于一个Java虚拟机进程内组成一个集群。这个功能在集成测试时非常好用。有了它我们不需要在其他的地方建立独立的测试节点,并确保了在多个并行测试中互不干扰。

2. 使用传输及连接方式

      本方法允许只连接到集群而不加入集群。你会发现,客户端可以连接到多个节点,并通过轮询调度的方式使用它们。

接下来是使用传输机连接的主要代码:

Settings settings = Settings.settingsBuilder()
    .put("cluster.name", CLUSTERNAME)
    .put("client.transport.sniff", true).build();
client = TransportClient.builder().settings(settings).build()
     .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), PORT))
     .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host2"), PORT));

      这个方法很简单。首先我们使用方法settingsBuilder()来建立合适的配置对象,如在本例中只需设置好集群名称。接着我们使用这个配置对象来建立一个TransportClient的客户端对象,然后把连接点的网络地址传递给他。这可以通过TransportClient类的addTransportAddress()方法并传递InetSocketTransportAddress 对象来实现。为创建InetSocketTransportAddress对象,我们需要提供ElasticSearch节点多在机器的IP地址和节点传输层的监听端口号。注意,这里的端口号不是9200,而是9300。9200端口是用来让HTTP REST API来访问ElasticSearch,而9300端口是传输层监听的默认端口。

参数:

client.transport.sniff

true表示让客户端去嗅探整个集群的状态,把集群中其它机器的ip地址加到客户端中,这样做的好处是不用手动设置集群里所有集群的ip到连接客户端,它会自动帮你添加,并且自动发现新加入集群的机器

client.transport.ping_timeout

连接超时时间

client.transport.nodes_sampler_interval

心跳时间

3. 选择合适的连接方式

      目前你已经掌握了通过Java API方式连接ElasticSearch的两种方式:一种是建立客户端节点,一种是使用传输机客户端。到底哪种方式更好呢?一方面来说,第一种方式让启动顺序复杂化了,即客户端节点必须加入集群并建立与其它节点的连接,而这需要时间和资源。然而,操作可以更快地执行,因为所有关于集群、索引、分片的信息都对客户端节点可见。另一方面,使用TransportClient对象启动速度更快,需要的资源更少,如更少的socket连接。然而发送查询和数据却要消耗更多的资源,TransportClient对象对集群和索引的拓扑结构的信息一无所知,所以他无法把数据直接发送到正确的节点,而是先把数据发送给某个初始传输节点,然后由ElasticSearch来完成剩下的转发工作。此外,TransportClient对象还需要你提供一份待转发节点的网络地址列表。

      在选择合适的连接方式时请记住,第一种方式并不是总是可行的。例如,当要连接的ElasticSearch集群处于另一个局域网中,此时唯一可选的方式就是第二种方式。

© 著作权归作者所有

共有 人打赏支持
粉丝 36
博文 478
码字总数 230364
作品 0
海淀
私信 提问
Centos6搭建elk系统,监控IIS日志

**所需程序: 服务器端:java、elasticsearch、kikbana 客 户 端:IIS、logstash** 一、服务器端(192.168.10.46)操作: 先建立一个ELK专门的目录: [root@Cent65 ~]mkdir /elk/ 上传到elk...

D杀手D
04/24
0
0
Centos7单机部署ELK+x-pack

ELK分布式框架作为现在大数据时代分析日志的常为大家使用。现在我们就记录下单机Centos7部署ELK的过程和遇到的问题。   系统要求:Centos7(内核3.5及以上,2核4G)   elk版本:6.4.2(较...

DearMyLove
08/15
0
0
Elasticsearch的配置(1)

配置Elasticsearch Elasticsearch提供良好的默认设置,只需要很少的配置。使用群集更新设置 API,可以在运行的群集上更改大多数设置 。 https://www.elastic.co/guide/en/elasticsearch/refe...

yzy121403725
06/13
0
0
Elasticsearch Java Rest Client 上手指南(上)

开始看Elasticsearch Java API 的时候,被这段话浇了盆凉水 We plan on deprecating the in Elasticsearch 7.0 and removing it completely in 8.0. Instead, you should be using the Java......

MaxZing
07/17
0
0
Grafana、elasticsearch、kafka、logstash和pinpoint结合

一、Grafana 1)下载安装 wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-4.2.0-1.x8664.rpm sudo yum localinstall grafana-4.2.0-1.x86_64.rpm 2)启动 serv......

半船水
2017/10/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Zookeeper分析

沉稳2018
17分钟前
0
0
mockito learn one

mockito 介绍 mockito是一个很好用的模拟测试框架,能够让你写出简单优美测试,它不会给你残留的测试,因为它可读而且能够简单的验证错误。 如何使用? 引入依赖 <!-- https://mvnrepository...

writeademo
32分钟前
0
0
String转成JSON的实现

String转成JSON 这个依赖很重要,我们将围绕fastjson中的JSONObject这个类来谈转换 欢迎工作一到八年的Java工程师朋友们加入Java高级交流:854630135 本群提供免费的学习指导 架构资料 以及免...

编程SHA
43分钟前
1
0
详解Object.values(),Object.keys(),Object.entries(),Object.create(),includes()

(1)Object.keys() // 返回数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键名。 eg:var obj = {a:1,b:'gy'} Object.keys(obj) // ['a','b'] (2)...

JamesView
今天
2
0
Git —— 创建版本库和提交回退版本

二、 创建版本库 版本库又叫做仓库,简单理解就是一个目录,这个目录里面所有的文件都可以被Git管理起来,每个文件的修改、删除,Git都可以跟踪,便于追踪历史与还原。找到一个合适的位置,创...

lwenhao
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部