linux + 正在使用的埠 + 但 netstat 沒有返回 PID 來殺死 PID
我們有 Hadoop 集群 - linux 是 rhel 7.5 機器
並且namenode正在使用埠50070
從日誌中我們可以看到50070埠正在使用中
但有趣的是,當我們這樣做時
netstat -tulpn | grep 50070
,為了找到 PID,它什麼也不返回。netstat -tulpn | grep 50070 ( we not get output )
那怎麼可能呢?
如何清空埠?
2020-07-18 21:26:22,753 INFO impl.MetricsSystemImpl (MetricsSystemImpl.java:shutdown(606)) - NameNode metrics system shutdown complete. 2020-07-18 21:26:22,753 ERROR namenode.NameNode (NameNode.java:main(1783)) - Failed to start namenode. java.net.BindException: Port in use: linux.gg.com:50070 at org.apache.hadoop.http.HttpServer2.constructBindException(HttpServer2.java:1001) at org.apache.hadoop.http.HttpServer2.bindForSinglePort(HttpServer2.java:1023) at org.apache.hadoop.http.HttpServer2.openListeners(HttpServer2.java:1080) at org.apache.hadoop.http.HttpServer2.start(HttpServer2.java:937) at org.apache.hadoop.hdfs.server.namenode.NameNodeHttpServer.start(NameNodeHttpServer.java:170) at org.apache.hadoop.hdfs.server.namenode.NameNode.startHttpServer(NameNode.java:942) at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:755) at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:1001) at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:985) at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1710) at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1778) Caused by: java.net.BindException: Address already in use at sun.nio.ch.Net.bind0(Native Method) at sun.nio.ch.Net.bind(Net.java:433) at sun.nio.ch.Net.bind(Net.java:425) at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223) at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74) at org.mortbay.jetty.nio.SelectChannelConnector.open(SelectChannelConnector.java:216) at org.apache.hadoop.http.HttpServer2.bindListener(HttpServer2.java:988) at org.apache.hadoop.http.HttpServer2.bindForSinglePort(HttpServer2.java:1019) ... 9 more 2020-07-18 21:26:22,755 INFO util.ExitUtil (ExitUtil.java:terminate(124)) - Exiting with status 1 2020-07-18 21:26:22,757 INFO namenode.NameNode (LogAdapter.java:info(47)) - SHUTDOWN_MSG: /************************************************************ SHUTDOWN_MSG: Shutting down NameNode at ************************************************************/ [root@linux hdfs]# [root@linux hdfs]# [root@linux hdfs]# netstat -tulpn | grep 50070 ( no PID number is returned )
這些消息表明問題出在屬於 Hadoop 的 HTTP 伺服器上。我認為,50070 埠是 Hadoop 2.7.1 及更高版本中 HDFS Web UI 的預設埠。
使用
netstat -tulpn
,您正在查看偵聽傳入 TCP 連接的埠。由於問題出在 Hadoop 的 HTTP 伺服器上,因此您根本不需要查看 UDP 埠,因為 HTTP 只會使用 TCP 埠。但由於埠號很高,它可能被傳出連接佔用。試試
netstat -tapn | grep 50070
吧。要查看可以為傳出連接動態分配的埠範圍,請執行
cat /proc/sys/net/ipv4/ip_local_port_range
。您可以使用net.ipv4.ip_local_port_range = min_value max_value
in/etc/sysctl.conf[.d]
調整範圍,但在具有大量傳出連接的繁忙伺服器上限制範圍可能不是一個好主意。我的 Debian 10 上的預設範圍是從埠 32768 到 60999;預設情況下,企業發行版可能會使用擴展範圍。相反,您可能希望為此 HDFS Web UI 選擇一個非預設埠,該埠超出用於傳出連接的埠範圍。如果未設置,則
dfs.namenode.http-address
in的屬性hdfs.xml
具有預設值。0.0.0.0:50070
您可以將該屬性設置為0.0.0.0:<some_other_port>
.換句話說,要將埠號設置為例如 32070,您可以將其添加到您的
hdfs.xml
:<property> <name>dfs.namenode.http-address</name> <value>0.0.0.0:32070</value> </property>
意思是“執行 Web UI 的系統所擁有的
0.0.0.0
任何 IP 地址”。如果系統有多個具有不同地址的網路連接,並且您希望 HDFS Web UI 只能通過單個 IP 地址訪問,則可以將其替換為 IP 地址。當然,您還需要記錄 HDFS Web UI 現在位於非預設埠中,以便需要 Web UI 功能的管理員能夠找到它。