我正在尝试通过SOCKS代理访问运行YARN的防火墙Hadoop集群。群集本身不使用代理连接 - 只有在本地计算机(例如笔记本电脑)上运行的客户端才能通过ssh -D 9999 user@gateway-host
连接到可以看到Hadoop群集的计算机。
在Hadoop配置core-site.xml
(在我的笔记本电脑上),我有以下几行:
<property>
<name>hadoop.socks.server</name>
<value>localhost:9999</value>
</property>
<property>
<name>hadoop.rpc.socket.factory.class.default</name>
<value>org.apache.hadoop.net.SocksSocketFactory</value>
</property>
以这种方式访问HDFS效果很好。但是,当我尝试提交YARN作业时,它失败了,我可以在日志中看到节点无法相互通信:
java.io.IOException: Failed on local exception: java.net.SocketException: Connection refused; Host Details : local host is: "host1"; destination host is: "host2":8030;
at org.apache.hadoop.net.NetUtils.wrapException(NetUtils.java:772)
其中host1
和host2
都是hadoop群集的一部分。
我想正在发生的事情是hadoop节点也试图通过socks代理进行通信,这显然是失败的,因为每个主机上都没有代理服务器。除了设置专用的代理服务器之外,有没有办法解决这个问题?
答案 0 :(得分:1)
您是对的,Hadoop节点不得使用SOCKS代理进行通信。您可以通过在群集端 final 上标记SocketFactory设置来实现此目的。
在群集上的core-site.xml
中,将 final 标记添加到默认的SocketFactory属性中:
<property>
<name>hadoop.rpc.socket.factory.class.default</name>
<value>org.apache.hadoop.net.StandardSocketFactory</value>
<final>true</final>
</property>
显然,您必须重新启动群集服务。