我有一个从我的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文件视为本地文件吗?我可以访问用C编写的unix-binary源代码。也许更改源代码会有所帮助?
谢谢
最佳答案
您可以将文件添加到DistributedCache并从缓存中的映射器访问它。在本地文件上调用shell函数,然后将输出文件写入本地磁盘,然后将本地文件复制到HDFS。
但是,诸如调用shell函数或从mapper / reducer内部进行读/写之类的操作破坏了MapReduce范例。如果您发现自己需要执行此类操作,则MapReduce可能不是您想要的解决方案。 HDFS和MapReduce旨在对少量极大型文件执行大规模批处理。
由于您可以访问unix-binary源代码,因此最好的选择是在Java中实现所需的特定功能。将输入文件提供给映射器,然后从映射器对数据进行调用,而不是使用HDFS / LocalFS上的文件。
关于file - 直接从HDFS读取文件到Shell函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9532435/