python - Apache Spark 读取 S3 : can't pickle thread. 锁对象

标签 python multithreading apache-spark amazon-s3 pyspark

所以我希望我的 Spark 应用程序从 Amazon 的 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'))

当我这样做时 data.collect我收到以下错误:
TypeError: can't pickle thread.lock objects

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

最佳答案

您的 s3_client 不可序列化。

使用 mapPartitions 代替 flatMap,并在 lambda 主体内初始化 s3_client 以避免开销。那将:

  • 每个 worker 的 init s3_client
  • 减少初始化开销
  • 关于python - Apache Spark 读取 S3 : can't pickle thread. 锁对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40674544/

    相关文章:

    scala - 分组并在 spark sql 中获取第一个值

    hadoop - Spark RDD : Get row number

    python - 我在 PySide 1.1.0 中找不到 QString

    python - __init__() 获得意外的一对多关键字参数 'author'

    python - 如何在 SQLAlchemy/Postgres 中限制每个 `group_by` 的 N 个结果?

    python - 在 Google Colab 中安装 RDKit

    c++ - 如何知道Qt在哪个线程中执行slots?

    C# - 周期性数据读取和 Thread.Sleep()

    java - 如果事件调度线程没有暂停,模式对话框如何等待?

    apache-spark - 使用 Spark Graphframes 进行分区