我有一个C++程序,我正试图在hadoop上作为流作业运行(它只有映射器,没有还原器)。而一个简单的C++程序可以正常工作。另一个与许多共享库链接的C++程序在网格上不起作用。这个C++程序上的ldd显示如下:(它使用了很多第三方库,如opencv和boostrongerialization)
/usr/local/lib/libboost_serialization.so.1.48.0 /usr/local/lib/libfftw3f.so.3 /usr/local/lib/libconfig++.so.9 /usr/local/lib/liblog4cpp.so.4 /usr/local/lib/libopencv_core.so.2.3 /usr/local/lib/libopencv_contrib.so.2.3
我认为,因为这些共享库没有安装在数据节点上,所以它失败了。我试图将这些库放在一个tarball中,并使用-archives选项(分布式缓存)将其指定给流作业。这也不起作用(我不确定tarball中的内容是否安装在数据节点上的相应目录中)。
知道怎么做吗?
静态编译C++程序。基本上:
g++ -o <progra> -static <object-files>
这将生成一个没有依赖关系的二进制文件。它会很笨重(在上面运行strip
!),但如果它连续运行,应该不会有问题。