[megoldva] Milyen kommunikációt folytat a YARN a 40896 porton

Fórumok

Sziasztok,

Próbálom kideríteni, hogy melyik Hadoop/Yarn komponens próbál kommunikálni a 40896 porton. Az a sejtésem, hogy ez egy port tartománynak az egyik eleme. Az alábbi hibát kaptam a konténer logjában:


2015-05-15 11:51:36,526 WARN [main] org.apache.hadoop.mapred.YarnChild: Exception running child : java.net.NoRouteToHostException: No Route to Host from namenode/172.17.0.155 to 172.17.0.159:40896 failed on
socket timeout exception: java.net.NoRouteToHostException: No route to host; For more details see: http://wiki.apache.org/hadoop/NoRouteToHost
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at org.apache.hadoop.net.NetUtils.wrapWithMessage(NetUtils.java:791)
at org.apache.hadoop.net.NetUtils.wrapException(NetUtils.java:757)
at org.apache.hadoop.ipc.Client.call(Client.java:1472)
at org.apache.hadoop.ipc.Client.call(Client.java:1399)
at org.apache.hadoop.ipc.WritableRpcEngine$Invoker.invoke(WritableRpcEngine.java:244)
at com.sun.proxy.$Proxy8.getTask(Unknown Source)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:132)
Caused by: java.net.NoRouteToHostException: No route to host
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)
at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:206)
at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:530)
at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:494)
at org.apache.hadoop.ipc.Client$Connection.setupConnection(Client.java:607)
at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:705)
at org.apache.hadoop.ipc.Client$Connection.access$2800(Client.java:368)
at org.apache.hadoop.ipc.Client.getConnection(Client.java:1521)
at org.apache.hadoop.ipc.Client.call(Client.java:1438)

Ha van ötletetek kérlek segítsetek. Köszi

Hozzászólások

Az xml konfigokat átnézted? Szerintem az egyikben benne lesz. Ha mást nem, akkor valamelyik default xml-ben.
Illetve, milyen hadoop komponensek futnak a 172.17.0.159 IP-n?

A 172.17.0.159 egy slave, és egy DataNode ill egy NodeManager fut rajta. Az imént futtattam még 1x, és akkor pedig ezt kaptam:
No Route to Host from namenode/172.17.0.14 to namenode:58344. A namenode nevő gépen az alábbiak futnak: JobHistoryServer, NodeManager, ResourceManager, SecondaryNameNode, DataNode, NameNode. A probléma az, hogy a cluster Docker konténerekben fut különböző gépeken, szóval tudnom kell, hogy milyen portokat ajánlok ki a konténerekből. A konfigurációt egyébként megtekintheted itt. Volt már pár hely, ahol le kellett szabályoznom a port tartományt, de ez most kifogott rajtam. Próbáltam futás után megnézni mi fut azon a porton, de addigra már semmi (vagy eleve semmi).

-
JVM futásidejű monitorozása

Hm, Docker. Na ez felvet egy problémát: a 172-vel kezdődő címekből ez esetben azt gondolnám, hogy tuti hibásak lesznek, és a no route to host is ezt támasztja alá. Ezek az IP-k csak egy fizikai gépen belül érvényesek (ez a docker0 bridge ip tartománya).

Ebből következően, ha több fizikai hostod van, akkor elsőként az IP-ket kellene jól átírni és csak utána a portokkal foglalkozni.

A portokkal kapcsolatban most sajnos nincs előttem élő hadoop, de érdemes lenne átnézni a default config xml-eket (ilyesmi nevekkel guglizd, hogy dfs-default.xml), mert azokban szinte biztosan benne lesznek a szükséges portok.

Az IP is hibás, meg a port is, de ahhoz, hogy megtudjam hol javítsam ki az ip-t meg kéne tudnom, hogy mi akar ott kommunikálni. Ezeket már árnéztem:
https://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-common…
http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-hdfs/hd…
http://hadoop.apache.org/docs/r2.6.0/hadoop-yarn/hadoop-yarn-common/yar…
http://hadoop.apache.org/docs/r2.6.0/hadoop-mapreduce-client/hadoop-map…

A többi esetben, mert nem ez volt az első így-úgy ki tudtam deríteni hogyna konfigoljam, hogy jó legyen, de az eddig bevált módszerek itt nem segítettek.

-
JVM futásidejű monitorozása

# lsof -i tcp:39552
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 2717 root 235u IPv4 147112 0t0 TCP namenode:60573->172.17.0.15:39552 (SYN_SENT)
java 2733 root 235u IPv4 147111 0t0 TCP namenode:60572->172.17.0.15:39552 (SYN_SENT)
-bash-4.1# ps x | grep 2717
2717 ? Sl 0:01 /usr/lib/jvm/jre-1.8.0-openjdk/bin/java -Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN -Xmx200m -Djava.io.tmpdir=/tmp/hadoop-root/nm-local-dir/usercache/root/appcache/application_1431716284376_0003/container_1431716284376_0003_01_000012/tmp -Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=/usr/local/hadoop/logs/userlogs/application_1431716284376_0003/container_1431716284376_0003_01_000012 -Dyarn.app.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA org.apache.hadoop.mapred.YarnChild 172.17.0.15 39552 attempt_1431716284376_0003_m_000008_1 12

Elcsíptem egy ilyet.

-
JVM futásidejű monitorozása

"A hostname-IP összerendelés /etc/hosts-ban van, ugye?" ott van. A configban mindenhol namenode van, a master dockert -h namenode kapcsolóval indítom, a slaveken pedig a dockert hostoló gép ipje.

Kivétel a yarn.nodemanager.address, mert ott ${yarn.nodemanager.hostname}:36123 van namenode helyett, illetve a hdfs-site.xml fájlban van 0.0.0.0 a datanode-al kapcsolatban, de azokat a bootstrap script kicseréli a gép hostnevére
-
JVM futásidejű monitorozása

A -h kapcsoló azt jelenti, hogy a konténernek is azonos lesz az ip-je a hosttal (közös net ns) ugye? Ha igen, akkor egy gonddal kevesebb van, de valami ehhez hasonló oka kell legyen szerintem annak, hogy a docker0 bridgehez tartozó ip-re akar csatlakozni. Én itt keresgélnék tovább.
Más ötletem most nincs sajnos, de ha meglesz a megoldás megköszönöm ha megosztod mert már érdekel.

A -h a hostnevét adja meg a konténernek, és akkor nem a Docker generál neki random. Én arra szűkítettem a problémát, hogy a slaveen létrejön a YarnChild processz, ami egy ephemeral porton akarja magát láthatóvá tenni a master számára, és oda sajnos nem a hostnevét adja meg, illetve a port nincs publikálva a Dockerben. Mindeképp megosztom, ha lesz megoldás, köszi.

-
JVM futásidejű monitorozása

Á, ez esetben még egy ötlet: ha a -h csak a host nevet állítja be, akkor próbáld meg --net=host kapcsolóval indítani a konténert. Ennek hatására a konténerben lévő eth0 és a host eth0 interfészeknek azonos IP:port tartományon kell osztozniuk (shared net ns). Ez talán hozza a host nevet is és a portokat se hiszem hogy kellene onnantól expose-olni.

Ami még jól jöhet ha nem ismered:
- https://docs.docker.com/articles/networking/#tools-and-examples
- https://docs.docker.com/articles/networking/#container-networking

Majd még nézd meg ezt a toolt is: https://github.com/coreos/flannel
Lényegileg egy overlay network segítségével összeköti a különböző gépeken lévő docker0 bridge-eket, ezzel elérve, hogy a konténerek úgy lássák egymást mint ha nem is lenne ott a Docker.
Persze ezzel is vannak bajok/kérdések, de neked valószínűleg Hadoophoz jó lesz.