[Hadoop]数据复制distcp vs cp

Hadoop DistCp:高效的大文件复制工具
本文对比了Hadoopcp和DistCp在复制大文件时的性能,显示DistCp利用MapReduce仅用1分钟就完成了11.9GB文件的复制,而hadoopcp则耗时14分钟。DistCp是用于大规模集群内部和集群间拷贝的工具,通过Map/Reduce实现并行复制,提高效率。文章还介绍了DistCp的使用方法,包括集群间和集群内的文件拷贝,并提到了-update参数在不复制目录本身时的用途。

1.需求

我们项目中需要复制一个大文件,最开始使用的是hadoop cp命令,但是随着文件越来越大,拷贝的时间也水涨船高。下面进行hadoop cp与hadoop distcp拷贝时间上的一个对比。我们将11.9G的文件从data_group/adv/day=20210526下所有文件复制到tmp/data_group/adv/day=20210526/文件下

1.1 查看文件大小

hadoop fs -du -s -h data_group/adv/day=20210526
11.9 G  data_group/adv/day=20210526

1.2 复制

hadoop distcp data_group/adv/day=20210526 \
tmp/data_group/adv/day=20210526 
 
hadoop fs -cp data_group/adv/day=20210526 \
tmp/data_group/adv/day=20210526

1.3 对比

使用distcp命令 仅耗时1分钟;而hadoop cp命令耗时14分钟

2. 概述

DistCp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具。 它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告生成。 它把文件和目录的列表作为map任务的输入,每个任务会完成源列表中部分文件的拷贝。 由于使用了Map/Reduce方法,这个工具在语义和执行上都会有特殊的地方。

2.1 distcp命令 输出

17/01/19 14:30:07 INFO tools.DistCp: Input Options: DistCpOptions{atomicCommit=false, syncFolder=false, deleteMissing=false, ignoreFailures=false, maxMaps=20, sslConfigurationFile='null', copyStrategy='uniformsize', sourceFileListing=null, sourcePaths=[data_group/adv/day=20210526], targetPath=tmp/data_group/adv/day=20210526}
...
17/01/19 14:30:17 INFO mapreduce.Job:  map 0% reduce 0%
17/01/19 14:30:29 INFO mapreduce.Job:  map 6% reduce 0%
17/01/19 14:30:34 INFO mapreduce.Job:  map 41% reduce 0%
17/01/19 14:30:35 INFO mapreduce.Job:  map 94% reduce 0%
17/01/19 14:30:36 INFO mapreduce.Job:  map 100% reduce 0%
17/01/19 14:31:34 INFO mapreduce.Job: Job job_1472052053889_8081193 completed successfully
17/01/19 14:31:34 INFO mapreduce.Job: Counters: 30
        File System Counters
                FILE: Number of bytes read=0
                FILE: Number of bytes written=1501420
                FILE: Number of read operations=0
                FILE: Number of large read operations=0
                FILE: Number of write operations=0
                HDFS: Number of bytes read=12753350866
                HDFS: Number of bytes written=12753339159
                HDFS: Number of read operations=321
                HDFS: Number of large read operations=0
                HDFS: Number of write operations=69
        Job Counters 
                Launched map tasks=17
                Other local map tasks=17
                Total time spent by all maps in occupied slots (ms)=485825
                Total time spent by all reduces in occupied slots (ms)=0
        Map-Reduce Framework
                Map input records=17
                Map output records=0
                Input split bytes=2414
                Spilled Records=0
                Failed Shuffles=0
                Merged Map outputs=0
                GC time elapsed (ms)=1634
                CPU time spent (ms)=156620
                Physical memory (bytes) snapshot=5716221952
                Virtual memory (bytes) snapshot=32341671936
                Total committed heap usage (bytes)=12159811584
        File Input Format Counters 
                Bytes Read=9293
        File Output Format Counters 
                Bytes Written=0
        org.apache.hadoop.tools.mapred.CopyMapper$Counter
                BYTESCOPIED=12753339159
                BYTESEXPECTED=12753339159
                COPY=17

是不是很熟悉,这就是我们经常看见到的MapReduce任务的输出信息,这从侧面说明了Distcp使用Map/Reduce实现。

3. 使用方法

3.1 集群间拷贝

DistCp最常用在集群之间的拷贝:

hadoop distcp hdfs://nn1:8020/foo/bar hdfs://nn2:8020/bar/foo

这条命令会把nn1集群的/foo/bar目录下的所有文件以及bar本身目录(默认情况下)存储到一个临时文件中,这些文件内容的拷贝工作被分配给多个map任务, 然后每个TaskTracker分别执行从nn1到nn2的拷贝操作。注意DistCp使用绝对路径进行操作。

3.2 集群内部拷贝

DistCp也可以集群内部之间的拷贝:

hadoop distcp tmp/data_group/test/a tmp/data_group/test/target

这条命令会把本集群tmp/data_group/test/a目录本身以及a目录下的所有文件拷贝到target目录下,原理同集群之间的拷贝一样。

备注

hadoop distcp tmp/data_group/test/a 
    tmp/data_group/test/target

上述命令默认情况下是复制a目录以及a目录下所有文件到target目录下:

