从HDFS有效地将数据加载到本地系统的方法?

3

我正在尝试使用hadoop fs -get从HDFS加载数千兆字节的数据到本地,但这个任务需要几个小时才能完成。是否有其他有效的方式从HDFS获取数据到本地?

1个回答

5

本地文件系统的复制速度取决于许多因素,包括:

  1. 并行还是串行复制。
  2. 文件是否可分割(一个mapper是否可以处理数据块而不是整个文件,通常在HDFS上有某些类型的压缩文件时会出现问题)
  3. 网络带宽,因为您可能需要从许多DataNode中提取数据。

选项1:DistCp

无论如何,由于您的文件在HDFS上,我们知道每个hadoop从节点都可以看到数据。您可以尝试使用DistCp命令(分布式复制),它将使您的复制操作成为一个并行MapReduce作业,并且有一个主要的警告!

主要警告:这将是一个分布式复制过程,因此您在命令行上指定的目标必须是所有节点都可见的位置。为此,您可以在所有节点上挂载网络共享,并指定该网络共享(NFS、Samba、其他)中的目录作为文件的目标。这可能需要涉及系统管理员,但结果可能是更快的文件复制操作,因此成本效益由您决定。

DistCp文档在这里:http://hadoop.apache.org/docs/r0.19.0/distcp.html

DistCp示例:YourShell> hadoop distcp -i -update /path/on/hdfs/to/directoryOrFileToCopy file:///LocalpathToCopyTo

选项2:使用HDFS API的多线程Java应用程序

正如您发现的那样,hadoop fs-get是一个顺序操作。如果您的java技能足够,可以使用hadoop文件系统API调用编写自己的多线程复制程序。

选项3:使用HDFS REST API的任何语言的多线程程序

如果您知道与Java不同的语言,则可以类似地编写通过HDFS REST API或作为NFS挂载访问HDFS的多线程程序。


关于DistCp的注意事项,您的解释非常好,我之前并不知道。 - frb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接