【问题标题】:20 nodes with same filename in hadoop clusterhadoop集群中有20个文件名相同的节点
【发布时间】:2014-01-26 02:24:11
【问题描述】:

我有一个包含 20 个节点的 hadoop 集群,其中 15 个节点有 1 个同名文件(在其本地文件系统上)。在 Map Reduce 程序中读取所有这 15 个文件的最佳方法是什么?

一种方法是在这 15 个节点中的每一个节点上手动运行“hadoop fs -put..”命令以将文件复制到 HDFS,但每个节点在 HDFS 上具有不同的名称,然后在 map reduce 程序中从 HDFS 读取文件但想知道是否有更好的选择可以避免这种手动转移。

谢谢!!

【问题讨论】:

    标签: hadoop


    【解决方案1】:

    退一步:给定的 Mapper 如何知道要使用哪些本地文件系统路径名(假设 20 个中的 5 个与其他路径名不同)?他们会反复试验吗?

    通常,您会尽量避免不同映射器在本地环境/本地文件系统设置方面的差异。如果您需要查找特定文件,那么是的,包括一个将文件从各个映射器机器上传到 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) 完成工作。

    就新的大文件要求/并行性而言,这是一个在这里无法满足的新要求。请考虑接受这个答案,因为它已经回答了原始问题。可以单独讨论您要摆出的新姿势。

    第三次更新如何处理将大型本地文件上传到 HDFS:我不知道任何 简单 方法可以做到这一点。 HDFS 可以并行加载/处理/存储大文件的原因是它们被分成块。本地文件不能被本地文件系统分割。

    话虽如此,您可以手动拆分文件并通过单独的线程并行上传文件块。每个线程都需要“注册”它们正在加载的文件中的偏移量。然而,这里存在明显的问题。 (A) 我想知道这是否真的会降低速度,因为磁盘搜索将不再是连续的。 (B) 你打算如何将块保存到 hdfs - 然后将它们重组为单个文件?

    【讨论】:

    • 忘了说本地文件只存在于 20 个节点中的 15 个。剩下的 5 个节点没有任何文件可以从其本地文件系统中读取,但它们是集群的一部分(作为数据节点)。在这种情况下,您建议如何将文件从本地 FS 移动到 Map Reduce 代码中的 HDFS?
    • 我们不能假设每台机器上只有一个mapper,如果文件太大,我们希望看到更多的mapper并行运行。我认为如果 2 个或更多映射器尝试将数据从本地 FS 复制到 HDFS,将会出现问题。我们能避免吗?
    • 感谢您的所有 cmets。如果您对大尺寸数据文件(以 GB 为单位)有任何建议,请告诉我。
    • 感谢接受。我还添加了 cmets 来处理大型本地文件的上传。
    猜你喜欢
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2013-05-17
    • 2017-05-20
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多