如何在最新的Tensorflow 2.6.0中访问HDFS文件系统?

fd3cxomn  于 2022-12-09  发布在  HDFS
关注(0)|答案(1)|浏览(298)

我最近将我的程序中使用的tensorflow版本升级到了最近发布的2. 6. 0,但是我遇到了一个麻烦。

import tensorflow as tf

pattern = 'hdfs://mypath'
print(tf.io.gfile.glob(pattern))

上述API在2.6版中抛出异常:

tensorflow.python.framework.errors_impl.UnimplementedError: File system scheme'hdfs' not implemented (file:xxxxx)

然后我检查了相关的实现代码,发现官方推荐使用tensorflow/io访问hdfs,并提供了环境变量TF_USE_MODULAR_FILESYSTEM来使用legacy访问支持,由于我的代码比较复杂,很难在短时间内重构,所以我尝试使用这个环境变量,但仍然失败了。
总的来说,我的问题是:
1.在最新版本的tensorflow中,如果不使用“tfio”,我如何仍然可以访问HDFS文件?
1.如果必须使用“tfio”,tf.io.gfile.glob的等效代码调用是什么?

pinkon5k

pinkon5k1#

TL.DR.安装tensorflow-io并将其导入.

经过一番折腾,我找到了一个解决办法(可能是官方推荐的办法):
自v2.6.0起,Tensorflow不再在框架中提供HDFS、GCS和其他文件系统支持,而是将这些支持转移到Tensorflow/IO项目。
因此,在未来版本中,要支持HDFS、GCS和其他文件系统,您只需安装tensorflow-io并将其导入到培训计划

$ pip install tensorflow-io

$ cat test.py
import tensorflow as tf
import tensorflow_io as tfio

print(tf.io.gfile.glob('hdfs://...'))

$ CLASSPATH=$(${HADOOP_HOME}/bin/hadoop classpath --glob) python test.py

它将加载libtensorflow_io. so和libtensorflow_io_plugins. so,其中包含每个extras文件系统的实现和注册逻辑:

# tensorflow_io/python/ops/__init__.py
core_ops = LazyLoader("core_ops", "libtensorflow_io.so")
try:
    plugin_ops = _load_library("libtensorflow_io_plugins.so", "fs")
except NotImplementedError as e:
    warnings.warn("unable to load libtensorflow_io_plugins.so: {}".format(e))
    # Note: load libtensorflow_io.so imperatively in case of statically linking
    try:
        core_ops = _load_library("libtensorflow_io.so")
        plugin_ops = _load_library("libtensorflow_io.so", "fs")
    except NotImplementedError as e:
        warnings.warn("file system plugins are not loaded: {}".format(e))

参考编号:

相关问题