2016-11-18 7 views
1

私はSpark AppにAmazon S3のテキストを読み込ませます。私はdata.collectを行うと、私は次のエラーを取得Apache SparkがS3を読み込みます:thread.lockオブジェクトをpickleできません

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')) 

TypeError: can't pickle thread.lock objects 

を、私はオンライン任意のヘルプを見つけるように見えることはありません私は、次の単純なスクリプトを書きました。おそらく誰かが上記を解決することができましたか?

+0

初期化のオーバーヘッドを減らす以下の答えはあなたの問題を解決した場合は、コードを編集してください。 – ZZzzZZzz

+0

@Zzz彼はなぜ彼のコードを編集するだろうか? @eliasah。 – eliasah

+0

これは、回答の権利をマークするだけで正しい方法であり、コードを修正することが他人を助ける最良の方法だからです。 – ZZzzZZzz

答えて

3

s3_clientはシリアル化できません。

フラットマップの代わりに、mapPartitionsを使用し、オーバーヘッドを避けるためにラムダ本体の中にs3_clientを初期化します。その意志:各ワーカー

    1. のinit s3_client
  • +0

    ありがとうございます!私の問題を解決しました:) – user1059968

    +0

    下の答えがあなたの問題を解決した場合は、コードを編集してください。 @ImDarrenG。 – ZZzzZZzz

    +0

    ラムダ本体でs3_clientを初期化する方法についてのコードを編集できますか? – ZZzzZZzz

    関連する問題