Apache Spark读取S3:无法pickle thread.lock对象

use*_*968 6 python multithreading amazon-s3 apache-spark pyspark

所以我希望我的Spark应用程序能够从亚马逊的S3中读取一些文本.我写了以下简单的脚本:

import boto3
s3_client = boto3.client('s3')
text_keys = ["key1.txt", "key2.txt"]
data = sc.parallelize(text_keys).flatMap(lambda key: s3_client.get_object(Bucket="my_bucket", Key=key)['Body'].read().decode('utf-8'))
Run Code Online (Sandbox Code Playgroud)

当我这样做时,data.collect我收到以下错误:

TypeError: can't pickle thread.lock objects
Run Code Online (Sandbox Code Playgroud)

我似乎没有在网上找到任何帮助.也许有人设法解决了上述问题?

ImD*_*enG 8

您的s3_client不可序列化.

而不是flatMap使用mapPartitions,并初始化lambda体内的s3_client以避免开销.那会:

  1. 每个worker上的init s3_client
  2. 减少初始化开销