东方明珠的数据中台的离线文件接入规范要求数据满足CSV格式,即遵循国际标准RFC4180。不少业务线期望期望能用最小的开发成本来编解码这些CSV数据文件。此项目应运而生,它通过控制器调度任务脚本的模式,支持业务侧快速的定制化实施自己的CSV编解码逻辑,开发人员只需要具备简单的Shell脚本开发能力即可。
建议业务侧在部署服务器(建议CentOS 7.x)上先安装好依赖的开源工具:
sudo yum install -y python3 jq
pip3 install --user PyMySQL csvkit
[ "root" == "$USER" ] && ln -sf $HOME/.local/bin $HOME/bin || true安装此项目,查看控制器(类似kubectl、systemctl等命令行操作中心)的命令行帮助:
git clone https://github.com/opgcn/dscsv.git
cd dscsv/
chmod a+x ./ctl.sh
./ctl.sh help任务,指一个由业务线开发和维护的脚本程序,其通过csvkit、jq等开源工具,实现业务线自己的CSV数据编解码逻辑,此任务在控制器中被加载执行。每个任务可以是有始有终的批量处理,也可以是有始无终的管道处理。
每个任务都有一个唯一的ID,用于完成特定的CSV编解码和数据文件搬家任务。每个任务的实现位于tasks/${TASK_ID}。数据中台在此项目中实现了大量示例任务,覆盖各种实际数据接入/导出需求,业务侧技术人员可以阅读tasks/目录下的官方任务,了解任务的一般撰写方式,然后编写自己所需的任务。
| 示例任务ID | 说明 |
|---|---|
eg-json-to-csv.sh |
将JSON文件导出到CSV |
eg-excel-to-csv.sh |
将Excel表导出到CSV |
eg-nginxlog-to-csv.sh |
将nginx的归档日志文件导出到CSV |
eg-mysql-to-csv.sh |
将mysql表导出到CSV |
eg-csv-to-mail.sh |
将CSV文件转换成excel并邮寄 |
eg-api-to-csv.sh |
访问API接口并导出到CSV |
同时,建议业务线对接数据的技术人员了解命令行开源工具csvkit、jq的基本使用。
执行任务时,只需要./ctl.sh ${TASK_ID}即可,控制器会完成任务调度、日志处理等功能。详细信息参考./ctl.sh help提示。
这个dscsv工具怎么把生成的CSV数据文件上传给数据中台?
dscsv用以解决数据编解码问题,对于数据文件传输问题可参考dsftp-client或自行实现。
子任务较为复杂,需要传参时怎么办?
如果通过框架调用如./ctl.sh task-id.sh arg_a arg_b arg_c,在task.sh中arg_a arg_b arg_c是新的$@。这个做法很实用,例如业务线可以取命令行参数$1作为取数的日期,日后发现任务失败时,可以通过传参来重新跑那天的任务。
我是你们数据中台一个业务线,要上传多个数据类型的离线文件,我是把多个数据类型放在一个任务里,还是分成多个好?
如果各个数据类型生产时效性一致,Crontab调度策略也一样,可以考虑放在一个任务内,否则放多个任务脚本;开发工作量是相似的,但都很简单。
我们子公司有牛逼的专业开发能力,不打算用你们这个很low的Shell脚本方式开发离线CSV数据上传,你们总部中台怎么看?
开发语言无谓贵贱,大多数业务线和数据中台对接时,都是业务线的运维兄弟顶在一线,他们很辛苦,所以此项目采用Shell作为二次开发语言,方便他们。如果业务线采用其它语言自行开发,建议将CSV生成模块和文件传输模块解耦开来,这样出现Bug的时候方便定位和修复,方便运维的兄弟处理故障。