Overview
之前一直使用scala写spark pipeline,这次试着使用PySpark来模拟,主要希望熟悉一下Python的自动化测试的文件组织、mock用法、三种verification方法、code Linting,以及docker化prd-code。
文件结构
可以不用跟golang一样与prd-code在同一个目录下。当然也可以这样做。但是单独一个test目录可能会更清晰。
test
我用过的测试部分是unittest和pytest,而在Python3里面,unittest好像有了长足进步,可以灵活配置,可以mock等等,而且是built-in的。
验证
常用的验证是跑ut来confirm,这里使用了三种方式,
- 常规unit test
- 可以直接在IDEA跑的
- local container
- 在本地起一个container,然后在container里面配置所需环境,然后再运行ut
- 隔离local环境,仅需要minimal环境,有利于deploy
- 配置
Dockerfile
- 注意workdir
- 可以使用docker build,直接把
prd-code
制作成一个image,然后将其发布,利用k8s来部署、分发和弹性伸缩
- gitlab ci/cd
- remote container
- 跟step2类似,只是从本地container切换为Gitlab Runner container
- 配置
.gitlab-ci.yml
遇到的问题
- Python环境
- 与IDEA结合,通常用requirements.txt来管理lib,而Python与IDEA的结合可以是system级别的(共用lib),也可以是virtual级别的(隔离lib)
- 与Spark结合,有时候切换Python环境之后就跑不起来了,此时需要根据错误来定位解决问题
- codebase差异
- github没有gitlab的ci/cd,只能用类似Travis CI这样的来代替,但是这样一来就需要使用
Travis CI
的语法来适配.gitlab-ci.yml
- 刚刚看到,其实github也推出了自己的ci/cd服务,叫GitHub Action,其中Spark也切换过来了
- 此时,我也把这个项目的ci使用GitHub Page run起来了
- github没有gitlab的ci/cd,只能用类似Travis CI这样的来代替,但是这样一来就需要使用
Reference
- PYTHON - AUTO GENERATE REQUIREMENTS.TXT
- How to enable or disable GitLab CI/CD
- Setting Up GitLab CI for a Python Application
- Building Minimal Docker Containers for Python Applications
- Dockerize your Python Application
- pyspark crash issue 1
- pyspark col function not found issue
- CI/CD using GitHub Action - example
- my source code
PREVIOUS北京一周
NEXTgolang多线程与异步关注点