我有一个从我的map函数中调用的shell函数。 shell函数有2个参数 - >输入文件和输出文件。像这样的东西
$> 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-binary hdfs://master:53410/pathin/input.txt' hdfs://master:54310/pathout/output.txt
不管用。还有其他方法吗?我能否以某种方式将HDFS文件视为loacl文件?
我可以访问用C编写的unix-binary源代码。也许更改源代码会有帮助吗?
感谢
答案 0 :(得分:0)
您可以将文件添加到DistributedCache并从缓存中从映射器访问它。在本地文件上调用shell函数并将输出文件写入本地磁盘,然后将本地文件复制到HDFS。
但是,调用shell函数或从mapper / reducer中读/写等操作会破坏MapReduce范例。如果您发现自己需要执行此类操作,MapReduce可能不是您正在寻找的解决方案。 HDFS和MapReduce旨在对少量极大文件执行大规模批处理。
由于您可以访问unix-binary源代码,因此最好的选择可能是在java中实现您想要的特定功能。将输入文件提供给映射器并从数据映射器调用该函数,而不是使用HDFS / LocalFS上的文件。