Hadoop Pipes не может найти общие библиотеки - PullRequest
2 голосов
/ 31 октября 2011

Я получаю эту ошибку при запуске программы hadoop pipe. Программа успешно компилируется, но не работает на каналах 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? Любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 11 ноября 2011

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

1 голос
/ 31 октября 2011

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

zip -r my.zip lib/

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

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

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

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

/ EDIT

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

-archives my.zip
...