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

exp*_*his 3 hadoop bigdata hdfs

我正在尝试使用hadoop fs -get将数TB的数据从hdfs加载到本地,但是要花费数小时才能完成此任务。是否存在将hdfs中的数据获取到本地的另一种有效方法?

Ste*_*ook 5

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

  1. 您是并行复制还是串行复制。
  2. 文件是可拆分的吗(映射程序是否可以处理数据块而不是文件,如果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的多线程程序。