我有一个包含20个节点的hadoop集群,其中15个节点有1个文件(在本地文件系统上),具有相同的名称。在Map Reduce程序中读取所有这15个文件的最佳方法是什么?
执行此操作的一种方法是在这15个节点中的每个节点上手动运行'hadoop fs -put ..'命令将文件复制到HDFS,但每个节点在HDFS上具有不同的名称,然后在地图缩减程序中从HDFS读取文件但是想知道是否有更好的替代方案可以避免这种手动转移。
谢谢!
答案 0 :(得分:0)
通常,您尝试避免在本地环境/本地文件系统设置方面在不同映射器之间存在差异。如果您需要查找特定文件,那么可能有必要包括一个预处理步骤,该步骤将文件从各个映射器计算机上载到hdfs目录 - 可能包括新路径中的本地主机名。也许你可以提一下这种有些非标准设置的推动力。
更新基于OP澄清。
在映射器中添加
的代码(a) checks if the file exists (on LocalFileSystem using normal java.io.File )
(b) if present then use java.io.FileInputStream, read it in.
(c) Then use **HDFS** commands to create new hdfs file and write the data to it
in = fs.open(new Path(uri));
因此,您将从本地FS读取并写入HDFS。当您写入HDFS时,可能会将本地计算机主机名添加到文件名中,以区分15台计算机。
另一次更新 OP继续添加新要求。要在同一台机器上处理多映射器的情况,然后在机器上创建未加点IP地址的hadoop计数器:每个映射器检查它是否已设置,如果没有(a)设置它并且(b)完成工作。 / p>
就新的大文件要求/平行,这是一个在这里无法满足的新要求。在回答原始问题时,请考虑接受此答案。可以就你正在提出的新问题进行单独的讨论。
第三次更新如何处理将大型本地文件上传到HDFS:我不知道任何简单方式。 HDFS可以并行加载/处理/存储大文件的原因是它们被分成块。本地文件系统不能拆分本地文件。
话虽这么说,你可以手动拆分文件并通过单独的线程并行上传它们的块。每个线程都需要“注册”哪个偏移量到他们正在加载的文件中。然而,这里有明显的问题。 (A)我想知道这是否可能实际上会降低速度,因为Disk Seeks不再是连续的。 (B)您打算如何将块保存到hdfs - 然后将它们重新组合为单个文件?