【发布时间】:2021-01-21 15:43:03
【问题描述】:
我正在使用 boto3 连接到 s3,下载对象并进行一些处理。我正在使用多处理池来执行上述操作。
以下是我正在使用的代码的概要:
session = None
def set_global_session():
global session
if not session:
session = boto3.Session(region_name='us-east-1')
def function_to_be_sent_to_mp_pool():
s3 = session.client('s3', region_name='us-east-1')
list_of_b_n_o = list_of_buckets_and_objects
for bucket, object in list_of_b_n_o:
content = s3.get_object(Bucket=bucket, Key=key)
data = json.loads(content['Body'].read().decode('utf-8'))
write_processed_data_to_a_location()
def main():
pool = mp.Pool(initializer=set_global_session, processes=40)
pool.starmap(function_to_be_sent_to_mp_pool, list_of_b_n_o_i)
现在,当processes=40 时,一切正常。 processes = 64的时候,还是不错的。
但是,当我增加到 processes=128 时,我收到以下错误:
botocore.exceptions.NoCredentialsError: Unable to locate credentials
我们的机器具有访问 S3 所需的 IAM 角色。此外,发生的奇怪事情是,对于某些进程,它可以正常工作,而对于其他一些进程,它会引发凭据错误。为什么会发生这种情况,如何解决?
发生的另一件奇怪的事情是,我能够在 2 个单独的终端选项卡中触发两个作业(每个选项卡都有一个单独的 ssh 登录 shell)。每个作业产生 64 个进程,而且运行良好,这意味着有 128 个进程同时运行。但是一个登录 shell 中的 80 个进程失败了。
跟进:
我尝试以一种方法为单独的进程创建单独的会话。另一方面,我使用boto3.client 直接创建了s3-client。但是,它们都抛出了 80 个进程的相同错误。
我还使用以下额外配置创建了单独的客户端:
Config(retries=dict(max_attempts=40), max_pool_connections=800)
这允许我一次使用 80 个进程,但任何大于 80 的进程都会失败并出现相同的错误。
后跟进:
有人可以确认他们是否能够在具有 128 个进程的多处理中使用 boto3 吗?
【问题讨论】:
-
我遇到了完全相同的问题,失败了 64 个进程。
标签: python-3.x multiprocessing boto3