Spark集群(AWS Glue)中运行PyPostal失败的问题求助
在AWS Glue环境中运行PyPostal(libpostal Python绑定)解决
libpostal.so.1找不到的问题 咱们先来拆解你遇到的核心问题:从报错信息看,Python绑定找不到libpostal.so.1动态链接库,这主要是因为你配置的路径指向了未解压的tar包,而非Spark解压后的实际库文件路径,再加上Python版本不匹配的小坑。下面给你一步步修正方案:
问题根源分析
- 路径配置错误:你用
spark.yarn.dist.archives上传的tar包,Spark会自动解压到当前工作目录下的同名文件夹(比如joint.tar.gz会被解压成joint文件夹),但你配置的LD_LIBRARY_PATH直接指向了tar包文件,而非解压后的库目录。 - Python版本不兼容:你用的是
gluepyspark3(Python3环境),但生成的egg包是py2.7版本的,这会导致绑定库加载时出现兼容性问题。 - 数据目录路径错误:
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
相关产品推荐
相关产品推荐

