使用distcp并行拷贝大数据文件
2017-03-14 18:22
375 查看
以前我们介绍的访问HDFS的方法都是单线程的,Hadoop中有一个工具可以让我们并行的拷贝大量数据文件,这个工具就是distcp。
distcp的典型应用就是在两个HDFS集群中拷贝文件,如果两个集群使用的Hadoop版本相同,可以使用hdfs标识符:
% hadoop distcp hdfs://namenode1/foo hdfs://namenode2/bar
这条命令会把第一个集群(namenode为命令中指定的namenode1)中的/foo目录拷贝到第二个集群中的/bar目录下,于是在第二个集群中就得到了/bar/foo这样的目录结构,我们也可以指定多个拷贝源,但拷贝目的地只有一个。要注意的是,指定拷贝路径的时候要使用绝对路径。
distcp命令是以mapreduce作业的形式实现的,只不过此作业没有reduce任务。每一个文件是由一个map任务来拷贝的,distcp尽量把大小之和相同的各个文件导入到同一个map任务中。这样可以每个map任务拷贝的数据量大致相同。
Map任务的个数是按如下方式决定的:
1)考虑到创建每个map任务的开销,每个map任务至少应处理256MB大小的数据(如果总输入文件的大小小于256MB,则把这些输入数据全部交给一个map任务执行)。例如,一个1GB大小的输入数据会被分配四个map任务来拷贝。
2)如果待拷贝的数据实在很大,这时候就不能只按每个map任务256MB输入数据的标准来划分了,因为这样可能需要创建很多map任务。这是可以按每个datanode20个map任务来划分,例如如果有1000GB的输入数据和100个节点,这是就会启动100*20=2000个map任务来拷贝数据,每个map任务拷贝512MB数据。同时我们也可通过-m选项指定要使用的map数,例如-m
1000就会只启动1000个map任务,每个map任务拷贝1GB数据。
默认情况下,如果在拷贝的目的地同名文件已经存在,则会默认跳过这些文件。可以通过-overwrite选项指定覆盖掉同名文件,或者通过-update选项来更新同名文件。
关于distcp的更多用法,可以不加参数运行“hadoop distcp”命令来查看其用法。
如果两个集群的Hadoop版本不一致就不能使用hdfs标识符来拷贝文件了,因为两者的RPC系统是不兼容的。这是可以使用只读的基于HTTP的HFTP文件系统来读取源数据,如下所示(注意此命令是在第二个集群上执行的,以确保rpc版本兼容):
% hadoop distcp hftp://namenode1:50070/foo hdfs://namenode2/bar
注意在上述命令中需要制定namenode1的网络端口,它是由dfs.http.address指定的,默认为50070.
另一种可选的方法是使用webhdfs协议(替换hftp协议),这样在拷贝的源和目的地都可以使用http而不用担心版本不兼容的问题:
% hadoop distcp webhdfs://namenode1:50070/foo webhdfs://namenode2:50070/bar
我们还可以使用HDFS HTTP代理作为拷贝的源和目的地,这样可以设置防火墙以及进行带宽控制。
distcp的典型应用就是在两个HDFS集群中拷贝文件,如果两个集群使用的Hadoop版本相同,可以使用hdfs标识符:
% hadoop distcp hdfs://namenode1/foo hdfs://namenode2/bar
这条命令会把第一个集群(namenode为命令中指定的namenode1)中的/foo目录拷贝到第二个集群中的/bar目录下,于是在第二个集群中就得到了/bar/foo这样的目录结构,我们也可以指定多个拷贝源,但拷贝目的地只有一个。要注意的是,指定拷贝路径的时候要使用绝对路径。
distcp命令是以mapreduce作业的形式实现的,只不过此作业没有reduce任务。每一个文件是由一个map任务来拷贝的,distcp尽量把大小之和相同的各个文件导入到同一个map任务中。这样可以每个map任务拷贝的数据量大致相同。
Map任务的个数是按如下方式决定的:
1)考虑到创建每个map任务的开销,每个map任务至少应处理256MB大小的数据(如果总输入文件的大小小于256MB,则把这些输入数据全部交给一个map任务执行)。例如,一个1GB大小的输入数据会被分配四个map任务来拷贝。
2)如果待拷贝的数据实在很大,这时候就不能只按每个map任务256MB输入数据的标准来划分了,因为这样可能需要创建很多map任务。这是可以按每个datanode20个map任务来划分,例如如果有1000GB的输入数据和100个节点,这是就会启动100*20=2000个map任务来拷贝数据,每个map任务拷贝512MB数据。同时我们也可通过-m选项指定要使用的map数,例如-m
1000就会只启动1000个map任务,每个map任务拷贝1GB数据。
默认情况下,如果在拷贝的目的地同名文件已经存在,则会默认跳过这些文件。可以通过-overwrite选项指定覆盖掉同名文件,或者通过-update选项来更新同名文件。
关于distcp的更多用法,可以不加参数运行“hadoop distcp”命令来查看其用法。
如果两个集群的Hadoop版本不一致就不能使用hdfs标识符来拷贝文件了,因为两者的RPC系统是不兼容的。这是可以使用只读的基于HTTP的HFTP文件系统来读取源数据,如下所示(注意此命令是在第二个集群上执行的,以确保rpc版本兼容):
% hadoop distcp hftp://namenode1:50070/foo hdfs://namenode2/bar
注意在上述命令中需要制定namenode1的网络端口,它是由dfs.http.address指定的,默认为50070.
另一种可选的方法是使用webhdfs协议(替换hftp协议),这样在拷贝的源和目的地都可以使用http而不用担心版本不兼容的问题:
% hadoop distcp webhdfs://namenode1:50070/foo webhdfs://namenode2:50070/bar
我们还可以使用HDFS HTTP代理作为拷贝的源和目的地,这样可以设置防火墙以及进行带宽控制。
相关文章推荐
- 使用distcp并行拷贝大数据文件
- 【hadoop】Hadoop学习笔记(七):使用distcp并行拷贝大数据文件
- Hadoop学习笔记(七):使用distcp并行拷贝大数据文件
- distcp指令并行拷贝大数据文件
- 使用RMAN在ASM和文件系统之间拷贝数据
- 使用hadoop distcp从ftp拷贝文件到hdfs
- 使用RMAN在ASM和文件系统之间拷贝数据
- 使用distcp在hadoop集群之间拷贝文件w
- 第三章 第七节 使用distcp并行拷贝
- 将MYSQL数据文件拷贝到使用LVM扩容的磁盘中
- 使用Windows API读取文件数据的例子
- 在DELPHI中使用ADO直接访问Excel数据文件(收藏)
- 使用.NET事件模型通知文件拷贝进度
- VBScript 使用 xmldom 检测/创建/读取/更改 XML 文件数据 实例 By shawl.qiu
- 在SAS7/8中使用SAS9的数据文件
- 在DELPHI中使用ADO直接访问Excel数据文件
- 使用批处理把某一文件拷贝到另外一个盘下的所有文件夹
- 使用ODBC, 将CSV文件里的数据导入DataSet
- [转载]VC6.0中使用Stream Object读取数据中流文件并显示Bmp,JPG等
- 使用ODBC, 将CSV文件里的数据导入DataSet