写点什么

分布式 hdfs-over-ftp 工具实现方案

  • 2022 年 7 月 28 日
  • 本文字数:3246 字

    阅读完需:约 11 分钟

本文作者为中国移动云能力中心大数据团队软件开发工程师黄新安。本文基于开源 hdfs-over-ftp 组件存在的数据传输效率低、负载不均衡等问题,实现分布式的 hdfs-over-ftp 工具,并提供了自动化运维与指标监控方案,供大家参考。

背景

近年来,随着云计算和大数据技术的不断发展,越来越多的企业采用大数据技术来分析与储存海量数据。Hadoop 分布式文件系统 HDFS 具有高容错性并提供了高吞吐量的数据访问,非常适合大规模数据集上的应用。

开源组件 hdfs-over-ftp 是构建在 HDFS 之上的一个 FTP 服务器,即为提供 FTP 协议访问 HDFS 的工具,用户可以通过 FTP 协议访问 HDFS,简单易用的实现了对 HDFS 文件系统的上传和下载。

在大规模数据传输场景下,若部署单个 hdfs-over-ftp 服务进行数据传输,单个节点的 CPU、内存、网络带宽、磁盘 I/O 等资源是有限的,将会导致节点压力过大,数据传输必然耗时,此时只能通过部署多个 hdfs-over-ftp 服务来解决。服务需要暴露多个地址,需要人为地去分配具体的业务到不同地址的服务上。当增加或减少 hdfs-over-ftp 服务器时应用侧需要修改配置或者代码来连接服务,对应用侧不透明,服务扩展不便,且多个服务之间无法做到负载均衡。

因此,我们考虑在 HDFS 上构建一个分布式 FTP 工具,用户无需手动配置多个 FTP 地址,也无需提前做好请求的划分,即可使用一个 FTP 地址实现数据的统一访问,根据节点负载情况均衡的分配任务。

实现原理

分布式 hdfs-over-ftp 是提供 FTP 协议访问 HDFS 的工具,包含 FTP Server 和 DataProxy 两个组件。



分布式 hdfs-over-ftp 工具技术架构

FTP Server

主要提供 FTP 协议处理,接收 FTP Client 端命令。FTP Server 通过 ZooKeeper 获取 DataProxy 列表并根据最小连接数负载均衡算法匹配到对应的 DataProxy 节点进行任务调度。可采用 haproxy+keepalived 方式实现双机热备高可用,确保其中一个节点故障时系统依然正常运行。通常选择集群内的非数据节点(安装了 Hadoop 客户端)部署 FTP Server 组件,比如 NameNode 节点,这样可以避免写本地 DataNode 导致数据倾斜。

DataProxy

负责与 FTP Client 交互数据,包括端口管理、传输任务管理、hdfs 文件文件与目录操作等,通知 FTP server 任务传输结果消息。DataProxy 需要注册到注册中心 ZooKeeper 中。注册中心管理所有 DataProxy 节点的 IP 地址并会定时对每个实例进行健康检查和心跳检测。当实例服务不可用时,注册中心将其标记为失败,失败的节点在分配时不会被选中。这样,注册中心就维护了一个可用的实例列表地址。

实现方式

分布式 hdfs-over-ftp 工具的实现流程如下:

1.FTP 客户端发起数据传输请求,FTP server 接收到含有用户名和密码的认证信息 2.认证通过后获取连接数负载最小的 DataProxy 节点,更新该节点的连接负载信息 3.在被动模式(PASV)下通知该 DataProxy 节点进行监听 4.DataProxy 收到 FTP server 的开放端口请求后,开放某一个数据服务端口等待 FTP 客户端的连接,并将开放的数据服务端口发送给 FTP server5.FTP server 收到 DataProxy 消息后返回节点地址和端口给 FTP 客户端,ftp 客户端连接对应的地址传输数据以实现与 HDFS 进行文件读写操作 6.数据传输完成后 DataProxy 向 FTP server 发送数据关闭连接。FTP server 更新该 DataProxy 节点的连接负载信息。在主动模式(PORT)下,客户端向 FTP sever 主动发送数据连接端口,FTP sever 通知该节点与客户端端口建立数据连接。具体流程如下图所示



pasv 模式



port 模式

在实际传输过程中可能会出现网络中断及传输异常等情况,此时传输工具需要支持在原有文件基础上继续传输,降低网络带宽压力,提高传输任务的时效性,减少业务时延,然而传统的 hdfs-over-ftp 不支持断点续传及文件重命名等功能,为此需要改写相关源码,具体如下:

阅读 FTP 源码,可以看到 FTP server 包的 STOR 类中的 execute 方法会调用 api OutputStream org.apache.ftpserver.ftplet.FtpFile.createOutputStream(long offset) throws IOException,因此需要 hdfs-over-ftp 继承该方法,实现文件的断点上传。

