【发布时间】:2017-02-28 18:16:44
【问题描述】:
我有一个封闭的源应用程序,它将文件作为输入,计算其哈希值并执行一些我无法控制的其他事情。修改源代码或逆向工程是不可行的。
该程序旨在处理常规文件,但是我需要从 HDFS 提供一个非常大的文件。复制文件会占用太多时间和磁盘空间。所以我在考虑使用 FUSE 但我没有找到一个好的解决方案。我尝试使用如下命名管道:
func readFile(namenode, path string, pipe *os.File) {
client, err := hdfs.New(namenode)
log.Println(err, client)
hdfsFile, err := client.Open(path)
if err != nil {
log.Fatal(err)
}
log.Println(hdfsFile)
// written, err := io.Copy(pipe, hdfsFile)
bytes := make([]byte, 4096)
for {
read, err := hdfsFile.Read(bytes)
log.Println(read, err)
if err != nil {
break
}
written, err := pipe.Write(bytes)
log.Println(written, err)
}
err = pipe.Close()
log.Println(err)
}
我知道上面的代码不完整,测试文件是 10MB,但是在读取 8 次 4096 字节的命名管道缓冲区后,其他程序将其全部占用并关闭管道。
但是过了一会儿,另一个正在读取管道的程序关闭了管道,我得到了管道损坏的错误。除了fuse和pipe之外,还有没有创建虚拟文件的可能?
【问题讨论】:
标签: hadoop go named-pipes fuse