客户端访问双网卡hadoop集群的HDFS

集群部署过程中遇到一个这样的问题:外部网络无法通过IP直接访问内部网络的Hadoop NameNode和DataNode。比如,我们外部有一个独立的flink集群,上跑了一个流式任务,将数据写入到远程的hdfs上,发现sink时是可以在hdfs上创建隐藏文件(in-progress)的,in-progress文件大小始终是0;而且在checkpoint时会报错,无法将in-progress文件变成finished文件。报错信息如下:

其中,192.168.16.2是hadoop集群的内网ip。

1、我们先来看下Client如何与NameNode、DataNode通信:

Client首先会和NameNode通信,获取Hadoop的存储块信息。其中Hadoop负责命名空间的维护、存储块的复制、数据块在DataNode中的信息等。

如果Client只是进行目录结构的查询,那么只需要和NameNode通信即可。如果需要获取数据块,那么还需要通过获取到的内容与DataNode进行交互。Client和Hadoop集群的通信步骤如下:

说明:看到这里,我们就可以解释上面的sink时可以创建in-progress文件,但是checkpoint时无法写入数据的问题了。因为创建文件时和NameNode通信的,写数据时和DataNode通信的。

2、通信协议:

所有 HDFS 通信协议都位于 TCP/IP 协议之上,通过RPC的方式通信;按照设计,NameNode 从不发起任何 RPC,它只响应 DataNode 或客户端发出的 RPC 请求。

3、根据官方文档中Hadoop可以通过配置RPC的几个参数来支持混合网络:

3.1)Ensuring HDFS Daemons Bind All Interfaces:

默认情况下,HDFS endpoints被指定为主机名或 IP 地址。 在任何一种情况下,HDFS 守护进程都将绑定到单个 IP 地址,使守护进程无法从其他网络访问。

解决方案是对服务器端点进行单独设置,以强制绑定通配符 IP 地址 INADDR_ANY,即 0.0.0.0。

3.2)Clients use Hostnames when connecting to DataNodes

默认情况下,HDFS 客户端使用 NameNode 提供的 IP 地址连接到 DataNode。 根据网络配置,客户端可能无法访问此 IP 地址。 修复方法是让客户端执行他们自己的 DataNode 主机名的 DNS 解析。

3.3)DataNodes use HostNames when connecting to other DataNodes

极少数情况下,DataNode 的 NameNode 解析 IP 地址可能无法从其他 DataNode 访问。 解决方法是强制 DataNode 为 DataNode 间连接执行自己的 DNS 解析。

总结:

也就是说我们通过配置使NameNode能够监听所在的两个网络接口中配置的IP,使数据节点之间的Socket通信通过主机名进行,这样如果在内网中我们只需要将/etc/hosts中的主机IP设置为内网IP即可实现数据交换只经过内网,而外部网络通过外部网络的IP与它通信,同样没有问题。

参考:

官方文档:

Original: https://blog.51cto.com/u_5650011/5394784
Author: 赶路人儿
Title: 客户端访问双网卡hadoop集群的HDFS

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/517254/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球