Tensorflow可以从Mac上的HDFS读取吗?

时间:2017-03-05 21:42:34

标签: dynamic tensorflow libraries

我试图在OS / X上强制Tensorflow从HDFS读取。文档

https://www.tensorflow.org/deploy/hadoop

没有明确说明这是否可行,而且代码仅指“posix”操作系统。我在尝试使用HDFS时遇到的错误如下:

  

UnimplementedError(参见上面的回溯):未实现文件系统方案hdfs            [[Node:ReaderReadV2 = ReaderReadV2 [_device =“/ job:localhost / replica:0 / task:0 / cpu:0”](TFRecordReaderV2,input_producer)]]

这就是我到目前为止所做的事情:

  1. brew安装了Hadoop 2.7.2
  2. 为本机库单独编译Hadoop 2.7.2。 Hadoop安装在我系统上的/usr/local/Cellar/hadoop/2.7.2/libexec上,本机库(libhdfs.dylib)位于〜/ Source / hadoop / hadoop-hdfs-project / hadoop-hdfs / target /hadoop-hdfs-2.7.2/lib/native。
  3. 编辑https://github.com/tensorflow/tensorflow/blob/v1.0.0/tensorflow/core/platform/hadoop/hadoop_file_system.cc#L113-L119处的代码以从libhdfs.dylib读取而不是libhdfs.so,重新编译并重新安装Tensorflow。 (我不得不承认这是非常愚蠢的,我不知道是否只需要使这个代码在Mac上运行。)
  4. 这是重现的代码。

    test.sh:

    set -x
    
    export JAVA_HOME=$($(dirname $(which java | xargs readlink))/java_home)
    export HADOOP_HOME=/usr/local/Cellar/hadoop/2.7.2/libexec
    
    . $HADOOP_HOME/libexec/hadoop-config.sh
    
    export HADOOP_HDFS_HOME=$(echo ~/Source/hadoop/hadoop-hdfs-project/hadoop-hdfs/target/hadoop-hdfs-2.7.2)
    
    export CLASSPATH=$($HADOOP_HDFS_HOME/bin/hdfs classpath --glob)
    
    # Virtual environment with Tensorflow and necessary dependencies
    . venv/bin/activate
    
    python ./test.py
    

    test.py:

    import tensorflow as tf
    
    _, example_bytes = tf.TFRecordReader().read(
        tf.train.string_input_producer(
            [
                "hdfs://localhost:9000/user/foo/feature_output/part-r-00000",
                "hdfs://localhost:9000/user/foo/feature_output/part-r-00001",
                "hdfs://localhost:9000/user/foo/feature_output/part-r-00002",
                "hdfs://localhost:9000/user/foo/feature_output/part-r-00003",
            ]
        )
    )
    
    with tf.Session().as_default() as sess:
        coord = tf.train.Coordinator()
        threads = tf.train.start_queue_runners(coord=coord)
        print(len(sess.run(example_bytes)))
    

    我在Tensorflow源代码中看到的代码路径似乎向我表明,如果问题确实是特定于mac的话,我会收到与上面不同的错误,因为某种处理程序已注册为“ hdfs“scheme无论如何:https://github.com/tensorflow/tensorflow/blob/v1.0.0/tensorflow/core/platform/hadoop/hadoop_file_system.cc#L474。有没有其他人成功强迫Tensorflow与Mac合作?如果它不受支持,是否有一个容易修补的地方?

    我也愿意接受关于什么可能是更好的方法的建议。高级目标是使用共享参数服务器并行地有效地训练模型,考虑到每个工作人员只读取数据的子集。这很容易使用本地文件系统来完成,但是如何扩展除此之外还不太清楚。即使我成功地使代码在上面工作,结果也可能会遇到数据局部性问题。

    此线程https://github.com/tensorflow/tensorflow/issues/2218建议使用pyspark.RDD.toLocalIterator在图中使用占位符迭代数据集。除了我强迫每个工作人员遍历整个数据集之外,我没有看到强制Tensorflow的内置Estimator类接受自定义feed函数以及指定的input_fn的方法,并且为了采取自定义input_fn似乎是必要的LinearClassifier(https://www.tensorflow.org/tutorials/linear)等模型的优点是能够从稀疏的加权特征中学习。

    有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您在构建时是否在./configure中启用了HDFS支持?如果HDFS被禁用,那就是你会得到的错误。

我认为您做出了正确的改变以使其发挥作用。随意发送拉取请求以在macOS上查找.dylib。