0

我们正在对某些文本内容执行客户端加密,并将它们存储到 s3 中的单个文件中。我们希望阅读这些文件并处理 AWS Glue 中的内容。我们能够读取内容,但在解密过程中,我们得到一个选择错误。

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

session = boto3.session.Session()
kms = session.client('kms')

    
def s3Decrypt(decoded):
    decoded = base64.b64decode(decoded)
    meta = kms.decrypt(CiphertextBlob=decoded)
    plaintext = meta[u'Plaintext']
    return plaintext.decode()

def map_function(v):
    value = v[1]
    return s3Decrypt(value)
    
## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)


spark_rdd = sc.wholeTextFiles("s3://xxxxx/yyyy/zzzzz/*").map(lambda x : decrypt(x))

print(spark_rdd.collect())

job.commit()

这是我们得到的错误:

TypeError: can't pickle SSLContext objects
Traceback (most recent call last):
File "/opt/amazon/spark/python/lib/pyspark.zip/pyspark/serializers.py", line 590, in dumps return cloudpickle.dumps(obj, 2)

有没有办法做到这一点?

4

2 回答 2

0

重现它非常复杂,lambda 函数可能是您的问题的原因。

正如您在此处看到的:https : //docs.python.org/3.5/library/pickle.html#what-c​​an-be-pickled-and-unpickled ,描述在模块顶层定义的函数(使用 def,不是 lambda)。

于 2021-03-01T13:33:34.473 回答
0

将会话和 kms 客户端添加到 s3Decrypt 函数定义中。

于 2021-04-06T19:13:32.800 回答