AWSGlue作业3.0中无法导入psycopg2,该如何解决?
创始人
2024-09-25 18:02:13
0

在 AWS Glue 作业3.0 中无法直接导入 psycopg2,因为 AWS Glue 是运行在托管环境中的服务器。解决方法是使用 AWS Glue 的 Job Bookmarks 功能和Lambda Layers。

步骤如下:

  1. 创建用于将 psycopg2 安装到 AWS Lambda Layer 的 Python 包。以下示例使用 pipreqs 来创建 requirements.txt 文件。
pip install pipreqs
pipreqs /path/to/your/python/code --force
  1. 创建 AWS Lambda Layer 并将 psycopg2 安装到该层。可以使用以下示例代码:
import os
import boto3
from botocore.exceptions import ClientError
import tempfile
import zipfile
import shutil
 
#Install psycopg2 in temp directory 
tempdir=tempfile.mkdtemp()
print("Temp dir=",tempdir)
cmd="pip3 install psycopg2-binary -t  "+tempdir
os.system(cmd)
 
# Create a zip file with the psycopg2 package
zip_file = tempfile.mkstemp(suffix='.zip')[1]
with zipfile.ZipFile(zip_file, mode='w') as package:
    for root, dirs, files in os.walk(tempdir):
        for file in files:
            filename = os.path.join(root, file)
            package.write(filename,
                          os.path.relpath(filename, tempdir))
 
# Upload the package to Lambda Layers
layer_name = 'psycopg2-layer'
layer_description = 'psycopg2 library for Python'
layer_license = 'BSD-3-Clause'
client = boto3.client('lambda')
try:
    response = client.publish_layer_version(
        LayerName=layer_name,
        Content={
            'ZipFile': open(zip_file, 'rb').read(),
        },
        Description=layer_description,
        CompatibleRuntimes=[
            'python3.8',
        ],
        LicenseInfo=layer_license
    )
    print(response)
finally:
    os.remove(zip_file)
print("Lambda layer created successfully!")
  1. 在 AWS Glue 作业中使用 Lambda Layer。在做 AWS Glue 作业 3.0 的时候,可以选择使用 Lambda Layer 来导入需要的 Python 包。以下是一个示例代码:
import boto3
import sys
 
#Add psycopg2 Lambda layer
client = boto3.client('lambda')
response = client.list_layer_versions(
    LayerName='psycopg2-layer'
)
latest_version = response['LayerVersions'][0]['Version']
 
gluepysparkjob_params = {"--extra-py-files": f"arn:aws:lambda:REGION:ACCOUNT_ID:layer:psycopg2-layer:{latest_version}"}
 
def main():
    try:
        spark_submit_args = ["gluepysparksubmit"]
        spark_submit_args.extend(sys.argv[1:])
 
        for i, arg in enumerate(spark_submit_args):
            if arg == "--extra-py-files":
                gluepysparkjob_params[arg] += "," + gluepysparkjob_params[arg + "1"]
                del gluepysparkjob_params[arg + "1"]
 
        for param, value in gluepysparkjob_params.items():
            if not f"{param} {value}" in spark_submit_args:
                spark_submit_args.append(param)
                spark_submit_args.append(value)
 
        print(f"Running spark-submit with: {spark_submit_args}")
 
        # start spark-submit process with modified arguments
        subprocess.Popen(spark_submit_args)
    except Exception as e:
        print(f"Error running main function: {e}")
 

相关内容

热门资讯

专业讨论!wepoke能赢嘛,... 专业讨论!wepoke能赢嘛,德州免费辅助神器app,科技教程(从前有挂)1、在德州免费辅助神器ap...
分辨真假!gg扑克有辅助吗,w... 分辨真假!gg扑克有辅助吗,wpk透视辅助,wepoke教程(往昔真的是有挂)1、构建自己的微扑克辅...
每日必看!微扑克发牌有问题吗,... 您好,aapoker辅助这款游戏可以开挂的,确实是有挂的,需要了解加微【136704302】很多玩家...
实测交流!线上德州辅助工具有哪... 实测交流!线上德州辅助工具有哪些,wpk提高胜率,高科技教程(切实真的是有挂)1)wpk提高胜率辅助...
最新技巧!wepoke辅助技巧... 最新技巧!wepoke辅助技巧,wpk提高胜率,透牌教程(起初存在有挂)1、很好的工具软件,可以解锁...
重大推荐!德州alphax辅助... 重大推荐!德州alphax辅助,wepoke真的有挂,切实教程(原先是真的有挂)1、超多福利:超高返...
玩家实测!扑克世界app辅助,... 玩家实测!扑克世界app辅助,wepoke辅助机器人,详细教程(都是真的是有挂)是一款可以让一直输的...
科技介绍!wepoke辅助有挂... 科技介绍!wepoke辅助有挂吗,微扑克ai辅助工具,可靠技巧(好像存在有挂)1.微扑克ai辅助工具...
玩家必备科普!菠萝德州辅助神器... 玩家必备科普!菠萝德州辅助神器,wpk透视辅助测试,介绍教程(先前真的有挂)1、很好的工具软件,可以...
玩家交流!wpk机器人代打,微... 玩家交流!wpk机器人代打,微扑克游戏辅助器,透明挂教程(总是真的有挂);是一款可以让一直输的玩家,...