我有一个由3个节点组成的Hadoop集群。我想尽快将180 GB文件加载到HDFS中。我知道-put和-copyFromLocal都不会帮助我,因为它们是单线程的。
我在思考Map / Reduce方面。有没有办法将加载过程分发给节点本身。因此每个节点将加载文件的一部分,每个文件为60 GB。我不想从每个节点手动执行此操作(这违背了目的)。如果有使用Java和Map / Reduce的方法,我很乐意阅读它。我知道Hadoop可以处理通配符输入文件。假设每个60GB的块命名如下:file_1,file_2,file_3..I然后我可以将file_ *用于我的下一个MR作业。我遇到的麻烦是理解如何以快速/多线程方式有效地将文件加载到hadoop中。
提前致谢!
修改
distcp - 似乎是并行复制到HDFS,但只在群集之间,而不是在群集中。我想知道为什么他们没有想到这一点,如果他们这样做,那么这有什么限制或瓶颈。 此外,http://blog.syncsort.com/2012/06/moving-data-into-hadoop-faster/似乎记录了围绕此主题的基准,但他们正在使用DMExpress(商业工具)进行加载。拥有一个开源替代品会很棒。
答案 0 :(得分:0)
使用您的配置,我不知道写入的并行化是否会提高您的性能,因为您想要写一个文件。
假设我们有默认配置。默认复制因子为3,因此当您的文件的每个块写入群集的3台计算机时(在您的情况下,在群集的所有计算机中),您的文件都被视为已写入。
如果每台计算机有多个磁盘,则将文件划分为最小部分(作为HDFS在一台计算机上使用的磁盘的一部分),只有在您的应用程序是唯一使用群集的应用程序时才能提高写入性能。您不受网络限制。在这种情况下,你的瓶颈就是你的磁盘。
如果您可以在客户端上管理分割文件,那么确保文件的所有部分都复制到HDFS上的简单方法是创建一个目录,该目录是与后缀一起连接的文件名,后缀表明该文件已打开复制。该目录包含文件的所有部分。完成所有复制线程后,您可以重命名该目录而不带后缀。只有删除后缀后,您的客户才能访问文件的所有部分。重命名包含在Namenode上的元数据操作中,与文件副本相比,它是最快的操作。
其他解决方案: