【问题标题】:How to Connect to RDS Instance from AWS Glue Python Shell?如何从 AWS Glue Python Shell 连接到 RDS 实例?
【发布时间】:2019-05-01 13:12:28
【问题描述】:

我正在尝试从 AWS Glue 访问 RDS 实例,我在 EC2 实例中运行了一些 python 脚本,我目前使用 PYODBC 进行连接,但是在尝试为胶水安排作业时,我无法导入 PYODBC,因为它不是本机的受 AWS Glue 支持,不确定驱动程序在胶壳中如何工作。

【问题讨论】:

  • 尝试使用boto3 python库与aws服务交互。
  • 我可以在 RDS 内的 BOTO3 中运行大型查询吗?如果有怎么办?
  • 谢谢你的回答,很遗憾我应该澄清一下我正在使用带有 SQL Server 的 RDS 实例,很遗憾它不支持这种方法

标签: python amazon-web-services amazon-rds aws-glue


【解决方案1】:

来自:在 AWS Glue 中引入 Python Shell 作业announcement

AWS Glue 中的 Python shell 作业支持与 Python 2.7 兼容并预加载了 Boto3、NumPy、SciPy、pandas 等库的脚本。

module list 不包括 pyodbc 模块,并且它不能作为自定义 .egg 文件提供,因为它依赖于 libodbc.so.2pyodbc.so 库。

我认为你有两个选择:

  1. 从 Glue 的控制台为您的数据库创建一个jdbc connection,并使用 Glue 的内部方法对其进行查询。这当然需要更改代码。
  2. 改用 Lambda 函数。您需要pack pyodbc 和所需的库以及压缩文件中的代码。有人已经为 AWS Lambda 编译了这些库,请参阅 here

希望对你有帮助

【讨论】:

  • 您能否将诸如 psycopg2 之类的库作为自定义 .egg 文件包含在内?我希望使用 psycopg2 + pandas 与数据交互,而不是使用 Glue 的内部方法。
  • 不幸的是 psycopg2 没有预装在 Glue 的 python shell 中。但是你可以使用 jdbc 连接 + pandas
  • 那么只有预加载到python shell中的库可以使用吗?不能通过自定义.egg文件带任何非预加载的库吗?
  • 不适用于 Glue 的 python shell。但是在Security configuration, script libraries, and job parameters > Python library path & Dependent jars path 下使用 Glue 的 Spark 作业(Python/Scala)是可能的
  • 我发布了一些您可能感兴趣的最新发现的答案。
【解决方案2】:

对于 AWS Glue,使用 Dataframe/DynamicFrame 并指定 SQL Server JDBC 驱动程序。 AWS Glue 已在其环境中包含适用于 SQL Server 的 JDBC 驱动程序,因此您无需使用胶水作业添加任何额外的驱动程序 jar。

df1=spark.read.format("jdbc").option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver").option("url", url_src).option("dbtable", dbtable_src).option("user", userID_src).option("password", password_src).load()

如果您使用的是 SQL 而不是表:

df1=spark.read.format("jdbc").option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver").option("url", url_src).option("dbtable", ("你的选择语句在这里") A).option("user", userID_src).option("password", password_src).load()

作为替代解决方案,您还可以在 AWS Glue 中运行的 Python 脚本中为 SQL 服务器使用 jtds 驱动程序

【讨论】:

  • 问题是关于 Python shell 而不是 Spark。不是吗?
  • @ya2410 据我所知,AWS Glue 没有 shell 或 cli 界面
  • 没有。我的意思是他正在从事的工作类型。当您在 Glue 中创建新作业时,您可以在 Spark 和 Python shell 之间进行选择。您的语法适用于 Spark。
  • 我的立场是正确的。我明白你在说什么。我相信语法应该可以工作,因为胶水作业在 EMR 上的 Spark 上运行。但我必须承认我自己没有在 python shell 上使用过它。
  • @RakeshGuha 更新了“选择”语句的答案。还有其他语法,已在数据帧的 SPARK 文档中进行了解释。
【解决方案3】:

