hadoop集群中有20个具有相同文件名的节点

mzsu5hc0  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(346)

我有一个hadoop集群,有20个节点,其中15个节点有1个同名文件(在本地文件系统上)。在map reduce程序中读取这15个文件的最佳方法是什么?
一种方法是在这15个节点中的每个节点上手动运行“hadoop fs-put..”命令,将文件复制到hdfs,但每个节点在hdfs上的名称不同,然后在map reduce程序中从hdfs读取文件,但不知道是否有更好的替代方法来避免这种手动传输。
谢谢!!

jfewjypa

jfewjypa1#

退一步:给定的Map器如何知道要使用哪些本地文件系统路径名(给定20个路径中的5个不同于其他路径)?他们要试错吗?
通常,您会尽量避免不同Map器之间在本地环境/本地文件系统设置方面存在差异。如果您需要查找特定的文件,那么是的,可能需要包含一个预处理步骤,该步骤将文件从各个Map器计算机上载到hdfs目录—可能在新路径中包含本地主机名。也许你可以提到一点关于这种非标准设置的动力。
根据op澄清进行更新。
在Map器中添加

(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的另一个更新继续增加新的需求。要处理同一台机器上有多个Map器的情况,请为该机器上的非点式ip地址创建hadoop计数器:每个Map器检查是否设置了它,如果没有(a)设置它,并且(b)执行工作。
至于新的大文件要求/并行性,这是一个新的要求,在这里不能满足。请考虑接受这个答案,因为它已经回答了原来的问题。你可以单独讨论你摆出的新姿势。
第三次更新如何处理上传大型本地文件到hdfs:我不知道任何简单的方法来做到这一点。hdfs能够并行加载/处理/存储大型文件的原因是它们被分解成块。本地文件系统不能拆分本地文件。
也就是说,您可以手动拆分文件,并通过单独的线程并行上传文件块。每个线程都需要将哪个偏移量“注册”到正在加载的文件中。然而,这里有一些突出的问题(a) 我想知道这是否真的会降低速度,因为磁盘搜索将不再是连续的(b) 您计划如何将这些块保存到hdfs中,然后将它们重新组合为单个文件?

相关问题