File 将文件直接从HDFS读入shell函数

File 将文件直接从HDFS读入shell函数,file,hadoop,local,hdfs,File,Hadoop,Local,Hdfs,我有一个shell函数,它是从map函数内部调用的。shell函数接受两个参数->一个输入文件和一个输出文件。像这样的 $> unix-binary /pathin/input.txt /pathout/output.txt 问题是,这些input.txt文件驻留在HDFS中,而output.txt文件需要写回HDFS。目前,我首先使用fs.copyToLocalFile将所需文件复制到本地硬盘驱动器中,调用unix二进制文件,然后使用fs.copyFromLocalFile将outpu

我有一个shell函数,它是从map函数内部调用的。shell函数接受两个参数->一个输入文件和一个输出文件。像这样的

$> unix-binary /pathin/input.txt /pathout/output.txt
问题是,这些input.txt文件驻留在HDFS中,而output.txt文件需要写回HDFS。目前,我首先使用
fs.copyToLocalFile
将所需文件复制到本地硬盘驱动器中,调用unix二进制文件,然后使用
fs.copyFromLocalFile
将output.txt写回HDFS。 这种方法的问题是,它不是最优的,因为它涉及大量冗余的读写到HDD,这会降低性能。所以,我的问题是,如何直接读取HDFS文件作为输入,并将结果直接输出到HDFS? 明显地
$>unix二进制文件hdfs://master:53410/pathin/input.txt' hdfs://master:54310/pathout/output.txt
这是行不通的。还有别的办法吗?我是否可以以某种方式将HDFS文件视为loacl文件? 我可以访问用C编写的unix二进制源代码。也许更改源代码会有所帮助?
谢谢

您可以将文件添加到,并从缓存中的映射器访问它。对本地文件调用shell函数,将输出文件写入本地磁盘,然后将本地文件复制到HDFS

但是,调用shell函数或从mapper/reducer中读取/写入等操作会破坏MapReduce范式。如果您发现自己需要执行此类操作,则MapReduce可能不是您正在寻找的解决方案。HDFS和MapReduce设计用于对少量超大文件执行大规模批处理

由于您可以访问unix二进制源代码,因此最好的选择可能是在java中实现所需的特定函数。将输入文件馈送到映射器,并从映射器中对数据调用函数,而不是使用HDFS/LocalFS上的文件