【Prefect】Prefect一:python任务调度工具 Prefect | 可视化任务工具 | Python自动化的终极武器 | 高效数据管道管理
一、产品介绍
1、官方 Github
https://github.com/PrefectHQ/prefect
2、官方文档
https://docs.prefect.io/3.0/get-started/index
3、Pgsql说明
正确的python链接pgsql如下:
import psycopg2
from sqlalchemy import create_engine
def connect_with_psycopg2():
try:
conn = psycopg2.connect(
dbname="prefect",
user="prefect_user",
password="123456-AbCd",
host="127.0.0.1",
port="5432"
)
print("Connection successful with psycopg2!")
except Exception as e:
print(f"Connection failed with psycopg2: {e}")
finally:
if conn:
conn.close()
def connect_with_sqlalchemy():
try:
engine = create_engine("postgresql://prefect_user:123456-AbCd@127.0.0.1:5432/prefect")
with engine.connect() as connection:
print("Connection successful with SQLAlchemy!")
except Exception as e:
print(f"Connection failed with SQLAlchemy: {e}")
if __name__ == "__main__":
connect_with_psycopg2()
connect_with_sqlalchemy()
如何我们将密码设置为
123456-Ab@
整体字符串如下:postgresql://prefect_user:123456-Ab@@127.0.0.1:5432/prefect
链接失败!所以不要将密码设置为含有@
的字符串
def connect_with_sqlalchemy():
try:
engine = create_engine("postgresql://prefect_user:123456-Ab@@127.0.0.1:5432/prefect")
with engine.connect() as connection:
print("Connection successful with SQLAlchemy!")
except Exception as e:
print(f"Connection failed with SQLAlchemy: {e}")
if __name__ == "__main__":
connect_with_sqlalchemy()
二、搭建私有Prefect Server
私有化搭建,通过pgsql作为整个数据库
1、Docker搭建 PGsql
这里如果服务器拉不到最新版本的pgsql,可以通过科学上网做一份自己的pgsql镜像
这里我使用自己创建的镜像 :registry.cn-beijing.aliyuncs.com/dkzx_test/postgres
version: '3'
services:
postgres:
image: registry.cn-beijing.aliyuncs.com/dkzx_test/postgres:latest
container_name: postgres
environment:
POSTGRES_DB: prefect
POSTGRES_USER: prefect_user
POSTGRES_PASSWORD: 123456-AbCd
volumes:
- /home/postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
restart: always
注意:
1、这里要给 /home/postgres_data
足够的权限
2、Docker搭建 Prefect
启动成功如下:
2.1、打Prefect镜像
因为 prefect没有最新的Docker Image 所以这里我们自己通过Dockerfile创建一个Prefect镜像
同样这里如果服务器拉不到最新版本的 Prefect,可以通过科学上网做一份自己的Prefect镜像
这里我使用自己创建的镜像 :registry.cn-beijing.aliyuncs.com/dkzx_test/python:3.9-slim
# unc_name)
#n 作为基础镜像
FROM registry.cn-beijing.aliyuncs.com/dkzx_test/python:3.9-slim
# 设置工作目录
WORKDIR /app
# 更新 pip 并安装 Prefect
RUN pip install --upgrade pip && \
pip install -U prefect
# 运行 Prefect 以显示版本
CMD ["prefect", "--version"]
上面的 Dockerfile 通过打包程序打包成 Docker Image
docker build -t <docker-image-name> .
然后将image推送到私有镜像仓库,或者直接放本地直接启动
这里我们推送到私有镜像仓库registry.cn-beijing.aliyuncs.com/dkzx_test/prefect:customer-define-new
2.2、编写Prefect Docker-compose
下面注意几个点:
1、PREFECT_API_DATABASE_CONNECTION_URL :这个是连接pgsql的字符串信息,这里要使用前缀postgresql+asyncpg:
,并且这里我们踩坑密码一定不能含@
结尾数据
2、PREFECT_API_URL:这个对外开放API一定要用0.0.0.0
的IP,不要用127.0.0.1
3、command:如果我们的Dashboard
想被外网访问一定要指定host为0.0.0.0
version: "3"
services:
prefect-server:
image: registry.cn-beijing.aliyuncs.com/dkzx_test/prefect:customer-define-new
container_name: prefect_server
environment:
PREFECT_API_DATABASE_CONNECTION_URL: postgresql+asyncpg://prefect_user:123456-AbCd@127.0.0.1:5432/prefect
PREFECT_API_URL: http://0.0.0.0:4200/api
ports:
- "4200:4200"
command: ["prefect", "server", "start","--host", "0.0.0.0"]
restart: always
3、PGsql初始化
通过启动 prefect_server 会在指定的数据库自动创建如下所有的数据库表
4、公网可访问的裸奔服务
不得不吐槽一下,启动的私有部署Prefect是没有登录权限的
也没有token
5、Nginx 配置 Basic Auth
因为 Prefect 是没有登录权限的,打开直接访问
所以我们利用 Nginx 做一个基础登录
1、安装 Nginx 和 htpasswd
确保已经安装 Nginx。如果没有安装,可以使用以下命令安装:
sudo apt update
sudo apt install nginx
安装 htpasswd 工具用于创建密码文件:
sudo apt install apache2-utils
2、创建一个基本的密码文件
使用 htpasswd 创建一个包含用户名和密码的文件:
sudo htpasswd -c /etc/nginx/.htpasswd username
你会被提示输入密码。username 是你设置的用户名,可以根据需要修改。此命令会创建一个文件 /etc/nginx/.htpasswd,其中包含加密的用户名和密码。
3、 配置 Nginx 进行 Basic Auth
编辑 Nginx 配置文件,例如 /etc/nginx/sites-available/prefect,并添加 Basic Auth 设置:
注意下面配置2个点:
localhost
server {
listen 80;
server_name xxx.xxx.xx.xxx; # 使用 IP 地址作为服务器名称
location / {
proxy_pass http://localhost:4200; # 直接代理到 Prefect Dashboard
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/.htpasswd; # Basic Auth 密码文件路径
}
}
4、启用 Nginx 配置并重启
sudo ln -s /etc/nginx/sites-available/prefect /etc/nginx/sites-enabled/
sudo nginx -t # 测试配置是否正确
sudo systemctl reload nginx
三、对比:Cloud & 私有部署
1、Cloud
cloud的功能更丰富,且可以创建Namespace
2、私有部署
私有部署的server相对比cloud要简单一些
作者:CTRA王大大