Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python AWS Glue psycopg2安装_Python_Amazon Web Services_Psycopg2_Aws Glue - Fatal编程技术网

Python AWS Glue psycopg2安装

Python AWS Glue psycopg2安装,python,amazon-web-services,psycopg2,aws-glue,Python,Amazon Web Services,Psycopg2,Aws Glue,我正在尝试运行一段代码,该代码使用psycopg2操作红移实例。我已经尝试导入一个轮子文件,因为我看到它们在Glue python作业中受支持。运行时,我看到库已安装在端点中,但随后出现错误: import boto3 import psycopg2 警告:目录“/.cache/pip”或其父目录不归当前用户所有或不可写。缓存已被禁用。检查该目录的权限和所有者。如果使用sudo执行pip,您可能需要sudo的-H标志。 2020-08-04T13:24:44.831+02:00 回溯(最近一次

我正在尝试运行一段代码,该代码使用psycopg2操作红移实例。我已经尝试导入一个轮子文件,因为我看到它们在Glue python作业中受支持。运行时,我看到库已安装在端点中,但随后出现错误:

import boto3
import psycopg2
警告:目录“/.cache/pip”或其父目录不归当前用户所有或不可写。缓存已被禁用。检查该目录的权限和所有者。如果使用sudo执行pip,您可能需要sudo的-H标志。
2020-08-04T13:24:44.831+02:00
回溯(最近一次呼叫最后一次):
文件“/tmp/runscript.py”,第123行,在
runpy.run\u路径(临时文件路径,run\u名称=“”\uuuu主路径)
文件“/usr/local/lib/python3.6/runpy.py”,第263行,在运行路径中
pkg_name=pkg_name,script_name=fname)
文件“/usr/local/lib/python3.6/runpy.py”,运行模块代码第96行
模块名称、模块规格、组件名称、脚本名称)
文件“/usr/local/lib/python3.6/runpy.py”,第85行,在运行代码中
exec(代码、运行\全局)
文件“/tmp/glue-python-scripts-1t08aq9n/postloading.py”,第6行,在
文件“/glue/lib/installation/psycopg2/_init__.py”,第51行,在
来自psycopg2._psycopg导入(#noqa
ModuleNotFoundError:没有名为'psycopg2.\u psycopg'的模块
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“/tmp/runscript.py”,第142行,在
提升e_类型(e_值)。使用_回溯(新_堆栈)
文件“/tmp/glue-python-scripts-1t08aq9n/postloading.py”,第6行,在
文件“/glue/lib/installation/psycopg2/_init__.py”,第51行,在
来自psycopg2._psycopg导入(#noqa
ModuleNotFoundError:没有名为'psycopg2.\u psycopg'的模块

理论上,python中的粘合作业(与pyspark作业相反)应该支持非纯python库

我在psycopg2包中遇到了类似的问题。这与访问psycopg2模块的python运行时的兼容性有关

遵循这个思路。希望你有你的解决方案。

代替psycopg2,尝试使用pg8000,pg8000易于安装,并且没有c依赖项。此外,亚马逊在其大多数内部项目中都使用它。

在使用Python端点尝试pg8000后,我遇到以下错误:

Traceback (most recent call last):
  File "/tmp/runscript.py", line 123, in <module>
    runpy.run_path(temp_file_path, run_name='__main__')
  File "/usr/local/lib/python3.6/runpy.py", line 263, in run_path
    pkg_name=pkg_name, script_name=fname)
  File "/usr/local/lib/python3.6/runpy.py", line 96, in _run_module_code
    mod_name, mod_spec, pkg_name, script_name)
  File "/usr/local/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/tmp/glue-python-scripts-j7khvbvv/postloading.py", line 7, in <module>
ModuleNotFoundError: No module named 'pg8000'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/tmp/runscript.py", line 142, in <module>
    raise e_type(e_value).with_traceback(new_stack)
  File "/tmp/glue-python-scripts-j7khvbvv/postloading.py", line 7, in <module>
