我正在尝试使用hadoop fs -get从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挂载访问HDFS的多线程程序。