You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark集群(AWS Glue)中运行PyPostal失败的问题求助

在AWS Glue环境中运行PyPostal(libpostal Python绑定)解决libpostal.so.1找不到的问题

咱们先来拆解你遇到的核心问题:从报错信息看,Python绑定找不到libpostal.so.1动态链接库,这主要是因为你配置的路径指向了未解压的tar包,而非Spark解压后的实际库文件路径,再加上Python版本不匹配的小坑。下面给你一步步修正方案:

问题根源分析

  1. 路径配置错误:你用spark.yarn.dist.archives上传的tar包,Spark会自动解压到当前工作目录下的同名文件夹(比如joint.tar.gz会被解压成joint文件夹),但你配置的LD_LIBRARY_PATH直接指向了tar包文件,而非解压后的库目录。
  2. Python版本不兼容:你用的是gluepyspark3(Python3环境),但生成的egg包是py2.7版本的,这会导致绑定库加载时出现兼容性问题。
  3. 数据目录路径错误:LIBPOSTAL_DATA_DIR同样指向了tar包,而非解压后的实际数据目录。

修正后的配置步骤

1. 先重新生成兼容Python3的PyPostal egg包

用Python3的环境重新编译生成egg文件,确保版本匹配:

# 在兼容Glue的环境(比如Amazon Linux 2)中执行
pip3 install setuptools
git clone https://github.com/openvenues/pypostal.git
cd pypostal
python3 setup.py bdist_egg

生成的egg包应该类似postal-1.1.9-py3.6-linux-x86_64.egg,上传到你的S3路径。

2. 修改GluePySpark启动命令

把tar包加上别名标记,并修正所有路径配置:

gluepyspark3 \
 --conf "spark.yarn.dist.archives=s3://{some_S3_location}/libpostal/joint.tar.gz#joint,s3://{some_S3_location}/libpostal/libpostal_datadir.tar.gz#libpostal_data" \
 --conf "spark.executorEnv.LD_LIBRARY_PATH=./joint/lib:$LD_LIBRARY_PATH" \
 --conf "spark.executorEnv.LIBPOSTAL_DATA_DIR=./libpostal_data" \
 --conf "spark.driver.extraLibraryPath=./joint/lib" \
 --conf "spark.yarn.appMasterEnv.LD_LIBRARY_PATH=./joint/lib:$LD_LIBRARY_PATH" \
 --conf "spark.yarn.appMasterEnv.LIBPOSTAL_DATA_DIR=./libpostal_data" \
 --py-files "s3://{some_s3_location}/libpostal/postal-1.1.9-py3.6-linux-x86_64.egg"

配置修改说明

  • spark.yarn.dist.archives加别名:用#joint和#libpostal_data指定解压后的文件夹名称,避免路径歧义,方便后续引用。
  • 修正LD_LIBRARY_PATH:指向解压后的joint/lib目录(假设你的joint.tar.gz里libpostal.so.1放在lib子文件夹下),同时保留原系统路径$LD_LIBRARY_PATH,避免覆盖系统依赖。
  • 修正LIBPOSTAL_DATA_DIR:指向解压后的libpostal_data文件夹,让libpostal能找到训练数据。
  • 替换为Python3版本的egg包:确保和gluepyspark3的Python3环境匹配。

验证步骤

启动Glue shell后,先执行以下代码确认路径和环境变量是否正确:

import os
# 检查解压后的库目录是否存在
print("Joint directory contents:", os.listdir('./joint'))
# 检查LD_LIBRARY_PATH
print("LD_LIBRARY_PATH:", os.environ.get('LD_LIBRARY_PATH'))
# 检查数据目录
print("LIBPOSTAL_DATA_DIR:", os.environ.get('LIBPOSTAL_DATA_DIR'))

确认无误后,再执行from postal.parser import *,应该就能成功加载了。

额外注意事项

如果还是出现依赖问题,可以用ldd libpostal.so.1检查libpostal的系统依赖,把缺失的依赖库也打包到joint.tar.gz里,或者确认Glue环境中已经预装了这些依赖(比如libsnappy、libicu等)。

内容的提问来源于stack exchange,提问作者PaulSyl1980

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 07:23:17