我正在尝试使用Airflow连接到一个PostgreSQL数据库,但遇到了一个问题,我似乎无法解决。简而言之,在我的帖子底部包含了当我尝试在我的airflow dag中创建一个postgres表时获取的错误信息。
我正在使用 docker-compose
与puckel镜像,但我已经根据自己的需求对其进行了扩展,因此 l/custom_airflow:1.5
是我调整过的图像,以包括一些Python依赖项 - 它只是获取puckel镜像并安装我自己的依赖项。下面是我的 docker-compose
文件:
version: '3.7'
services:
postgres:
image: postgres:9.6
environment:
- POSTGRES_USER=airflow
- POSTGRES_PASSWORD=airflow
- POSTGRES_DB=airflow
logging:
options:
max-size: 10m
max-file: "3"
db:
image: postgres:13.0-alpine
restart: always
environment:
POSTGRES_DB: postgres
POSTGRES_USER: admin_user
POSTGRES_PASSWORD: secret_password
POSTGRES_HOST_AUTH_METHOD: trust
# PGDATA: /var/lib/postgresql/data
volumes:
- db-data:/var/lib/postgresql/data
ports:
- "5439:5432"
pgadmin:
image: dpage/pgadmin4:4.27
restart: always
environment:
PGADMIN_DEFAULT_EMAIL: admin@test.com
PGADMIN_DEFAULT_PASSWORD: test
PGADMIN_LISTEN_PORT: 1111
ports:
- "1111:1111"
volumes:
- pgadmin-data:/var/lib/pgadmin
links:
- "db:pgsql-server"
webserver:
image: l/custom_airflow:1.5
container_name: l_custom_airflow
restart: always
depends_on:
- postgres
environment:
- LOAD_EX=n
- EXECUTOR=Local
logging:
options:
max-size: 10m
max-file: "3"
volumes:
- ./dags:/usr/local/airflow/dags
- ./db-data:/usr/local/airflow/db-data
- ./pgadmin-data:/usr/local/airflow/pgadmin-data
ports:
- "8080:8080"
command: webserver
healthcheck:
test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"]
interval: 30s
timeout: 30s
retries: 3
volumes:
db-data:
pgadmin-data:
尽管Airflow使用服务
postgres
来存储有关DAG的自身数据,但我创建了第二个名为db
的PostgreSQL服务,以使其分离,并将其设置在端口5439
。
这一切似乎都很顺利。当我检查docker container ls
时,显示PostgreSQL容器的名称为pipeline_5_db_1
,并使用docker network ls
检查容器,并使用docker container inspect l_custom_airflow | grep Network
进行检查,似乎显示它们都映射到同一个网络。
在Airflow UI中,我选择Admin--> Connections--> Create 并填写以下内容:
然后我就可以有我的简单dag了:from airflow.models import DAG
from airflow.utils.dates import days_ago
from airflow.operators.python_operator import PythonOperator
from airflow.operators.postgres_operator import PostgresOperator
args = {'start_date': days_ago(1)}
dag = DAG(
dag_id='testing_dag',
default_args=args,
schedule_interval=None
)
with dag:
op1 = PostgresOperator(
task_id = "make_a_staging_table",
postgres_conn_id = "my_pg_connection",
sql = """CREATE TABLE scaled_data
(
idx_col integer,
petal_width float,
petal_length float
);
"""
)
op1
我想测试并尝试创建一张表格。但是当我触发DAG时,日志中出现以下错误:
[2020-10-29 08:26:53,156] {{taskinstance.py:1128}} ERROR - could not connect to server: Connection refused
Is the server running on host "pipeline_5_db_1" (172.22.0.2) and accepting
TCP/IP connections on port 5439?
我已经搜索了,这似乎是一个常见的错误,但我不确定它的含义或如何在我的情况下解决它。尝试将主机设置为0.0.0.0
和其他小的调整都没有成功。
pipeline_5_postgres_1
,但是在你的截图中,数据库主机设置为pipeline_5_db_1
- 在另一个PG容器中,你将端口映射到了5432
,但在截图中它被设置为默认的5439
。 - mikezterpipeline_5_db_1
。但是pipeline_5_postgres_1
是由airflow用于dags的postgres容器创建的。至于端口映射,postgres的默认端口是5432,因此在docker-compose文件中,我将其从5432映射到5439,使用"5439:5432"
。这就是为什么我写了5439。据我所知,语法是“map_to:map_from”... - fffrost