将数据从hdfs加载到本地系统的有效方法?
Posted
技术标签:
【中文标题】将数据从hdfs加载到本地系统的有效方法?【英文标题】:Effective ways to load data from hdfs to local system? 【发布时间】:2014-09-12 21:05:31 【问题描述】:我正在尝试使用 hadoop fs -get 将数 TB 的数据从 hdfs 加载到本地,但完成此任务需要数小时。是否有另一种有效的方法可以将数据从 hdfs 获取到本地?
【问题讨论】:
【参考方案1】:复制到本地文件系统的速度取决于许多因素,包括:
-
您是并行复制还是串行复制。
文件是否可拆分(映射器能否处理数据块而不是文件,如果 HDFS 上有某些类型的压缩文件,通常会出现问题)
当然是网络带宽,因为您可能会从许多 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 mount 访问 HDFS 的多线程程序
【讨论】:
关于 DistCp 警告的很好解释,我不知道。以上是关于将数据从hdfs加载到本地系统的有效方法?的主要内容,如果未能解决你的问题,请参考以下文章