【发布时间】:2017-02-17 21:42:59
【问题描述】:
我在尝试对存储在 HDFS 中的文件运行调用 Tensorflow 阅读器的 python 脚本时遇到错误“libhdfs.so:无法打开共享对象文件:没有这样的文件或目录”(下面的堆栈跟踪)。我在集群上的一个节点上运行脚本,该节点在 virtualenv 中有 Tensorflow,在执行时激活。我在执行前设置了以下环境变量:
- 导出 HADOOP_HDFS_HOME=$HADOOP_HDFS_HOME:/opt/cloudera/parcels/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/server
我这样执行脚本:
- CLASSPATH=$($LD_LIBRARY_PATH} 类路径 --glob) python 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
【问题讨论】:
-
您应该尝试
ldd以查看文件是否已解析。由于这是一个安装问题,请在我们的 github 页面和 CC @jhseu 中提出问题。 -
你可以试试
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,这是个好主意。我试过了,现在我得到了以下错误:“java.io.IOException: No FileSystem for scheme: hdfs”。我能找到的唯一相关问题是stackoverflow.com/questions/17265002/…,这表明存在与 Maven 相关的问题。据我所知,执行脚本时我没有调用 maven。
-
我认为这意味着您的
CLASSPATH不包含正确的 JAR 文件以支持 HDFS。根据您的问题,我无法弄清楚CLASSPATH扩展为什么,但它可能缺少部分或全部 Hadoop JAR。
标签: python hadoop tensorflow