TypeError:“ JavaPackage”对象在PySpark,AWS Glue上不可调用

时间:2019-02-08 10:38:06

标签: python amazon-web-services apache-spark pyspark aws-glue

我已经在Scala中学习了Spark,但对pySpark和AWS Glue还是陌生的,
因此我遵循了AWS的官方教程。
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/aws-glue-programming-python-samples-legislators.html

我成功创建了开发端点,
通过ssh连接到pyspark REPL并输入以下命令:

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

glueContext = GlueContext(SparkContext.getOrCreate())

但是在最后一行,我得到了

>>> glueContext = GlueContext(SparkContext.getOrCreate())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/share/aws/glue/etl/python/PyGlue.zip/awsglue/context.py", line 44, in __init__
  File "/usr/share/aws/glue/etl/python/PyGlue.zip/awsglue/context.py", line 64, in _get_glue_scala_context
TypeError: 'JavaPackage' object is not callable

我也尝试过手动导入py4j,但这只是无效。

我该如何解决?
任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

最后我自己解决了。
看起来这是Glue / AWS特有的问题,而不是spark或python。

经过几次试验,启动Spark(pyspark)REPL时,我收到一条错误消息,提示“ ListObject”操作失败。
ListObject显然是用于访问S3上的内容的boto3 API调用的名称。

因此,我检查了它的IAM角色,该角色已包含AWSGlueConsoleFullAccess和一些S3Access,并对其附加了AmazonS3FullAccess策略,错误消失了。
另外,我创建了另一个胶水开发端点集群,即使没有S3FullAccess,新集群也没有错误。

也许每次我在胶水集群上唤醒Spark时,集群都会自动尝试从某些指定的S3存储桶中获取一些更新,有时在刚发布一些更新版本之前构建集群时会遇到麻烦。