2012-03-02 59 views
0

我有一个从我的map函数中调用的shell函数。 shell函数需要2个参数 - >输入文件和输出文件。这样直接从HDFS读取文件到shell函数中

$> unix-binary /pathin/input.txt /pathout/output.txt 

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

回答

0

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

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

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