如果有人需要使用 python shell 与 sqlalchemy 建立 postgres 连接,可以通过引用 sqlalchemy, scramp, pg8000 wheel 文件来实现,重要的是通过消除对 setup.py 的废弃依赖来从 pg8000 重建 wheel。

【讨论】:

    【解决方案4】:

    我需要做类似的事情,并最终在 Scala 中创建了另一个 Glue 作业,同时将 Python 用于其他一切。我知道它可能不适合所有人,但想提一下How to run DDL SQL statement using AWS Glue

    【讨论】:

      【解决方案5】:

      我能够使用 python 库 psycopg2,即使它不是用纯 python 编写的,也没有预装 aws glue python shell 环境。这与 aws 胶水文档相反。所以你也许可以以类似的方式使用 odbc 相关的 python 库。我为 psycopg2 库创建了 .egg 文件,并在胶水 python shell 环境中成功使用了它。如果您的脚本中有 import psycopg2 并且胶水作业引用相关的 psycopg2 .egg 文件,则以下是胶水 python shell 的日志。

      Creating /glue/lib/installation/site.py
      Processing psycopg2-2.8.3-py2.7.egg
      Copying psycopg2-2.8.3-py2.7.egg to /glue/lib/installation
      Adding psycopg2 2.8.3 to easy-install.pth file
      Installed /glue/lib/installation/psycopg2-2.8.3-py2.7.egg
      Processing dependencies for psycopg2==2.8.3
      Searching for psycopg2==2.8.3
      Reading https://pypi.org/simple/psycopg2/
      Downloading https://files.pythonhosted.org/packages/5c/1c/6997288da181277a0c29bc39a5f9143ff20b8c99f2a7d059cfb55163e165/psycopg2-2.8.3.tar.gz#sha256=897a6e838319b4bf648a574afb6cabcb17d0488f8c7195100d48d872419f4457
      Best match: psycopg2 2.8.3
      Processing psycopg2-2.8.3.tar.gz
      Writing /tmp/easy_install-dml23ld7/psycopg2-2.8.3/setup.cfg
      Running psycopg2-2.8.3/setup.py -q bdist_egg --dist-dir /tmp/easy_install-dml23ld7/psycopg2-2.8.3/egg-dist-tmp-9qwen3l_
      creating /glue/lib/installation/psycopg2-2.8.3-py3.6-linux-x86_64.egg
      Extracting psycopg2-2.8.3-py3.6-linux-x86_64.egg to /glue/lib/installation
      Removing psycopg2 2.8.3 from easy-install.pth file
      Adding psycopg2 2.8.3 to easy-install.pth file
      Installed /glue/lib/installation/psycopg2-2.8.3-py3.6-linux-x86_64.egg
      Finished processing dependencies for psycopg2==2.8.3
      

      【讨论】:

      • 您在哪里看到这些日志?我检查了 cloudwatch 中的错误日志和常规日志,没有看到任何类似的东西。我正在使用你建议的鸡蛋包。 “连续记录”已启用,“日志过滤”有“无过滤器”。
      • 您好,您是如何创建 egg 文件的?您使用了原始 psycopg2 github 存储库中的哪些文件?
      • 我尝试做同样的事情,但总是得到No module named 'psycopg2._psycopg',我在 github 上没有看到它。
      【解决方案6】:

      这些是我用来从胶水 python shell 作业连接到 RDS 的步骤:

      1. 将你的依赖包打包成一个egg文件(如果我没记错的话,这些包必须是纯python)。将其放入 S3。
      2. 将您的作业设置为在作业配置 > Python 库路径下引用该 egg 文件
      3. 验证您的作业是否可以导入包/模块
      4. 创建到您的 RDS 的粘合连接(它位于数据库 > 表、连接中),测试连接以确保它可以访问您的 RDS
      5. 现在在您的工作中,您必须将其设置为引用/使用此连接。在您配置作业或编辑作业时,它处于 require 连接中。

      完成这些步骤并进行验证后,您应该能够连接。在我的示例中,我使用了 pymysql。

      【讨论】:

        猜你喜欢
        • 2021-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-10
        • 1970-01-01
        • 1970-01-01
        • 2020-08-27
        • 1970-01-01
        相关资源
        最近更新 更多