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}")
 

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...