腊八粥 2019-06-28
允许从正在运行的Elasticsearch集群中自动发现节点并将它们设置到现有的RestClient
实例的最小的库,它默认使用节点信息api检索属于集群的节点,并使用jackson解析获得的json响应。
与Elasticsearch 2.x及以后版本兼容。
可以在https://artifacts.elastic.co/javadoc/org/elasticsearch/client/elasticsearch-rest-client-sniffer/6.4.2/index.html找到REST客户端嗅探器的javadoc。
REST客户端嗅探器与Elasticsearch具有相同的发布周期,将版本替换为所需的嗅探器版本,首先使用5.0.0-alpha4
发布版,嗅探器版本与客户端可以与之通信的Elasticsearch版本之间没有任何关系,嗅探器支持从Elasticsearch 2.x及以后来获取节点列表。
如果你正在寻找SNAPSHOT版本,可以通过https://snapshots.elastic.co/maven/获取Elastic Maven Snapshot存储库。
以下是如何使用maven作为依赖关系管理器来配置依赖关系,将以下内容添加到pom.xml
文件中:
<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-client-sniffer</artifactId> <version>6.4.2</version> </dependency>
以下是使用gradle作为依赖关系管理器配置依赖关系的方法,将以下内容添加到build.gradle
文件中:
dependencies { compile 'org.elasticsearch.client:elasticsearch-rest-client-sniffer:6.4.2' }
一旦创建了RestClient
实例,如初始化中所示,可以将Sniffer
与其关联,Sniffer
将定期使用提供的RestClient
(默认情况下每隔5分钟)从集群中获取当前节点的列表,并通过调用RestClient#setNodes
来更新它们。
RestClient restClient = RestClient.builder( new HttpHost("localhost", 9200, "http")) .build(); Sniffer sniffer = Sniffer.builder(restClient).build();
关闭Sniffer
以使其后台线程正确关闭并释放其所有资源非常重要,Sniffer
对象应具有与RestClient
相同的生命周期,并在客户端之前关闭:
sniffer.close(); restClient.close();
Sniffer
默认每5分钟更新一次节点,可以通过提供(以毫秒为单位)来定制此间隔,如下所示:
RestClient restClient = RestClient.builder( new HttpHost("localhost", 9200, "http")) .build(); Sniffer sniffer = Sniffer.builder(restClient) .setSniffIntervalMillis(60000).build();
也可以在失败时启用嗅探,这意味着在每次失败后,节点列表会立即更新,而不是在下面的普通嗅探轮询中,在这种情况下,需要首先创建SniffOnFailureListener
,并在创建RestClient
时提供。此外,一旦稍后创建了Sniffer
,它就需要与同一个SniffOnFailureListener
实例相关联,该实例将在每次失败时得到通知,并使用Sniffer
执行所述的额外嗅探轮询。
SniffOnFailureListener sniffOnFailureListener = new SniffOnFailureListener(); RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)) .setFailureListener(sniffOnFailureListener) .build(); Sniffer sniffer = Sniffer.builder(restClient) .setSniffAfterFailureDelayMillis(30000) .build(); sniffOnFailureListener.setSniffer(sniffer);
RestClient
实例中。setSniffAfterFailureDelayMillis
方法在Sniffer
创建时自定义所述间隔,请注意,如果未启用在失败时嗅探,则此最后一个配置参数无效,如上所述。Sniffer
实例设置到失败监听器。Elasticsearch节点信息api不会返回连接到节点时使用的协议,而只返回其host:port
键值对,因此默认情况下使用http
,如果应该使用https
,则必须手动创建ElasticsearchNodesSniffer
实例并按如下方式提供:
RestClient restClient = RestClient.builder( new HttpHost("localhost", 9200, "http")) .build(); NodesSniffer nodesSniffer = new ElasticsearchNodesSniffer( restClient, ElasticsearchNodesSniffer.DEFAULT_SNIFF_REQUEST_TIMEOUT, ElasticsearchNodesSniffer.Scheme.HTTPS); Sniffer sniffer = Sniffer.builder(restClient) .setNodesSniffer(nodesSniffer).build();
以同样的方式,也可以自定义sniffRequestTimeout
,默认为一秒。这是在调用节点信息api时作为查询字符串参数提供的timeout
参数,这样当超时在服务器端到期时,尽管它可能只包含作为集群一部分的节点的子集,但在此之前已响应的节点仍会返回有效响应。
RestClient restClient = RestClient.builder( new HttpHost("localhost", 9200, "http")) .build(); NodesSniffer nodesSniffer = new ElasticsearchNodesSniffer( restClient, TimeUnit.SECONDS.toMillis(5), ElasticsearchNodesSniffer.Scheme.HTTP); Sniffer sniffer = Sniffer.builder(restClient) .setNodesSniffer(nodesSniffer).build();
此外,可以为高级用例提供自定义NodesSniffer
实现,这些用例可能需要从外部源而不是从Elasticsearch获取节点
:
RestClient restClient = RestClient.builder( new HttpHost("localhost", 9200, "http")) .build(); NodesSniffer nodesSniffer = new NodesSniffer() { @Override public List<Node> sniff() throws IOException { return null; } }; Sniffer sniffer = Sniffer.builder(restClient) .setNodesSniffer(nodesSniffer).build();
从外部源获取主机。
另外一部分,则需要先做聚类、分类处理,将聚合出的分类结果存入ES集群的聚类索引中。数据处理层的聚合结果存入ES中的指定索引,同时将每个聚合主题相关的数据存入每个document下面的某个field下。