hadoop - Golang 虚拟文件

标签 hadoop go named-pipes fuse

我有一个封闭的 source 应用程序,它将一个文件作为输入,计算它的哈希值并做一些我无法控制的其他事情。修改源代码或逆向工程是不可行的。

该程序旨在处理常规文件,但我需要从 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 之外的虚拟文件?

最佳答案

我认为您对 FUSE 的想法是正确的。如果没有上游应用程序的源代码,就很难说出它试图使用什么文件语义(尽管使用 strace 的一些时间可能有助于阐明正在发生的事情。也许......)。

无论如何,我会看看 the Go-FUSE project , 具体来说 the hello.go example ,它准确地展示了如何很好地处理单个文件的情况。

关于hadoop - Golang 虚拟文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40125764/

相关文章:

go - 如何修复 'name' is undefined on object 错误?

pointers - 如何在 Go 中存储对操作结果的引用?

c - 使用管道

bash - 使用 mkfifo 和传输流,这可能吗?

mysql - 命名 fifo 管道是否使用磁盘写入和读取?

java - Java:从FTP下载.Zip文件并提取内容而不将文件保存在本地系统上

Hadoop排名列

hadoop - 使用PIG的电影数据集分析

hadoop - 如何在 Spark 中处理 Map<Key,value>?

go - "go get golang.org/x/tools/go/gcimporter15"在未定义的标识符上失败