我有一个由3个节点组成的hadoop集群。我想尽快将一个180 gb的文件加载到hdfs中。我知道-put和-copyfromlocal都不会在这方面帮助我,因为它们是单线程的。
我在考虑Map/缩小。有没有一种方法可以将加载过程分配给节点本身。因此,每个节点将加载文件的一部分,即每个60 gb。我不想从每个节点手动执行此操作(这会破坏目的)。如果有办法使用java和map/reduce来实现这一点,我很乐意阅读相关的文章。我知道hadoop可以处理通配符输入文件。假设每个60gb块的名称是这样的:file1,file2,file3..然后我可以在下一个mr jobs中使用file3。我遇到的问题是理解如何以快速/多线程的方式高效地将文件首先加载到hadoop中。
提前谢谢!
编辑:
distcp-似乎在并行复制到hdfs中,但只是在集群之间,而不是集群内。我想知道为什么他们没有想到这一点,如果他们想到了,这方面的限制或瓶颈是什么。也http://blog.syncsort.com/2012/06/moving-data-into-hadoop-faster/ 似乎围绕这个主题记录了基准测试,但是他们使用dmexpress(商业工具)来进行加载。如果有一个开源的替代方案就太好了。
1条答案
按热度按时间sdnqo3pr1#
对于您的配置,我不知道写操作的并行化是否会提高性能,因为您只想写一个文件。
假设我们有默认配置。默认的复制因子是3,因此当文件的每个块都写入集群的3台计算机(在您的情况下,在集群的所有计算机中)时,您的文件被认为是已写入的。
如果您的每台计算机有多个磁盘,那么将文件划分为最小部分(作为一台计算机上hdfs使用的磁盘的一部分)有助于提高写入性能,前提是您的应用程序是唯一使用集群的应用程序,并且您不受网络的限制。在这种情况下,瓶颈是磁盘。
如果您可以在客户机上管理分割的文件,那么确保文件的所有部分都复制到hdfs上的一个简单方法是创建一个目录,该目录是您的文件名,并带有一个后缀,表示该文件正在复制中。此目录包含文件的所有部分。当所有复制线程完成后,您可以重命名目录而不加后缀。只有删除后缀后,您的客户端才能访问文件的所有部分。重命名由namenode上的元数据中的一个操作组成与文件复制相比,它是一个最快的操作。
其他解决方案:
使用标记文件不是最好的选择,因为会丢失一个hdfs块(默认情况下,块大小为128mb)。
从文件的各个部分重新创建文件类似于重写数据,因此效率很低。