python 3.6+
如果没有python36,则执行下列命令添加36的源并安装
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install python3.6 python3.6-dev
如果没有 add-apt-repository
命令,执行下列命令安装
sudo apt install software-properties-common
下面为安装 10 版本,源的添加见这里。 也可以安装其它版本
sudo apt-get install postgresql-10
sudo -u postgres createuser -P micl
sudo -u postgres createdb mlpm_jobs -O micl
sudo -u postgres createdb mlpm_jobs_result -O micl
数据库mlpm_jobs
为本系统使用数据库,mlpm_jobs_result
为celery_result_backend使用数据库。
可根据实际需求修改数据库名和用户名。
sudo apt install rabbitmq-server
sudo rabbitmqctl add_user micl micl
sudo rabbitmqctl add_vhost mlpm_jobs_server
sudo rabbitmqctl set_user_tags micl mlpm_jobs
sudo rabbitmqctl set_permissions -p mlpm_jobs_server micl ".*" ".*" ".*"
可根据实际需求修改用户名等配置信息。
系统的api文档使用 apidoc 生成,因此还需要有 nodejs 环境,并安装 apidoc。 这里不去详述 nodejs 和 apidoc 的安装方式。
npm i -g apidoc
-
克隆。
git clone https://github.com/Yuvv/mlpm-jobs.git
-
安装依赖。
# 创建虚拟环境 virtualenv venv # 启用虚拟环境之后安装依赖 pip install -r requirements.txt
-
修改配置文件及初始化数据库。
# 将 `settings/local_settings.example.py` 复制一份,并修改其中的数据库及celery相关配置 cp settings/local_settings.example.py settings/local_settings.py # 使用 alembic 进行数据库初始化 alembic revision --autogenerate -m "init database" # 得到对应版本号之后进行审计 alembic upgrade xxxx
-
启动 celery。非windows系统可以不加
--pool
参数celery -A tasks worker -l info --pool=solo
-
启动系统。(注意这里不要通过
app.py
启动,这将导致 celery 无法使用,使用 pycharm 的话新建配置从wsgi.py
启动即可)python wsgi.py
系统使用 flask 编写。 结构上其实没什么可说的。
utils
模块主要包括了一些公用的模块,像什么获取参数啊,错误处理啊,中间件啊什么的。
tasks
模块主要包括了核心的异步任务这一块的内容。tasks.general
预留的作为所有对外提供的任务。
其它个人如模块名字。
认证目前采用最简单的 HTTP Basic Auth 的方式,只不过密码是动态生成的。
所有的api请求都需要在 url 中携带UTC时间戳参数参数名为_
,值为UTC时间的秒数,即_=1525568925
的形式。
这个时间戳用来计算过期时间,请求的有效期为 60s,超过这个时间则会报请求过期错误(错误码2100)。
动态密码的计算方式为:dynamic_pass=MD5(真实密码@UTC时间戳)
。注意这里的时间戳必须和上面的_
参数值一致。
数据库推荐使用 postgresql ,坑比较少,最好使用 10 版本。 当然使用其它的数据库也没关系,都支持。
ORM 工具使用的 sqlalchemy ,比较灵活,学习上有一定难度。
数据库迁移管理工具使用 alembic,sqlalchemy 作者编写,有保障。 在有些情况下自动迁移会失败,检测不到该懂,需要手动修改 DDL,不过影响倒不大。
迁移基本上就下面这两个命令,先自动生成迁移脚本,得到版本号之后进行迁移:
alembic revision --autogenerate -m "<message here>"
alembic upgrade "<version number here>"
生成的迁移文件可以自己查阅修改(基本不需要)。版本号可以简写前几个字母。
api 文档 没有使用python原生doc方式而是使用了 apidoc,方便好用。
具体的文档编写格式可以查阅一下官网,生成文档使用下面的命令即可:
apidoc -i apis -o docs/apidoc
如果需要新添加异步任务函数的话,直接在tasks.general
模块下面编写吧。
编写的函数装饰器中一定要设置base=MLPMAsyncTask
,否则无法识别。
编写完成测试无误的话再添加到数据库中吧。
目前没有添加相应的管理界面,直接修改数据库吧,字段也很短,把各个字段填写清楚就好了,尤其是函数文档那个字段。
当然如果想偷懒也是可以的,utils/helper.py
中有辅助添加的add_mlpm_task_func
函数,
可以使用他添加函数对象。
在 conf
目录下面有一些示例的配置文件,包括 celery 、uwsgi 、nginx ,可以参考。
配置中都是假设此工程位于/srv/www/sites/mlpm_jobs/
目录下的,如有需要可以对应更改。
-
celery daemon。
cp conf/celery/default/{celeryd,celerybeat} /etc/default/ cp conf/celery/initd/{celeryd,celerybeat} /etc/init.d/ chmod +x /etc/init.d/celeryd chmod +x /etc/init.d/celerybeat systemctl enable celeryd systemctl enable celerybeat
之后可以启动 celery worker。(beat 暂时没用,可以不启动)
service celeryd start # service celerybeat start
-
uwsgi。(当然配置文件放在哪不重要,这里放在根目录只是为了方便,而且里面还有一个
touch-reload
参数配置了这个文件的路径)cp conf/uwsgi.example.ini uwsgi_config.ini
之后可以使用 uwsgi 拉起服务:
uwsgi uwsgi_config.ini
如果遇到文件描述符和连接数限制错误,修改相应配置(具体数值可自行决定):
vi /etc/security/limits.conf # 添加下面两行(去掉注释) # * soft nofile 20480 # * hard nofile 20480 # 修改最大连接数 sysctl -w net.core.somaxconn=1024
-
nginx。(这个的配置比较灵活,conf 目录里面的示例也只是简单列了一下,更具具体情况来吧)
-
目前只有简单的几个 API ,且功能简单,可以根据需求修改。
-
涉及到 Spark 的任务都需要牵扯到文件,后续应该添加(大)文件上传的api,最好能上传到 HDFS。
-
临时编写,bug难免,看着用看着改吧。:joy::joy::joy: