2012-01-27 2 views
6

나는 hadoop에서 스트리밍 작업으로 실행하려고하는 C++ 프로그램을 가지고 있습니다 (맵퍼 만 있고 감속기는 없습니다). 간단한 C++ 프로그램이 올바르게 작동하는 동안. 많은 공유 라이브러리와 연결되는 또 다른 C++ 프로그램은 그리드에서 작동하지 않습니다. 이 C++ 프로그램에 LDD는 다음을 보여줍니다이 공유 라이브러리는 데이터 노드의 실패에 설치되어 있지 않기 때문에 나는 생각스트리밍 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 

(이 OpenCV의 및 boost_serialization 같은 타사 라이브러리를 많이 사용합니다). 이 라이브러리를 tarball에 넣으려고했는데 -archives 옵션 (분산 캐시)을 사용하여이를 스트리밍 작업에 지정했습니다. 이것은 또한 작동하지 않습니다 (tarball의 내용이 데이터 노드의 적절한 디렉토리에 설치되었는지는 확실하지 않습니다).

어떻게해야할까요?

+0

이 문제가 해결되었습니다. 앞으로 Google 직원이 될 – sunillp

+5

님의 의견을 보내 주시면 솔루션을 제공해드립니다. –

+1

사실 모든 것이 좋았습니다. 필자는 응용 프로그램이 tarball로 사용하고있는 타사 라이브러리를 모두 번들로 묶어서 모든 데이터 노드에서 -archive 스트리밍 옵션을 사용하도록했습니다. 문제는 어떻게 든 하나의 파일을 입력으로 제공하는 반면 hadoop/MR은 두 개의 매퍼를 만드는 것이 었습니다. 따라서 두 개의 출력 파일이 생성되었는데, 하나는 크기가 0이고 다른 하나는 예상 된 데이터를가집니다. 나는 로그를보고 이것을 알아 냈다. 그런 다음 단일 입력 파일의 gzip을 실행하여 스트리밍에 사용했습니다. 이 일이 잘 진행된 후에. 단일 출력 파일이 있습니다. – sunillp

답변

0

C++ 프로그램을 정적으로 컴파일하십시오. 기본적으로 :

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

이렇게하면 종속성이없는 바이너리가 생성됩니다. 그것은 부피가 커질 것입니다 (그것에 strip를 달려라!) 그러나 그것이 연속적으로 달리는 경우에 문제가 있으면 안된다.

관련 문제