2016-11-18 63 views
1

所以我想讓我的Spark應用程序從亞馬遜的S3中讀取一些文本。我寫了下面的簡單腳本:Apache Spark爲S3讀取:不能pickle thread.lock對象

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 

,似乎我也不在網上找到任何幫助。也許有人設法解決上述問題?

+0

請編輯您的代碼,如果下面的答案解決您的問題。 – ZZzzZZzz

+0

@Zzz他爲什麼要編輯他的代碼? – eliasah

+0

@eliasah。這是因爲僅僅標記答案是正確的,糾正代碼是幫助他人的最佳方式。 – ZZzzZZzz

回答

3

您的s3_client不可序列化。

代替flatMap使用mapPartitions,並在lambda體內初始化s3_client以避免開銷。這將:每個工人

    1. 初始化s3_client減少初始化開銷
  • +0

    非常感謝!解決了我的問題:) – user1059968

    +0

    如果以下答案解決了您的問題,請編輯您的代碼。 – ZZzzZZzz

    +0

    @ImDarrenG。你可以編輯他的代碼,如何初始化lambda體中的s3_client。 – ZZzzZZzz