在 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的主要内容,如果未能解决你的问题,请参考以下文章

将大文件从本地机器复制到 S3 时读取端点 URL 超时

如何在 Docker 容器中从 WordPress(联系表格)发送电子邮件?

在 Rider 中从 docker-compose 调试 .net 核心容器是错误的

Elastic Beanstalk Docker 容器用于访问 S3 存储桶以获取数据

将所有文件从 Amazon S3 存储桶复制到 Microsoft Azure 容器的最佳方法

s3 Docker的镜像和容器