2017-02-17 32 views
2

我在运行python时遇到错误“libhdfs.so:无法打开共享目标文件:没有这样的文件或目录”(下面的堆栈跟踪)脚本在存储在HDFS中的文件上调用Tensorflow阅读器。我正在集群上的一个节点上运行脚本,该节点在virtualenv中有Tensorflow,在执行时激活。用HDFS上的文件运行tensorflow(找不到libhdfs.so)

  • 出口HADOOP_HDFS_HOME = $ HADOOP_HDFS_HOME:中:/ opt/Cloudera公司/包裹/ CDH
  • 出口JAVA_HOME =/usr/lib目录/ 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/lib目录/ 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',而不是'export LD_LIBRARY_PATH = $ LD_LIBRARY_PATH:/ opt/cloudera/parcels/CDH/lib/libhdfs.so'目录名称而不是文件名)? – mrry

+0

@ mrry,这是个好主意。我试过了,现在我得到了下面的错误:“java.io.IOException:No FileSystem for scheme:hdfs”。唯一相关的问题,我可以找到在http://stackoverflow.com/questions/17265002/hadoop-no-filesystem-for-scheme-file,这表明与maven相关的问题。据我所知,我没有在执行脚本时调用maven。 – stacksonstacks

回答

0

我也遇到过这个问题对我来说是将该文件复制到解决方案:

$ HADOOP_HDFS_HOME/lib中/本地

如果你不知道这个文件的位置,执行以下命令找到它的位置:

sudo updatedb 
locate libhdfs.so 

这会给你文件的位置。下一步将文件复制到$ HADOOP_HDFS_HOME/lib中/本地:

cp locationOflibhdfs.so $HADOOP_HDFS_HOME/lib/native 

注:与libhdfs.so文件的位置替换locationOflibhdfs.so。