2016-11-18 7 views
1

Так что я хочу, чтобы приложение Spark прочитало текст из S3 Amazon. Я написал следующий простой сценарий:Apache Spark читает для S3: не удается раскрыть объекты 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 и инициализируйте s3_client внутри тела лямбды, чтобы избежать накладных расходов. Это будет:

  1. INIT s3_client на каждого работника
  2. уменьшить накладные расходы инициализации
+0

Большое спасибо! Решила мою проблему :) – user1059968

+0

Пожалуйста, отредактируйте свой код, если ниже ответ решит вашу проблему. – ZZzzZZzz

+0

@ImDarrenG. Можете ли вы изменить его код на то, как инициализировать s3_client в лямбда-теле. – ZZzzZZzz

 Смежные вопросы

  • Нет связанных вопросов^_^