Q:有两个人掉到陷阱里了,死的人叫死人,活人叫什么?

Elasticsearch Java API - 客户端连接(TransportClient,PreBuiltXPackTransportClient)(一)

quanke 发表了文章 • 1 个评论 • 33911 次浏览 • 2017-11-16 09:52 • 来自相关话题

Elasticsearch Java API 客户端连接


一个是TransportClient,一个是NodeClient,还有一个XPackTransportClient

  • TransportClient:

    作为一个外部访问者,请求ES的集群,对于集群而言,它是一个外部因素。


  • NodeClient

    作为ES集群的一个节点,它是ES中的一环,其他的节点对它是感知的。

  • XPackTransportClient:

    服务安装了 x-pack 插件

    重要:客户端版本应该和服务端版本保持一致

    TransportClient旨在被Java高级REST客户端取代,该客户端执行HTTP请求而不是序列化的Java请求。 在即将到来的Elasticsearch版本中将不赞成使用TransportClient,建议使用Java高级REST客户端。


    上面的警告比较尴尬,但是在 5xx版本中使用还是没有问题的,可能使用rest 客户端兼容性更好做一些。

    [Elasticsearch Java Rest API 手册](https://www.gitbook.com/book/q ... a-rest)

    Maven Repository


    Elasticsearch Java API包已经上传到 [Maven Central](http://search.maven.org/%23sea ... h%2522)

    pom.xml文件中增加:

    transport 版本号最好就是与Elasticsearch版本号一致。

    ```


    org.elasticsearch.client
    transport
    5.6.3

    ```


    ### Transport Client

    #### 不设置集群名称

    ```
    // on startup

    //此步骤添加IP,至少一个,如果设置了"client.transport.sniff"= true 一个就够了,因为添加了自动嗅探配置
    TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300))
    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host2"), 9300));

    // on shutdown 关闭client

    client.close();
    ```

    #### 设置集群名称

    ```
    Settings settings = Settings.builder()
    .put("cluster.name", "myClusterName").build(); //设置ES实例的名称
    TransportClient client = new PreBuiltTransportClient(settings); //自动嗅探整个集群的状态,把集群中其他ES节点的ip添加到本地的客户端列表中
    //Add transport addresses and do something with the client...
    ```

    #### 增加自动嗅探配置
    ```
    Settings settings = Settings.builder()
    .put("client.transport.sniff", true).build();
    TransportClient client = new PreBuiltTransportClient(settings);
    ```

    #### 其他配置

    ```
    client.transport.ignore_cluster_name //设置 true ,忽略连接节点集群名验证
    client.transport.ping_timeout //ping一个节点的响应时间 默认5秒
    client.transport.nodes_sampler_interval //sample/ping 节点的时间间隔,默认是5s
    ```
    对于ES Client,有两种形式,一个是TransportClient,一个是NodeClient。两个的区别为:
    TransportClient作为一个外部访问者,通过HTTP去请求ES的集群,对于集群而言,它是一个外部因素。
    NodeClient顾名思义,是作为ES集群的一个节点,它是ES中的一环,其他的节点对它是感知的,不像TransportClient那样,ES集群对它一无所知。NodeClient通信的性能会更好,但是因为是ES的一环,所以它出问题,也会给ES集群带来问题。NodeClient可以设置不作为数据节点,在elasticsearch.yml中设置,这样就不会在此节点上分配数据。

    如果用ES的节点,仁者见仁智者见智。

    #### 实例

    ```
    package name.quanke.es.study;

    import name.quanke.es.study.util.Utils;
    import org.elasticsearch.action.search.SearchResponse;
    import org.elasticsearch.client.transport.TransportClient;
    import org.elasticsearch.common.settings.Settings;
    import org.elasticsearch.common.transport.InetSocketTransportAddress;
    import org.elasticsearch.transport.client.PreBuiltTransportClient;
    import org.junit.After;
    import org.junit.Before;

    import java.net.InetAddress;

    /**
    * Elasticsearch 5.5.1 的client 和 ElasticsearchTemplate的初始化
    * 作为一个外部访问者,请求ES的集群,对于集群而言,它是一个外部因素。
    * Created by http://quanke.name on 2017/11/10.
    */
    public class ElasticsearchClient {

    protected TransportClient client;

    @Before
    public void setUp() throws Exception {

    Settings esSettings = Settings.builder()
    .put("cluster.name", "utan-es") //设置ES实例的名称
    .put("client.transport.sniff", true) //自动嗅探整个集群的状态,把集群中其他ES节点的ip添加到本地的客户端列表中
    .build();

    /**
    * 这里的连接方式指的是没有安装x-pack插件,如果安装了x-pack则参考{@link ElasticsearchXPackClient}
    * 1. java客户端的方式是以tcp协议在9300端口上进行通信
    * 2. http客户端的方式是以http协议在9200端口上进行通信
    */
    client = new PreBuiltTransportClient(esSettings)
    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.1.10"), 9300));

    System.out.println("ElasticsearchClient 连接成功");
    }

    @After
    public void tearDown() throws Exception {
    if (client != null) {
    client.close();
    }

    }

    protected void println(SearchResponse searchResponse) {
    Utils.println(searchResponse);
    }

    }


    ```
    本实例代码已经上传到 Git [ElasticsearchClient.java](https://gitee.com/quanke/elast ... .java))

    [所有实例](https://gitee.com/quanke/elasticsearch-java-study) 已经上传到Git


    ### XPackTransportClient
    如果 `ElasticSearch ` 服务安装了 `x-pack` 插件,需要`PreBuiltXPackTransportClient`实例才能访问


    使用Maven管理项目,把下面代码增加到`pom.xml`;

    一定要修改默认仓库地址为https://artifacts.elastic.co/maven ,因为这个库没有上传到Maven中央仓库,如果有自己的 maven ,请配置代理

    ```





    elasticsearch-releases
    https://artifacts.elastic.co/maven</url>

    true


    false


    ...

    ...




    org.elasticsearch.client
    x-pack-transport
    5.6.3

    ...

    ...


    ```

    #### 实例


    ```

    /**
    * Elasticsearch XPack Client
    * Created by http://quanke.name on 2017/11/10.
    */
    public class ElasticsearchXPackClient {

    protected TransportClient client;

    @Before
    public void setUp() throws Exception {
    /**
    * 如果es集群安装了x-pack插件则以此种方式连接集群
    * 1. java客户端的方式是以tcp协议在9300端口上进行通信
    * 2. http客户端的方式是以http协议在9200端口上进行通信
    */
    Settings settings = Settings.builder()
    .put("xpack.security.user", "elastic:utan100")
    .put("cluster.name", "utan-es")
    .build();
    client = new PreBuiltXPackTransportClient(settings)
    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.1.10"), 9300));
    // final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    // credentialsProvider.setCredentials(AuthScope.ANY,
    // new UsernamePasswordCredentials("elastic", "utan100"));

    System.out.println("ElasticsearchXPackClient 启动成功");
    }

    @Test
    public void testClientConnection() throws Exception {

    System.out.println("--------------------------");
    }

    @After
    public void tearDown() throws Exception {
    if (client != null) {
    client.close();
    }

    }

    protected void println(SearchResponse searchResponse) {
    Utils.println(searchResponse);
    }
    }

    ```

    本实例代码已经上传到 Git [ ElasticsearchXPackClient.java](https://gitee.com/quanke/elast ... .java))

    [所有实例](https://gitee.com/quanke/elasticsearch-java-study) 已经上传到Git


    更多请浏览 [spring-boot-starter-es](https://github.com/quanke/spring-boot-starter-es) 开源项目


    如何有任何问题请关注微信公众号给我留言


    qrcode_for_gh_26893aa0a4ea_258.jpg

关于分片数确定

laoyang360 回复了问题 • 3 人关注 • 1 个回复 • 3989 次浏览 • 2017-11-16 07:14 • 来自相关话题

bulk负载不均

laoyang360 回复了问题 • 3 人关注 • 1 个回复 • 2183 次浏览 • 2017-11-16 07:15 • 来自相关话题

es表中的每个字段都被索引了吗?

redhat 回复了问题 • 2 人关注 • 1 个回复 • 8416 次浏览 • 2017-11-15 19:07 • 来自相关话题

关于es-hadoop 添加ik中文分词的问题

forresttee 回复了问题 • 2 人关注 • 2 个回复 • 3177 次浏览 • 2017-11-17 14:07 • 来自相关话题

新手 elasticsearch api 根据某个字段做数据库中的in操作 有没有具体的api 求助

chenglp 回复了问题 • 2 人关注 • 1 个回复 • 3708 次浏览 • 2017-11-15 17:12 • 来自相关话题

ES 如何将新文档的索引从 In-memory buffer 写入到文件系统缓存

redhat 回复了问题 • 4 人关注 • 2 个回复 • 5031 次浏览 • 2017-11-15 19:12 • 来自相关话题

TB级json数据导入elasticsearch问题?

laoyang360 回复了问题 • 2 人关注 • 1 个回复 • 2795 次浏览 • 2017-11-15 18:36 • 来自相关话题

elasticsearch 滚动重启工具

xiaoke 回复了问题 • 2 人关注 • 1 个回复 • 2630 次浏览 • 2017-11-15 15:02 • 来自相关话题

_id 批量查询效率问题

诗兄 回复了问题 • 4 人关注 • 4 个回复 • 6438 次浏览 • 2018-04-20 15:53 • 来自相关话题

elasticsearch5中删除索引中的过期文档

novia 回复了问题 • 1 人关注 • 1 个回复 • 3913 次浏览 • 2017-11-15 11:17 • 来自相关话题

如何获取elasticsearch存储数据的时机

medcl 回复了问题 • 3 人关注 • 2 个回复 • 3309 次浏览 • 2017-11-16 10:07 • 来自相关话题

从一个网段的数据迁移到另外一个网段,请问我这种构想合理吗?如果合理,怎么配置呢?

bjfk2006 回复了问题 • 3 人关注 • 3 个回复 • 3808 次浏览 • 2017-11-14 19:57 • 来自相关话题

es5.6执行脚本更新报错

kennywu76 回复了问题 • 2 人关注 • 2 个回复 • 3939 次浏览 • 2017-11-15 12:17 • 来自相关话题

spark elasticsearch 异常: PowerSet: Too many elements to create a power set 40

mazedfishs 发表了文章 • 0 个评论 • 2358 次浏览 • 2017-11-14 17:22 • 来自相关话题


org.elasticsearch.hadoop.EsHadoopIllegalArgumentException: Too many elements to create a power set 54
at org.elasticsearch.hadoop.util.Assert.isTrue(Assert.java:50)
at org.elasticsearch.hadoop.rest.ShardSorter$PowerSet.(ShardSorter.java:218)
at org.elasticsearch.hadoop.rest.ShardSorter.powerList(ShardSorter.java:202)
at org.elasticsearch.hadoop.rest.ShardSorter.checkCombo(ShardSorter.java:89)
at org.elasticsearch.hadoop.rest.ShardSorter.find(ShardSorter.java:85)
at org.elasticsearch.hadoop.rest.RestRepository.doGetReadTargetShards(RestRepository.java:352)
at org.elasticsearch.hadoop.rest.RestRepository.getReadTargetShards(RestRepository.java:295)
at org.elasticsearch.hadoop.rest.RestService.findPartitions(RestService.java:253)
at org.elasticsearch.spark.rdd.AbstractEsRDD.esPartitions$lzycompute(AbstractEsRDD.scala:61)
at org.elasticsearch.spark.rdd.AbstractEsRDD.esPartitions(AbstractEsRDD.scala:60)
at org.elasticsearch.spark.rdd.AbstractEsRDD.getPartitions(AbstractEsRDD.scala:27)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:239)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:237)
at scala.Option.getOrElse(Option.scala:120)
at org.apache.spark.rdd.RDD.partitions(RDD.scala:237)
at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:239)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:237)Users with the same issue
 
解释:
Read failure when index/alias spread among 32 or more nodes
 
https://github.com/elastic/ela ... s/737