我正在尝试使用hadoop fs -get从hdfs加载数TB的数据,但是完成此任务需要数小时。是否有另一种有效的方法可以将数据从hdfs传输到本地?
答案 0 :(得分:4)
复制到本地文件系统的速度取决于许多因素,包括:
选项1:DistCp
在任何情况下,由于您声明文件在HDFS上,我们知道每个hadoop从节点都可以看到数据。您可以尝试使用DistCp命令(分布式副本),这将使您的复制操作成为一个主要CAVEAT的并行MapReduce作业!。
MAJOR CAVEAT:这将是一个分布式复制过程,因此您在命令行上指定的目标必须是所有节点都可见的位置。为此,您可以在所有节点上安装网络共享,并在该网络共享(NFS,Samba,Other)中指定目录作为文件的目标。这可能需要系统管理员参与,但结果可能是一个更快的文件复制操作,所以成本效益由您决定。
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。