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

相关内容

热门资讯

iwatch怎么连接安卓系统,... 你有没有想过,那款时尚又实用的iWatch,竟然只能和iPhone好上好?别急,今天就来给你揭秘,怎...
安卓系统怎么连不上carlif... 安卓系统无法连接CarLife的原因及解决方法随着智能手机的普及,CarLife这一车载互联功能为驾...
iphone系统与安卓系统更新... 最近是不是你也遇到了这样的烦恼?手机更新系统总是失败,急得你团团转。别急,今天就来给你揭秘为什么iP...
oppo手机安卓系统换成苹果系... OPPO手机安卓系统换成苹果系统:现实吗?如何操作?随着智能手机市场的不断发展,用户对于手机系统的需...
安卓平板改windows 系统... 你有没有想过,你的安卓平板电脑是不是也能变身成Windows系统的超级英雄呢?想象在同一个设备上,你...
安卓系统上滑按键,便捷生活与高... 你有没有发现,现在手机屏幕越来越大,操作起来却越来越方便了呢?这都得归功于安卓系统上的那些神奇的上滑...
安卓系统连接耳机模式,蓝牙、有... 亲爱的手机控们,你们有没有遇到过这种情况:手机突然变成了“耳机模式”,明明耳机没插,声音却只从耳机孔...
安卓换鸿蒙系统会卡吗,体验流畅... 最近手机圈可是热闹非凡呢!不少安卓用户都在议论纷纷,说鸿蒙系统要来啦!那么,安卓手机换上鸿蒙系统后,...
希沃系统怎么装安卓系统,解锁更... 亲爱的读者们,你是否也像我一样,对希沃一体机上的安卓系统充满了好奇呢?想象在教室里,你的希沃一体机不...
安装了Anaconda之后找不... 在安装Anaconda后,如果找不到Jupyter Notebook,可以尝试以下解决方法:检查环境...