环境:ES-5.4.0版本,部署方式:3master node+2client node+3data node

说明:data node和client node都配置了http.enabled: false,程序在写数据时报错:No data nodes with HTTP-enabled available

源码分析:

 1 public static void filterNonDataNodesIfNeeded(Settings settings, Log log) {
 2     if (!settings.getNodesDataOnly()) {
 3         return;
 4     }
 5 
 6     RestClient bootstrap = new RestClient(settings);
 7     try  {
 8         String message = "No data nodes with HTTP-enabled available";
 9         List<NodeInfo> dataNodes = bootstrap.getHttpDataNodes();
10     // 找不到dataNodes就会报错
11         if (dataNodes.isEmpty()) {
12             throw new EsHadoopIllegalArgumentException(message);
13         }
14         ...
15     } finally {
16         bootstrap.close();
17     }
18 }

 

接下来看看RestClient.getHttpDataNodes()方法的取值逻辑

 1 public List<NodeInfo> getHttpDataNodes() {
 2     List<NodeInfo> nodes = getHttpNodes(false);
 3   // 遍历上面获取到的节点
 4     Iterator<NodeInfo> it = nodes.iterator();
 5     while (it.hasNext()) {
 6         NodeInfo node = it.next();
 7     // 如果不是数据节点,则移除
 8         if (!node.isData()) {
 9             it.remove();
10         }
11     }
12     return nodes;
13 }
14 
15 // 获取http节点_nodes/http
16 public List<NodeInfo> getHttpNodes(boolean clientNodeOnly) {
17   // 通过es接口“_nodes/http”来获取nodes的信息
18     Map<String, Map<String, Object>> nodesData = get("_nodes/http", "nodes");
19     List<NodeInfo> nodes = new ArrayList<NodeInfo>();
20 
21     for (Entry<String, Map<String, Object>> entry : nodesData.entrySet()) {
22         NodeInfo node = new NodeInfo(entry.getKey(), entry.getValue());
23     // 如果不是查找client节点,则只要节点运行网络访问就可以add了;如果查找client节点,则还要通过isClient验证才能add
24         if (node.hasHttp() && (!clientNodeOnly || node.isClient())) {
25             nodes.add(node);
26         }
27     }
28     return nodes;
29 }
View Code

相关文章: