【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个点:

  • server_name:需要写本机的IP地址
  • proxy_pass:必须写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王大大

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【Prefect】Prefect一:python任务调度工具 Prefect | 可视化任务工具 | Python自动化的终极武器 | 高效数据管道管理

    发表回复