Hadoop Pipes не может найти общие библиотеки

Я получаю эту ошибку при запуске программы для каналов Hadoop. Программа успешно компилируется, но не работает на каналах Hadoop.

error while loading shared libraries: Lib.so.0: cannot open shared object file: No such file or directory

Makefile:

CC = g++
HADOOP_PATH = usr/lib/HADOOP
OTHERLIB1_PATH = usr/lib/OTHERLIB1
OTHERLIB2_PATH = usr/lib/OTHERLIB2
OTHERLIB3_PATH = usr/lib/OTHERLIB3
OTHERLIB4_PATH = usr/lib/OTHERLIB4
IMAGE_PATH = usr/lib/IMAGE
LIB_PATH = ../../../src/Lib
PLATFORM = Linux-amd64-64

CFLAGS_HDP =  -O3 \
        -I$(LIB_PATH) \
        -I$(OTHERLIB1_PATH)/include \
        -I$(HADOOP_PATH)/$(PLATFORM)/include \
        -I$(OTHERLIB4_PATH)/include \
        -I$(OTHERLIB2_PATH)/include \
        -I$(OTHERLIB3_PATH)/include 

LDFLAGS_HDP =   -L$(OTHERLIB1_PATH)/lib \
        -L$(HADOOP_PATH)/$(PLATFORM)/lib \
        -L$(OTHERLIB3_PATH)/lib \
        -L$(OTHERLIB2_PATH)/lib \
        -L$(OTHERLIB4_PATH)/lib \
        -L$(LIB_PATH)/.libs \
        -lhadooppipes -lhadooputils -lpthread -lcrypto\
        -lLib -lLib4 -lLib1

all: pipes clean 

clean:
        rm  *.o

pipes: LibPipes.cpp xml DocToXml
    $(CC) $(CFLAGS_HDP) \
    LibPipes.cpp \
    -o Lib_Pipes base64.o \
    xml.o DocToXml.o $(LDFLAGS_HDP)


xml: xml.cpp base64
        $(CC) $(CFLAGS_HDP) base64.o -c xml.cpp -o xml.o

base64: base64.cpp
        $(CC) $(CFLAGS_HDP) -c base64.cpp -o base64.o

DocToXml: DocToXml.cpp
        $(CC) $(CFLAGS_HDP) -c DocToXml.cpp -o  DocToXml.o

Я запускаю программу на hadoop с помощью следующей команды:

hadoop pipes \
-D hadoop.pipes.java.recordreader=false \
-D hadoop.pipes.java.recordwriter=false \
-D mapred.map.tasks=128 \
-inputformat org.apache.hadoop.mapred.SequenceFileInputFormat \
-writer org.apache.hadoop.mapred.SequenceFileOutputFormat \
-reduce org.apache.hadoop.mapred.lib.IdentityReducer \
-input Input \
-output Output \
-program /user/uss/bin/Lib_Pipes \
-reduces 1

Кажется, это проблема, вызванная динамической компоновкой. Я попытался передать библиотеки для hadoop, используя флаг -files. Также пытаюсь связать эту программу статически, используя разные флаги компиляции, такие как -static, -Bstatic, -static-libgcc, -static-libstdc++, но они также не работают. Кто-нибудь знает, как обрабатывать этот тип двоичных файлов на каналах Hadoop? Любая помощь будет оценена по достоинству.


person HM23MD    schedule 31.10.2011    source источник


Ответы (2)


Решение, которое я использую, состоит в том, чтобы заархивировать все ваши внешние библиотеки и использовать флаг -archives в каналах.

zip -r my.zip lib/

Здесь lib/ содержит все ваши .so файлы, которые вы хотите связать.

ИЗМЕНИТЬ

Также добавьте -rpath my.zip/lib к LDFLAGS_HDP. Чтобы компиляция заработала, вам также необходимо сделать следующее.

# in src dir
mkdir -p my.zip/lib

/РЕДАКТИРОВАТЬ

Затем используйте свою команду для запуска каналов и добавьте

-archives my.zip
person Matt D    schedule 31.10.2011
comment
Неужели нет другого способа решить эту проблему? То есть можем ли мы статически связать библиотеки, чтобы весь двоичный файл содержал все библиотеки? - person HM23MD; 31.10.2011
comment
Кажется, что статическая привязка должна работать, но ваши комментарии намекают, что это не так. Я также хотел бы посмотреть, получил ли кто-нибудь еще статическую ссылку на работу. - person Matt D; 31.10.2011
comment
Итак, должен ли я создать каталог my.zip/lib с файлами .so и заархивировать его? Кроме того, я получаю g++: нераспознанный параметр '-rpath' при запуске make. Это правильно? - person HM23MD; 04.11.2011
comment
Разобрался с проблемой. Это был пробел после , в флаге -files. - person HM23MD; 11.11.2011

Разобрался с проблемой. Это был пробел после , в флаге -files.

person HM23MD    schedule 11.11.2011