在 docker 容器超时中从 s3 复制到 Redshift
Posted
技术标签:
【中文标题】在 docker 容器超时中从 s3 复制到 Redshift【英文标题】:COPY from s3 to Redshift in docker container timeout 【发布时间】:2018-01-29 07:54:23 【问题描述】:我正在尝试将大量数据从 s3 复制到 Redshift。它通过 psql 在我的 mac 上正常工作,但是当我尝试从本地运行的 docker 容器(使用 docker-airflow)运行它时,我总是会收到此错误:
SSL SYSCALL 错误:检测到 EOF 与服务器的连接丢失。 尝试重置:成功。
这是我如何在本地运行它的示例:
# First, I connect using psql
psql -h <connection_string> -u meh -d database -p 5439
# Then I issue this command.
COPY test.test from 's3://data/manifest_uuid' with credentials ''
FORMAT AS JSON 'auto' TRUNCATECOLUMNS COMPUPDATE ACCEPTINVCHARS manifest MAXERROR 100;
在气流容器中,使用 psycopg2 执行相同的查询:
conn = psycopg2.connect(dbname=database, host=endpoint, port=port, user=user, password=password, sslmode='require')
with conn.cursor() as cur:
cur.execute(q, args)
if fetch_one:
result = cur.fetchone()
if result is None:
return None
return result
elif fetch_all:
return cur.fetchall()
else:
conn.commit()
这是我尝试从容器中运行它的方法:
# I try to connect to the container
docker exec -it `docker ps|grep worker|awk 'END print $1'` /bin/bash
然后我的运行方式与本地运行完全相同。
我可以连接到容器,从那里运行 psql 并执行各种查询,如果文件足够小,甚至 COPY 命令也可以工作。 我尝试关注https://docs.aws.amazon.com/redshift/latest/mgmt/connecting-firewall-guidance.html#change-tcpip-settings,并验证建议的选项已设置为建议的值,但我仍然遇到此问题。
更新:这是一个 dockerfile 的要点。要重现,您还需要一个 redshift 集群和一些带有 json 的 1-2gb 文件,可以使用 COPY 命令将其移动到 Redshift。如果您从该映像创建容器,连接到它并尝试运行复制命令,您很可能会看到相同的问题。
https://gist.github.com/drapadubok/da04548dace5d4ff4198631841322402
【问题讨论】:
你是如何通过 psql 发出 COPY 命令的? 分享有关复制命令外观和执行方式的更多详细信息可能会很有用。 谢谢!添加了详细信息,请告知是否可以添加更多说明 您在使用 Docker for Mac 吗?可能与这个问题有关:github.com/docker/for-mac/issues/2442 您可以尝试那里的 cmets 中链接的实验性修补构建。 @AlessandroCosentino 这有帮助!我按照 github 问题 (17.12.0-ce-mac49) 中的建议将 docker 更新到了最新版本,并且成功了!谢谢!您可以将此作为答案提交,以便我接受吗? 【参考方案1】:这是由 Docker for Mac 中的 recent regression bug 引起的,这会导致 TCP 连接超时。
更新 Docker 到 v17.12.0-ce-mac49 解决了这个问题,正如 OP 所确认的那样。
【讨论】:
以上是关于在 docker 容器超时中从 s3 复制到 Redshift的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Docker 容器中从 WordPress(联系表格)发送电子邮件?
在 Rider 中从 docker-compose 调试 .net 核心容器是错误的
Elastic Beanstalk Docker 容器用于访问 S3 存储桶以获取数据