2017-02-17 14 views
2

У меня возникает ошибка «libhdfs.so: невозможно открыть файл общих объектов: нет такого файла или каталога» (трассировка стека ниже) при попытке запустить python скрипт, вызывающий считыватель Tensorflow в файле, хранящемся в HDFS. Я запускаю сценарий на узле кластера, который имеет Tensorflow в virtualenv, активированном во время выполнения. Я установил следующие переменные окружения перед выполнением:Запуск тензорного потока с файлом на HDFS (не найден libhdfs.so)

  • экспорта HADOOP_HDFS_HOME = $ HADOOP_HDFS_HOME:/Opt/Cloudera/посылок/CDH
  • экспорт JAVA_HOME =/USR/Библиотека/JVM/Java-7-OpenJDK-amd64
  • экспорт LD_LIBRARY_PATH = $ LD_LIBRARY_PATH: /opt/cloudera/parcels/CDH/lib/libhdfs.so
  • экспорт LD_LIBRARY_PATH = $ LD_LIBRARY_PATH: $ {JAVA_HOME}/JRE/Библиотека/amd64/сервер

Я выполняю скрипт как таковой:

  • CLASSPATH = $ ($ LD_LIBRARY_PATH} --glob классам) питон TEST.py

Это код в скрипте:

filename_queue = tf.train.string_input_producer([ 
    "hdfs://hostname:port/user/hdfs/test.avro" ]) 
reader = 
    tf.WholeFileReader() key, value = reader.read(filename_queue) 

    with tf.Session() as sess: 
     coord = tf.train.Coordinator() 
     threads = tf.train.start_queue_runners(coord=coord) 
     sess.run([key,value]) 
     coord.request_stop() 
     coord.join(threads) 

Ниже стек след ошибки. Любые идеи о том, что вызывает эту ошибку, оценены (я уже проверял, что переменная LD_LIBRARY_PATH имеет явный указатель на файл libhdfs.so до выполнения, неспособный понять, почему он все еще не может найти файл).

Traceback (most recent call last): 
    File "TEST.py", line 25, in <module> 
    sess.run([key,value]) 
    File "/home/username/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 767, in run 
    run_metadata_ptr) 
    File "/home/username/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 965, in _run 
    feed_dict_string, options, run_metadata) 
    File "/home/username/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1015, in _do_run 
    target_list, options, run_metadata) 
    File "/home/username/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1035, in _do_call 
    raise type(e)(node_def, op, message) 
tensorflow.python.framework.errors_impl.NotFoundError: libhdfs.so: cannot open shared object file: No such file or directory 
    [[Node: ReaderReadV2 = ReaderReadV2[_device="/job:localhost/replica:0/task:0/cpu:0"](WholeFileReaderV2, input_producer)]] 

Caused by op u'ReaderReadV2', defined at: 
    File "TEST.py", line 19, in <module> 
    key, value = reader.read(filename_queue) 
    File "/home/username/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/ops/io_ops.py", line 272, in read 
    return gen_io_ops._reader_read_v2(self._reader_ref, queue_ref, name=name) 
    File "/home/username/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/ops/gen_io_ops.py", line 410, in _reader_read_v2 
    queue_handle=queue_handle, name=name) 
    File "/home/username/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/framework/op_def_library.py", line 763, in apply_op 
    op_def=op_def) 
    File "/home/username/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2395, in create_op 
    original_op=self._default_original_op, op_def=op_def) 
    File "/home/username/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1264, in __init__ 
    self._traceback = _extract_stack() 

NotFoundError (see above for traceback): libhdfs.so: cannot open shared object file: No such file or directory 
+0

Вы должны попробовать 'ldd', чтобы узнать, разрешен ли файл. Поскольку это проблема с установкой, напишите на нашей странице github и CC @jhseu. – drpng

+2

Вместо 'export LD_LIBRARY_PATH = $ LD_LIBRARY_PATH:/opt/cloudera/parcels/CDH/lib/libhdfs.so' вы можете попробовать' export LD_LIBRARY_PATH = $ LD_LIBRARY_PATH:/opt/cloudera/parcels/CDH/lib' (т. Е. Добавить имя каталога вместо имени файла)? – mrry

+0

@mrry, это была хорошая идея. Я попробовал, и теперь я получаю следующую ошибку: «java.io.IOException: No FileSystem для схемы: hdfs». Единственная связанная с этим проблема, которую я мог найти, - это http://stackoverflow.com/questions/17265002/hadoop-no-filesystem-for-scheme-file, что говорит о проблеме, связанной с maven. Насколько я знаю, я не вызываю maven при выполнении сценария. – stacksonstacks

ответ

0

Я также столкнулся с этим вопросом, решение для меня было копируя этот файл:

$ HADOOP_HDFS_HOME/Библиотека/родной

Если вы не знаете расположение этого файла выполните следующее чтобы найти его местоположение:

sudo updatedb 
locate libhdfs.so 

Это даст вам месторасположение файла. Затем скопируйте файл в $ HADOOP_HDFS_HOME/Библиотека/нативного:

cp locationOflibhdfs.so $HADOOP_HDFS_HOME/lib/native 

Примечание: Заменить locationOflibhdfs.so с расположением файла libhdfs.so.