簡體   English   中英

Geos,Shapely和Hadoop流

[英]Geos, Shapely and Hadoop Streaming

我正在嘗試運行Hadoop流作業來處理地理空間數據。 為此,我使用需要libgeos的 Shapely函數。

但是,該作業失敗,因為在群集上未安裝libgeos。

有沒有辦法出貨libgeos到群集,並有身材勻稱閱讀.so從目錄中的文件(也許-archives-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']

如果要將文件從主節點復制到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

如果在非標准位置具有用於GEOS的C API的libgeos_c.so共享庫,則可以設置環境變量以使用該文件:

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

但是,您需要確保滿足依賴性。 例如:

ldd /path/to/libgeos_c.so.1

請參閱libgeos.py的源代碼,以了解如何使用環境變量查找GEOS C API共享庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM