AWSGlue作业3.0中无法导入psycopg2,该如何解决?
创始人
2024-09-25 18:03:28
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}")
 

相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...