boto3无法在pyspark worker上创建客户端?

时间:2016-06-21 17:18:47

标签: python pyspark boto3

我正在尝试将数据从Pyspark RDD的工作人员发送到SQS队列,使用boto3与AWS交谈。我需要直接从分区发送数据,而不是收集RDD并从驱动程序发送数据。

我可以通过boto3本地发送消息到SQS&来自Spark驱动程序;另外,我可以导入boto3并在分区上创建一个boto3会话。但是,当我尝试从分区创建客户端或资源时,我收到错误。我相信boto3没有正确创建一个客户端,但我不确定那一点。我的代码如下所示:

def get_client(x):   #the x is required to use pyspark's mapPartitions
    import boto3
    client = boto3.client('sqs', region_name="us-east-1", aws_access_key_id="myaccesskey", aws_secret_access_key="mysecretaccesskey")
    return x

rdd_with_client = rdd.mapPartitions(get_client)

错误:

DataNotFoundError: Unable to load data for: endpoints

回溯时间越长:

File "<stdin>", line 4, in get_client
  File "./rebuilt.zip/boto3/session.py", line 250, in client
    aws_session_token=aws_session_token, config=config)
  File "./rebuilt.zip/botocore/session.py", line 810, in create_client
    endpoint_resolver = self.get_component('endpoint_resolver')
  File "./rebuilt.zip/botocore/session.py", line 691, in get_component
    return self._components.get_component(name)
  File "./rebuilt.zip/botocore/session.py", line 872, in get_component
    self._components[name] = factory()
  File "./rebuilt.zip/botocore/session.py", line 184, in create_default_resolver
    endpoints = loader.load_data('endpoints')
  File "./rebuilt.zip/botocore/loaders.py", line 123, in _wrapper
    data = func(self, *args, **kwargs)
  File "./rebuilt.zip/botocore/loaders.py", line 382, in load_data
    raise DataNotFoundError(data_path=name)
DataNotFoundError: Unable to load data for: endpoints

我也尝试修改我的函数来创建资源而不是显式客户端,看它是否能找到&amp;使用默认的客户端设置。在这种情况下,我的代码是:

def get_resource(x):
    import boto3
    sqs = boto3.resource('sqs', region_name="us-east-1", aws_access_key_id="myaccesskey", aws_secret_access_key="mysecretaccesskey")
    return x

rdd_with_client = rdd.mapPartitions(get_resource)

我收到一个指向has_low_level_client参数的错误,该错误由于客户端不存在而被触发;追溯说:

File "/usr/lib/spark/python/pyspark/rdd.py", line 2253, in pipeline_func
  File "/usr/lib/spark/python/pyspark/rdd.py", line 270, in func
  File "/usr/lib/spark/python/pyspark/rdd.py", line 689, in func
  File "<stdin>", line 4, in session_resource
  File "./rebuilt.zip/boto3/session.py", line 329, in resource
    has_low_level_client)
ResourceNotExistsError: The 'sqs' resource does not exist.
The available resources are:
   -

没有资源可用,因为我认为没有客户可以容纳它们。

我几天来一直在撞击这个。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:1)

这是因为您将boto3包作为zip文件。

  

” ./ rebuilt.zip/boto3"

boto3对初始化的作用是下载一堆文件并将其保存在分发文件夹中。因为你的boto3生活在一个zip包中,所以很明显那些文件将不能用于那里。

解决方案是,而不是在一个zip中分发boto3,你应该在你的Spark环境中安装boto3。这里要小心,您可能希望在主节点和工作节点上安装boto3,具体取决于您实现应用程序的方式。安全投注安装在两者上。

如果您使用的是EMR,则可以使用bootstrap步骤来执行此操作。