美文网首页HDFS
通过代理服务访问 HDFS 集群

通过代理服务访问 HDFS 集群

作者: xudong1991 | 来源:发表于2021-09-07 16:42 被阅读0次

    背景

    在 HDFS 使用过程中,有时会需要一个类似代理的机制,即:通过一台或多台代理服务器,来代理某一批机器的 HDFS 访问。需要注意的是,大部分情况下,代理服务器只需要代理 NameNode 流量即可,不需要代理 DataNode 流量,因为认证、鉴权等关键操作只涉及到 NameNode。

    方案一: iptables 方案

    linux 的 iptables 是一个非常强大的工具,在本场景下,混合使用 iptables 的 SNAT 和 DNAT 功能就可以满足需求,方案概览如下:


    前提:

    1. 需要确保所有内部机器都能够连接到代理服务器, 且代理服务器能够连接到所有 HDFS NameNode。
    2. 代理服务器上不需要安装 HDFS 客户端,只需要做单纯的网络代理即可。

    要点:

    1. 首先,在内部机器上,使用 iptables 对 HDFS NameNode 流量配置 DNAT,destination 为代理服务器。
    2. 其次,在代理服务器上,使用 iptables 对 HDFS NameNode 流量组合配置 DNAT + SNAT,作为路由器使用。

    优点:

    1. 部署简单,不需要引入任何额外的软件,仅仅使用 iptables 就可以满足需求。
    2. iptables 实际上是操作了 linux 内核中的 netfilter 组件,netfilter 组件整体运行在内核态,效率很高。

    缺点:

    1. 配置复杂,在每个内部机器上,都需要对所有 NameNode 配置 DNAT(如果有多个目标集群的话)。
    2. 同样,在代理服务器上,也需要对所有 NameNode 组合配置 DNAT + SNAT.
    3. 不过,iptable 配置可以通过脚本来批量完成,因此问题不大。

    详细步骤

    以下面这个场景为例:

    1. HDFS 集群为 ns1,三个 NameNode 分别为:172.16.1.1,172.16.1.2,172.16.1.3
    2. 代理服务器为:172.31.100.100
    3. 内部机器为:192.168.1.5
    配置步骤
    1. 在内部机器 192.168.1.5 上,针对三个 NameNode 分别配置 DNAT,destination 统一为代理服务器,如果存在多个代理服务器,则可以任选一个。注意这里使用了三个中转端口(50000、50001、50002):
    echo 1 > /proc/sys/net/ipv4/ip_forward
    
    iptables -t nat -A OUTPUT -d 172.16.1.1 -p tcp --dport 9000 -j DNAT --to-destination 172.31.100.100:50000
    iptables -t nat -A OUTPUT -d 172.16.1.2 -p tcp --dport 9000 -j DNAT --to-destination 172.31.100.100:50001
    iptables -t nat -A OUTPUT -d 172.16.1.3 -p tcp --dport 9000 -j DNAT --to-destination 172.31.100.100:50002
    
    1. 在代理服务器 172.31.100.100 上,针对三个 NameNode 组合配置 DNAT + SNAT,作为路由器使用:
    echo 1 > /proc/sys/net/ipv4/ip_forward
    
    iptables -t nat -A PREROUTING -p tcp --dport 50000 -j DNAT --to-destination 172.16.1.1:9000
    iptables -t nat -A POSTROUTING -d 172.16.1.1 -p tcp --dport 9000 -j SNAT --to 172.31.100.100
    
    iptables -t nat -A PREROUTING -p tcp --dport 50001 -j DNAT --to-destination 172.16.1.2:9000
    iptables -t nat -A POSTROUTING -d 172.16.1.2 -p tcp --dport 9000 -j SNAT --to 172.31.100.100
    
    iptables -t nat -A PREROUTING -p tcp --dport 50002 -j DNAT --to-destination 172.16.1.3:9000
    iptables -t nat -A POSTROUTING -d 172.16.1.3 -p tcp --dport 9000 -j SNAT --to 172.31.100.100
    

    其它

    1. 通过代理服务器访问 HDFS NameNode 时,NameNode 的审计日志中将无法记录准确的客户端 IP 地址,而是统一记录为代理服务器的 IP 地址。
    2. 可以设置多个代理服务器,此时,在内部机器的 iptables DNAT 配置中,可以选择合适的 server 作为 destination.
    3. iptables 支持域名,可以使用域名代替 IP,更方便一点。
    4. iptables 中配置中转端口的时候,一些 HDFS 的内部端口需要避开,免得混淆(比如 9000、8020 等),最好找一些不常用的端口范围来配置(例如50000-60000)。

    方案二:socks5 代理软件方案

    socks5 代理比 http 更加底层,效率也更高,是比 http 代理更好的选择,该方案概览如下。这种方式比较复杂,另外也涉及一些关于代理上网的敏感内容,因此不再详述。

    相关文章

      网友评论

        本文标题:通过代理服务访问 HDFS 集群

        本文链接:https://www.haomeiwen.com/subject/ojrpwltx.html