我正在使用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角色。此外,奇怪的事情是,对于某些进程,它可以正常工作,而对于另一些进程,则会抛出凭据错误。这是为什么?如何解决?
另一个奇怪的事情是,我能够在两个单独的终端标签中触发两个作业(每个标签均有单独的ssh登录shell到该机器)。每个作业生成64个进程,这也正常工作,这意味着同时运行128个进程。但同一个登录shell中的80个进程会失败。
后续:
我尝试在一个方法中为不同的进程创建单独的会话。在另一种方法中,我直接使用创建s3客户端。但是,它们都在80个进程中抛出相同的错误。
我还使用以下额外配置创建了单独的客户端:
Config(retries=dict(max_attempts=40), max_pool_connections=800)
这使我能够同时使用80个进程,但超过80个就会出现相同的错误。
后续帖子:
有人能确认他们是否已经成功地在128个进程中使用了boto3
吗?