2012-01-27 50 views
6

我有一个C++程序,我试图在hadoop(它只有映射器,没有reducer)上作为流作业运行。一个简单的C++程序正常工作。与许多共享库链接的另一个C++程序不适用于网格。这个C++程序LDD显示以下内容:(它使用很多像OpenCV的和boost_serialization第三方库)流C++程序和共享库

/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的内容是否安装在数据节点的相应目录中)。

任何想法如何去做这件事?

+0

解决了这个问题。 – sunillp 2012-01-29 15:46:37

+5

为谷歌今后的人,请与我们分享您的解决方案! – 2012-01-31 06:17:21

+1

其实一切都很好。我将我的应用程序使用的所有第三方库作为tarball捆绑在一起,并使用-archive streaming选项使其可用于所有数据节点。问题在于hadoop/MR创建两个映射器,而我只提供一个文件作为输入。所以生成了两个输出文件,一个文件大小为零,另一个文件具有预期的数据。我通过查看日志来了解这一点。然后我做了一个gzip的单个输入文件,并用它来进行流式传输。在这之后,事情很好。有单个输出文件。 – sunillp 2012-02-06 10:57:30

回答

0

静态编译C++程序。基本上:

g++ -o <progra> -static <object-files> 

这将产生一个没有依赖关系的二进制文件。这将是庞大的(运行strip!),但如果它连续运行,你应该没有问题。