ModuleNotFoundError: No module named 'pg8000'
回溯(最近一次呼叫最后一次):
文件“/tmp/runscript.py”,第123行,在
runpy.run\u路径(临时文件路径,run\u名称=“”\uuuu主路径)
文件“/usr/local/lib/python3.6/runpy.py”,第263行,在运行路径中
pkg_name=pkg_name,script_name=fname)
文件“/usr/local/lib/python3.6/runpy.py”,运行模块代码第96行
模块名称、模块规格、组件名称、脚本名称)
文件“/usr/local/lib/python3.6/runpy.py”,第85行,在运行代码中
exec(代码、运行\全局)
文件“/tmp/glue-python-scripts-j7khvbvv/postloading.py”,第7行,在
ModuleNotFoundError:没有名为“pg8000”的模块
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“/tmp/runscript.py”,第142行,在
提升e_类型(e_值)。使用_回溯(新_堆栈)
文件“/tmp/glue-python-scripts-j7khvbvv/postloading.py”,第7行,在
ModuleNotFoundError:没有名为“pg8000”的模块
当使用pyspark端点时,基于的pg8000不会出现此问题

将psycopg2二进制文件安装到目录中,并压缩该目录的内容:

mkdir psycopg2-binary
cd psycopg2-binary
pip install psycopg2-binary -t  .
# in case using python3:
# python3 -m pip install --system psycopg2-binary -t  .
zip -r9 psycopg2.zip *
然后,我将psycopg2.zip复制到一个S3存储桶中,并将其作为额外的Python库添加到Glue Spark作业中的“Python库路径”下

然后,我使用以下脚本启动了作业,以验证是否存在psycopg2(zip文件将通过Glue下载到作业脚本所在的目录中)


这对我很有用。

现在使用Glue版本2,您可以将python库作为参数传递给Glue作业。我使用了pyscopg2二进制文件而不是pyscopg2,它对我很有用。然后在代码中我导入了psycopg2


但此解决方案适用于Lambda,是否也适用于胶水?感谢您提供此解决方案。我的胶水工作也遇到了同样的问题。只需添加作业参数--AdditionalPython modules=psycopg2 binary,问题就解决了。我认为这个解决方案比从github获得对我不起作用的服务要好。此外,glue已经将python版本从3.6更改为3.7.9。当胶水版本更改时,您不必担心,您需要再次更改库。谢谢!这应该是可以接受的答案
Traceback (most recent call last):
  File "/tmp/runscript.py", line 123, in <module>
    runpy.run_path(temp_file_path, run_name='__main__')
  File "/usr/local/lib/python3.6/runpy.py", line 263, in run_path
    pkg_name=pkg_name, script_name=fname)
  File "/usr/local/lib/python3.6/runpy.py", line 96, in _run_module_code
    mod_name, mod_spec, pkg_name, script_name)
  File "/usr/local/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/tmp/glue-python-scripts-j7khvbvv/postloading.py", line 7, in <module>
ModuleNotFoundError: No module named 'pg8000'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/tmp/runscript.py", line 142, in <module>
    raise e_type(e_value).with_traceback(new_stack)
  File "/tmp/glue-python-scripts-j7khvbvv/postloading.py", line 7, in <module>
ModuleNotFoundError: No module named 'pg8000'
mkdir psycopg2-binary
cd psycopg2-binary
pip install psycopg2-binary -t  .
# in case using python3:
# python3 -m pip install --system psycopg2-binary -t  .
zip -r9 psycopg2.zip *
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 sys
import os
import zipfile

## @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)

zip_ref = zipfile.ZipFile('./psycopg2.zip', 'r')
print os.listdir('.')
zip_ref.extractall('/tmp/packages')
zip_ref.close()
sys.path.insert(0, '/tmp/packages')

import psycopg2
print(psycopg2.__version__)

job.commit()