【问题标题】:boto3 cannot create client on pyspark worker?boto3 无法在 pyspark worker 上创建客户端?
【发布时间】:2017-02-08 09:02:05
【问题描述】:

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

我可以通过本地的 boto3 和 Spark 驱动程序向 SQS 发送消息;另外,我可以导入 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

我还尝试修改我的函数以创建资源而不是显式客户端,以查看它是否可以找到并使用默认客户端设置。在这种情况下,我的代码是:

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:
   -

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

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

【问题讨论】:

  • 请找到 botocore 的安装位置并检查 data 子目录。您还应该确保您能够从磁盘读取。
  • 嗨乔丹,我在数据子目录中寻找什么?我在那里有一个名为 endpoints.json 的文件,但这就是与此追溯相关的所有内容。
  • 无论出于何种原因,botocore 都无法访问该endpoints.json 文件,boto3 同样也无法访问其目录中的数据。我的想法是它要么根本不存在,要么你的环境阻止它被访问。

标签: python pyspark boto3


【解决方案1】:

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

"./rebuilt.zip/boto3"

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

解决方案是,您应该在 Spark 环境中安装 boto3,而不是在 zip 中分发 boto3。请注意,您可能希望在主节点和工作节点上都安装 boto3,这取决于您实现应用程序的方式。两者都安装了安全赌注。

如果您使用的是 EMR,则可以使用引导步骤来完成。

【讨论】:

  • 或者,您可以将这些数据文件捆绑在您的“./rebuilt.zip/boto3”中
  • 好吧,我在这里也遇到了同样的问题,这真的很糟糕,无论如何我还是会求助于 boto,因为它默认安装在 emr 集群上。
  • 或者,您始终可以使用引导操作来运行“pip install boto3”。无需回退到 boto,因为它将是日落。
  • @LiyingTang 如何找到它在初始化期间下载的文件,以便将其存储在 zip 文件中?
  • 它可能会起作用,尽管它听起来有点“hacky”。这些 JSON 文件可以在初始化后下载。因此,您可以做的是初始化您使用 boto3 的 AWS 服务,并将该 boto3 副本完全打包到您的包中。
猜你喜欢
  • 1970-01-01
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多