通过 socks 代理将 YARN 作业提交到远程 Hadoop 集群

Submit YARN jobs to remote Hadoop cluster via socks proxy

我正在尝试通过 SOCKS 代理访问受防火墙保护的 Hadoop 集群 运行 YARN。集群本身没有使用代理连接——只有我的本地机器(例如笔记本电脑)上的客户端 运行 通过 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)

其中 host1host2 都是 hadoop 集群的一部分。

我想发生的事情是 hadoop 节点也在尝试通过 socks 代理进行通信,这显然失败了,因为每个主机上都不存在代理服务器。除了设置专用代理服务器之外,还有其他方法可以解决此问题吗?

你说得对,Hadoop 节点不能使用 SOCKS 代理进行通信。您可以通过在集群端标记 SocketFactory 设置来实现这一点 final.

在集群上的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>

显然,您必须重启集群服务。