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

时间:2014-09-12 21:05:31

标签: hadoop hdfs bigdata

我正在尝试使用hadoop fs -get从hdfs加载数TB的数据,但是完成此任务需要数小时。是否有另一种有效的方法可以将数据从hdfs传输到本地?

1 个答案:

答案 0 :(得分:4)

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

  1. 您是并行还是串行复制。
  2. 文件是否可拆分(映射器是否可能处理数据块而不是文件,如果在HDFS上有某些类型的压缩文件,通常会出现问题)
  3. 网络带宽当然是因为您可能会从许多DataNode中提取
  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 APINFS mount

    访问HDFS。