【发布时间】:2014-09-12 21:05:31
【问题描述】:
我正在尝试使用 hadoop fs -get 将数 TB 的数据从 hdfs 加载到本地,但完成此任务需要数小时。是否有另一种有效的方法可以将数据从 hdfs 获取到本地?
【问题讨论】:
我正在尝试使用 hadoop fs -get 将数 TB 的数据从 hdfs 加载到本地,但完成此任务需要数小时。是否有另一种有效的方法可以将数据从 hdfs 获取到本地?
【问题讨论】:
复制到本地文件系统的速度取决于许多因素,包括:
选项 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 mount 访问 HDFS 的多线程程序
【讨论】: