本文转载自微信公众号《铭哥的IT随笔》,作者:IT哥。转载本文请联系铭哥IT随笔公众号。大家好,我是明哥!本博文是《根据FTP状态文件检测结果触发JENKINS数据同步作业》系列文章的最后一篇。再来看看FTP与本地文件系统的桥梁——CurlFtpFS.1背景回顾在客户现场,每天都会批量生成大量的CSV文件存储在FTP系统中。这些CSV文件需要导入到大数据平台的HIVE数仓进行后续的离线分析,目前HIVE数仓的离线分析作业是使用JENKINS进行调度的。由于每天都会产生这些CSV文件,而且文件数量比较多,数据量也比较大,所以初步打算使用DATAX在FTP上导入CSV文件。但是在调度系统JENKINS中,如何检测ftp上的csv文件是否准备好,及时触发DATAX导入作业就成了一个问题。为了探索和验证JENKINS中FTP文件的检测和触发机制,笔者基于vsftpd搭建了一个FTP服务器,通过CurlFtpFS将远程FTP目录挂载到本地文件系统。以下是正文。2curlftpfs和FUSE介绍CurlFtpFS是一个基于libcurl的用户态文件系统,提供对远程FTP节点上文件系统的访问,允许用户像访问本地文件系统一样访问远程FTP节点上的文件系统。CurlFtpFS是一个基于FUSE和libcurl的用于访问FTP主机的文件系统。它具有SSL支持,通过隧道HTTP代理连接,并在服务器超时时自动重新连接。所谓FUSE(FilesysteminUserspace),即用户态文件系统,是指完全在用户态而不是内核态实现的文件系统,其底层由Linux通过内核模块来支持:FUSE允许自定义文件系统在用户态实现,无需重新编译操作系统内核;最终用户最先进的应用程序可以通过通用的POSIXAPI读取FUSE文件系统中的文件;允许非超级用户在用户空间开发文件系统,普通用户也可以挂载FUSE;一般来说,FUSE包括一个内核模块和一个用户空间的FUSE服务进程,将应用程序对VFS的调用转交给这个用户空间的FUSE服务程序进行处理;您可以使用命令fusermount挂载和卸载FUSE文件系统;(使用命令manfusermount查看说明)FUSE架构原理和工作机制如下图所示:fuse-architecturefusefuse主要由三部分组成:FUSE内核模块、用户空间库libfuse和挂载工具fusermount:fuse内核模块:实现与VFS的对接,实现一个可以被用户空间进程设备打开的进程,当VFS发送文件操作请求时,将请求转换成特定的格式,通过设备。用户空间进程处理请求后,将结果返回给fuse内核模块,内核模块再发送Revert为Linux内核要求的格式返回给VFS;fuse库libfuse:负责与内核空间通信,接收来自/dev/fuse的请求,转换成一系列的函数调用,并将结果写回/dev/fuse;提供的函数可以挂载和卸载fuse文件系统,从linux内核读取请求,并向内核发送响应。libfuse提供了两个API:“高级”同步API和“低级”异步API。两个API都接收来自内核的请求,传递给主程序(fuse_main函数),主程序使用相应的回调函数进行处理。使用高级API时,回调函数使用文件名和路径,而不是inode,并且回调函数在请求处理完成时返回。使用低级API时,回调函数必须使用索引节点inode才能工作,并且必须使用一组单独的API函数发送响应;挂载工具:实现用户态文件系统的挂载;现在很多文件系统,出于易用性等各种考虑,提供了使用FUSE的方式,比如云原生的分布式文件系统JuiceFS,还有云原生的数据编排框架/内存分布式文件系统Alluxio,都是巧合提供FUSE服务:FUSE,可以将JuiceFS文件系统以POSIX兼容的方式挂载到服务器,海量云存储可以直接作为本地存储使用;AlluxioFUSE服务在Unix/Linux下提供了标准的POSIX文件系统接口,允许应用程序(如Tensorflow、PyTorch等)通过访问本地文件系统,无需修改代码即可访问Alluxio分布式文件系统中的数据;Alluxio和JuiceFS是数字化转型背景下笔者比较看好和关注的两朵云原生分布式文件系统;alluxio-fusejuicefs-fuse3Curlftpfs安装由于Linux操作系统的epel源自带curlftpfs,所以安装非常方便:yuminstallcurlftpfs;curlftpfs不是系统的常驻服务,不需要通过systemctl启动和停止;4将远程FTP目录临时挂载到本地文件系统可以使用命令curlftpfs将远程FTP目录临时挂载到本地文件系统:sudocurlftpfsftp://3.22.42.20:21/tmp/ftp1-ouser=awsftpuser:awsftpuser,rw,allow_othersudocurlftpfsftp://awsftpuser:awsftpuser@3.22.42.20:21/tmp/ftp2-orw,allow_othersudocurlftpfs3.22.42.20:21/tmp/ftp11-ouser=awsftpuser:awsftpuser,allow_other,no_verify_peer,no_verify_hostnamesudocurlftpfsawsftpuser:awsftpuser@3.22.42.20:21/tmp/ftp21-oallow_othercurlftpfs命令的参数比较多,需要注意比较重要的参数allow_other、allow_root、user=user:password等。对于更多关于命令curlftpfs的详细信息,请mancurlftpfs;5将远程FTP目录永久挂载到本地文件系统。使用命令curlftpfs挂载的FTP目录在服务器重启后失效。如果要实现永久挂载,需要更改文件/etc/fstab,添加如下条目:curlftpfs#awsftpuser:awsftpuser@3.22.42.20:21/tmp/ftp3fuseauto,user,uid=1000,allow_other,_netdev00curlftpfs#3.22.42.20:21/tmp/ftp31保险丝user=awsftpuser:awsftpuser,auto,user,uid=1000,allow_other,_netdev00curlftpfs#ftp://3.22.42.20:21/tmp/ftp32保险丝user=awsftpuser:awsftpuser,auto,user,uid=1000,allow_other,_netdev00curlftpfs#ftp://3.22.42.20:21/tmp/ftp33fuseuser=awsftpuser:awsftpuser,auto,user,uid=1000,allow_other,_netdev00以上参数含义与命令curlftpfs的参数一致;图6:“基于FTP状态文件检测结果触发JENKINS数据同步作业”的最终解决思路概览,思路总结如下:首先,使用CurlFtpFS将远程FTP具体目录映射到本地文件系统;然后使用jenkins插件FSTrigger监控映射到本地文件系统的状态文件,监控的时候当状态文件为READY时,触发数据同步作业;也可以在jenkins中编写groovy脚本代码,监听映射到本地文件系统的状态文件,当监听到状态文件READY时,触发数据同步作业;数据同步作业可以直接使用hiveload命令将映射到本地文件系统的csv数据文件加载到HIVE中;(前提:CurlFtpFS节点需要安装HIVE客户端);HIVELOAD直接同步数据的方式不稳定或效率低下,可以使用datax直接将远程ftp数据文件导入HIVE;