hadoop fs -ls -R tmp/data_group/test/target/
 
tmp/data_group/test/target/aa
tmp/data_group/test/target/aa/aa.txt
tmp/data_group/test/target/aa/ab.txt

而有时我们的需求是复制a目录下的所有文件而不包含a目录,这时可以后面介绍的-update参数:

hadoop distcp -update tmp/data_group/test/aa tmp/data_group/test/target
...
hadoop fs -ls -R tmp/data_group/test/target/
 
tmp/data_group/test/target/aa/aa.txt
tmp/data_group/test/target/aa/ab.txt
<think>好的,我需要回答用户关于HadoopcpcopyFromLocal命令的区别的问题。首先,我要确保自己正确理解这两个命令的功能用法。 根据用户提供的引用内容,特别是引用[3]引用[4],cp命令在Hadoop中用于在HDFS内部或不同HDFS集群之间复制文件,而copyFromLocal则是将本地文件系统的文件上传到HDFS。我需要详细区分它们的用途、路径格式、是否覆盖已有文件、保留属性以及适用场景。 接下来,我需要检查每个引用中的相关信息。引用[3]提到Distcpcp的比较,其中cp的覆盖选项使用-f参数,而copyFromLocal的覆盖可能需要不同的参数。引用[4]描述了HDFS的组成架构,包括客户端如何操作HDFS,这可能涉及copyFromLocal的使用场景,比如客户端上传数据到HDFS。 然后,我需要组织这些信息,确保回答结构清晰。首先解释每个命令的定义,然后从路径格式、覆盖行为、保留属性适用场景等方面进行对比。可能还需要举例说明,比如使用hadoop fs -cphadoop fs -copyFromLocal的具体命令格式。 同时,要注意用户提到的需要生成相关问题,我需要准备几个相关问题,比如何时使用cp而不是copyFromLocal,或者两者的性能差异等。这些问题应该基于前面的解释,帮助用户进一步理解。 最后,确保回答符合格式要求,使用中文,正确应用LaTeX语法,行内公式用$...$,独立公式用$$...$$。同时,引用部分要正确标注,比如引用[3]引用[4]中的内容,确保信息的准确性。</think>在Hadoop HDFS中,`cp``copyFromLocal`命令的核心区别在于操作对象场景。以下从功能、语法、行为特性等方面详细说明: --- ### 1. **命令定义与功能** - **`hadoop fs -cp`** 用于HDFS内部或跨HDFS集群的文件/目录复制,支持以下操作: - HDFS路径 → HDFS路径(同集群或跨集群) - 跨Hadoop集群的路径(如`hdfs://cluster1/path` → `hdfs://cluster2/path`) - 保留文件属性(如权限、时间戳,需配合`-p`参数)[^3] - **`hadoop fs -copyFromLocal`** 用于将**本地文件系统(Local FS)**的文件/目录上传到**HDFS**,仅支持本地路径 → HDFS路径的操作。 --- ### 2. **路径格式差异** - **`cp`命令路径** 源路径目标路径均为HDFS格式(如`/user/data/file`或`hdfs://namenode:port/path`)[^3]。 ```bash hadoop fs -cp /hdfs/source /hdfs/target ``` - **`copyFromLocal`路径** 源路径是本地路径(如`file:///home/user/file`或直接写路径),目标路径为HDFS格式[^4]。 ```bash hadoop fs -copyFromLocal /local/file /hdfs/target ``` --- ### 3. **覆盖行为** - **`cp`的覆盖** 需显式添加`-f`参数强制覆盖目标路径(若存在同名文件)[^3]: ```bash hadoop fs -cp -f /source /target ``` - **`copyFromLocal`的覆盖** 默认不允许覆盖,需添加`-f`参数: ```bash hadoop fs -copyFromLocal -f /local/file /hdfs/target ``` --- ### 4. **属性保留** - **`cp`的属性保留** 通过`-p`参数可保留文件属性(权限、用户、组、时间戳)[^3]: ```bash hadoop fs -cp -p /source /target ``` - **`copyFromLocal`的属性保留** 上传时默认继承HDFS的权限配置(由`hdfs-site.xml`的`dfs.permissions`参数控制),无法直接保留本地文件属性。 --- ### 5. **适用场景对比** | **场景** | `cp`命令 | `copyFromLocal`命令 | |------------------------|-----------------------------------|-----------------------------------| | 数据源位置 | HDFS内部或跨集群 | 本地文件系统 | | 跨集群迁移 | 支持(如`hdfs://cluster1`→`hdfs://cluster2`) | 不支持 | | 大数据量传输优化 | 可通过`distcp`工具并行化(引用[3]) | 单线程上传,适合小文件 | | 客户端操作 | 需HDFS读写权限 | 需本地文件读取权限+HDFS写权限[^4] | --- ### 示例代码 - **使用`cp`跨集群复制**: ```bash hadoop fs -cp hdfs://cluster1:8020/data/logs hdfs://cluster2:8020/backup/ ``` - **使用`copyFromLocal`上传本地文件**: ```bash hadoop fs -copyFromLocal /home/user/data.csv /user/analysis/input/ ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值