hdfs-ftp-server:基于hdfs的ftp服务器的设计与技术实现

本文介绍了基于hdfs-over-ftp改造的FTP服务器,支持hadoop2.9.2和Kerberos认证,提供Docker镜像。项目设计目标为产品化和使用标准配置连接Hadoop,技术实现包括Apache FTP Server、HDFS连接及操作、Shadow和Distribution插件的使用。详细代码和文档可在GitHub和DockerHub获取。
摘要由CSDN通过智能技术生成

项目基于hdfs-over-ftp进行升级改造,支持hadoop2.9.2,支持高可用连接及kerberos认证,并提供docker镜像,开箱即用,适用于生产环境。
本文主要对项目的设计和实现思路及使用技术进行记录。具体代码和使用方法可直接查看github和dockerhub说明文档。
GitHub:https://github.com/linshenkx/hdfs-ftp-server 和DockerHub:https://hub.docker.com/r/linshen/hdfs-ftp-server

一 设计

1 参考

项目主要参考了 https://github.com/iponweb/hdfs-over-ftphttps://github.com/garyfub/hdfsftpserver ,另外启动脚本还参考了https://github.com/fayson/cdhproject/tree/master/hdfs-over-ftp-run的实现。

网上比较主流的hdfs-ftp教程都来自于https://github.com/iponweb/hdfs-over-ftp,但是里面的代码都是12年的了。与其跟着那些教程去改依赖版本,然后看着一堆过时的方法修修补补。不如直接用新版本进行实现。也确实有人这么做了:https://github.com/garyfub/hdfsftpserver。但是做得不彻底,主要只是代码层面的更新(而且有些还写得不完整),其与hadoop的连接,属性的配置等仍用的是原来的思路。还不能作为产品用于生产环境。

2 设计目标

  1. 产品化
    对于使用者来说,最讨厌的就是那些需要自己下载源码编译打包的软件,特别是windows开发者,往往死于编译环境的配置中。所以项目产品应该可以直接以二进制包的方式提供,解压即可使用,对conf文件夹下配置文件修改即可实现定制,而不用重新编译打包。最好还能做成镜像,属性从环境变量中读取,方便容器化使用。
  2. 使用标准的配置方式连接hadoop
    原来的实现是提供hdfs-uri属性配置,当然你也可以提供更多的属性在properties文件里,自己去读取然后连接上hadoop。可是既然要自己填配置了,为什么不直接从现成的配置文件里读取呢?原方法只使用于最简单的环境,不具有普遍适用性。

二 技术实现

1 apache ftp server

官方文档:https://mina.apache.org/ftpserver-project/documentation.html
使用起来其实很简单,入门教程可以看:apache ftp server的简单入门(java应用内嵌ftp server)
完整配置直接看官方文档。
核心就是把FileSystemFactory换成我们使用hdfs的实现。
另外还可以完成端口定制、被动模式及端口范围、ssl、以及用户权限控制等。
值得一提的是,由于我们文件系统的实现是hdfs,如果是kerberos环境,是要提供指定的principal和keytab的。在这种情况下,似乎ftpserver的权限限制无法生效(即匿名用户同样拥有principal对应的完整读写权限),以principal的实际用户权限为准。非kerberos环境没测试过。所以用户的配置我是直接用users.properties。如果要设计得复杂一点的话可以从数据库中读取用户数据,principal和keytab也可以根据用户的不同而切换。不过我决定没必要。

2 hdfs连接及操作

主要指使用hdfs实现apache ftp server 规定的FtpFile、FileSystemView接口。
另外还需要完成hdfs的配置读取,kerberos登录等。

3 shadow插件

最开始的时候不想搞那么麻烦,就想直接一个可执行jar包搞定。
本来用的是gradle自带的的 fatJar task,然后发现在独立运行的时候会有kerberos的认证错误org.apache.hadoop.security.AccessControlException: Client cannot authenticate via:[TOKEN, KERBEROS] ,这里已经有了大佬做了详细分析:https://arch-long.cn/articles/hadoop/Kerberos-Exceptions.html,简单来说就是打包的时候 META-INF/services/ 丢失了一些文件,给出的方法就是maven-shade-plugin插件并指定transformer。
我使用的是gradle,对应的配置参考https://github.com/johnrengelman/shadow/issues/105下的讨论。

不过最后决定使用distribution发布的时候,其实就没有做成可执行jar包的必要了。

4 distribution插件

这个是为了可以使用gradle自动生成tar格式的压缩包进行发布。
使用教程参考:https://docs.gradle.org/current/userguide/distribution_plugin.html
这里进行记录是因为在使用copyBin复制bin文件夹下面的脚本的时候发现指定的fileMode最终无法生效,得改成在distributions配置中使用filesMatching(’**/*.sh’) { mode = 0744 }

distributions {
    main {
        distributionBaseName = 'hdfs-ftp-server'
        contents {
            from { 'build/package' }
            filesMatching('**/*.sh') { mode = 0744 }
        }
    }

}

另外还需要注意的就是gradle task的dependsOn依赖编排顺序。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值