1

我正在尝试运行 Hadoop 流作业来处理地理空间数据。为此,我使用了需要libgeos的Shapely函数。

但是,作业失败,因为集群上没有安装 libgeos。

有没有办法将 libgeos 发送到集群并让 Shapely.so从目录中读取文件(可能是通过-archivesor -files)?

运行命令示例

hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar -D    stream.num.map.output.key.fields=2 -D mapred.text.key.partitioner.options=-k1,1 -archives hdfs://namenode:port/user/anaconda.zip#anaconda -files /some/other/stuff -input /path/to/input -output /user/geo_stuff -file /home/mr_files/mapper.py -mapper "mapper.py"

mapper.py 从哪里开始...

#!./anaconda/anaconda/bin/python
import shapely
from cartopy.io import shapereader
from shapely.geometry import Point
...more stuff

这会产生以下错误

from shapely.geos import lgeos
File "./anaconda/anaconda/lib/python2.7/site-packages/shapely/geos.py", line 58, in <module>
_lgeos = load_dll('geos_c', fallbacks=['libgeos_c.so.1', 'libgeos_c.so'])

File "./anaconda/anaconda/lib/python2.7/site-packages/shapely/geos.py", line 54, in load_dll
libname, fallbacks or []))

OSError: Could not find library geos_c or load any of its variants ['libgeos_c.so.1', 'libgeos_c.so']
4

2 回答 2

0

如果您想将文件从主节点复制到 Hadoop 集群上的所有核心节点,您可以通过在主节点上运行它来完成(Key.pem是您用于 ssh 到主节点的密钥,您将拥有在运行之前将其复制到您的主节点上):

#!/bin/bash
nodes=(`hadoop dfsadmin -report | grep Hostname | sed 's/Hostname: //'`)
for workerip in nodes
do
    scp -i Key.pem -o UserKnownHostsFile=/dev/null \
        -o StrictHostKeyChecking=no \
           /usr/local/lib/libgeos_c* $workerip:/usr/local/lib/
done
于 2015-07-07T23:43:42.677 回答
0

如果您libgeos_c.so在非标准位置有用于 GEOS 的 C API 的共享库,则可以设置环境变量以使用该文件:

export GEOS_LIBRARY_PATH=/path/to/libgeos_c.so.1

但是,您需要确保满足依赖关系。例如见:

ldd /path/to/libgeos_c.so.1

查看libgeos.py的源代码,了解如何使用环境变量来查找 GEOS C API 共享库。

于 2015-07-08T21:25:02.207 回答