FSDataOutputStream out = null;
EnumSet<CreateFlag> flags = EnumSet.of(CreateFlag.CREATE, CreateFlag.OVERWRITE);
if (offset == 0) {
out = fileSystem.create(path,
FsPermission.getFileDefault().applyUMask(FsPermission
.getUMask(fs.getConf())), flags, fileSystem.getConf()
.getInt("io.file.buffer.size", 4096), fileSystem
.getDefaultReplication(path), fileSystem
.getDefaultBlockSize(path), null);
} else {
out = fileSystem.append(path,
fileSystem.getConf().getInt("io.file.buffer.size", 4096));
}
复制代码

同理,hdfs-over-ftp 继承 InputStream org.apache.ftpserver.ftplet.FtpFile.createInputStream(long offset) throws IOException方法实现文件的断点下载。

FSDataInputStream in = fileSystem.open(path);in.seek(offset);
复制代码

文件重命名 api:boolean org.apache.ftpserver.ftplet.FtpFile.move(FtpFile destination) ,继承该 api 方法,实现 hdfs-over-ftp 文件的重命名。

boolean retVal = false;Path path = new Path(path);Path destFilePath = new Path(destinationFtpFile);if (fileSystem instanceof DistributedFileSystem) {    DistributedFileSystem dfs = (DistributedFileSystem)fileSystem;    dfs.rename(path, destFilePath, Options.Rename.OVERWRITE);    retVal = true;} else {    retVal = fs.rename(path, destFilePath);}
复制代码

当集群中需要部署大量的数据传输节点 DataProxy 时,手动安装部署工作量很大,需要运维实施人员每个节点手动部署、修改配置、启停服务,不便于配置管理与维护,当传输工具出现故障时缺乏有效的监控手段。为此可以使用开源组件 Apache Ambari 可扩展架构,通过模板式样配置结合 Python 脚本方式将分布式 hdfs-over-ftp 工具打包成 rpm 包形式纳管到平台进行自动化部署、运维与监控。




通过集成 Ambari 这种部署、管理和监控的集群工具,将会大大减少人员部署实施运维投入时间及出错概率,提高工具的易用性,可维护性。

工具的使用

客户端使用分布式 hdfs-over-ftp 工具方式基本 hdfs-over-ftp 相同,唯一需要加的参数为 remoteVerificationEnabled,需要设置为 false,原因如下:

当 FTP 被动模式连接建立后,需要 FTP 服务器开一个数据传输端口并告知客户端用该端口进行数据传输。但是由于服务端 Ftp server 会将传输请求转发到实际的 DataProxy 节点上去,并且数据传输端口是在该 DataProxy 节点上。由于校验的存在客户端请求的服务器节点是 FTP server,但是数据传输建立的服务器是 DataProxy 节点,这就出现了尝试数据连接的主机与服务器不一致,导致校验不通过抛出该异常。

连接登录:和传统的 FTP 相同,当 FTP server 部署在一个节点上时,用户只需要连接对应的 FTP server ip 和 port;当 FTP server 为高可用部署时,用户连接时使用高可用的 FTP server 虚拟 ip 和 port。

下面对修改代码后的结果进行测试。断点上传或下载的 FTP 指令为 restart {marker},从指定的标志 marker 处,重新开始 get 或 put,如:restart 93000。可以选择较大的文件效果更明显。



总结与思考

分布式 hdfs-over-ftp 数据传输工具,解决了现有技术方案下在单节点有限资源下数据传输效率差、横向扩展 hdfs-over-ftp 服务负载不均衡问题。通过改写 hdfs-over-ftp 源码支持断点续传及文件重命名等功能,增强了工具的功能,降低了网络带宽压力,减少了业务时延。同时,集成 Ambari 提供了工具的自动化运维与指标监控方案,使得应用工具便于维护与实时监控告警。

当前工具使用最小连接数算法判断数据传输节点的负载情况,该方法没有考虑到每台服务器性能状态的差异,容易导致服务器间的负载不平衡,后续可以考虑使用一些改进的动态加权最小连接数算法,根据各个边端节点的资源使用情况实现负载动态均衡分配。

用户头像

移动云,5G时代你身边的智慧云 2019.02.13 加入

移动云大数据产品团队,在移动云上提供云原生大数据分析LakeHouse,消息队列Kafka/Pulsar,云数据库HBase,弹性MapReduce,数据集成与治理等PaaS服务。 微信公众号:人人都学大数据

评论

发布
暂无评论
分布式 hdfs-over-ftp 工具实现方案_移动云大数据_InfoQ写作社区