HDFS 学习

HDFS 简介

1 简介

HDFS(Hadoop Distributed File System) ,Hadoop分布式文件系统,用来解决海量数据的存储问题。
核心组件:
HDFS(分布式文件系统)
YARN(运算资源调度系统)
MAPREDUCE(分布式运算编程框架)

2 特点

1)优势
高容错性:HDFS多副本分布式存储,当一个副本丢失了,能够自动恢复,所以HDFS具有高容错性,默认是3副本。
大数据处理:HDFS处理数据的规模甚至可以达到PB级别,文件数量甚至百万之上
HDFS是设计成适应一次写入,多次读出的场景,且不支持文件的修改。
2)劣势
HDFS不擅长大量小文件的存储,因为NameNode的内存是有限的,但大量小文件存储,会耗用大量NameNode的内存,来存储文件的目录、块信息等。
HDFS高延时,不适合低延时的访问。
HDFS不支持并发写和文件的修改

3 HDFS架构图解

1.HADOOP 生态系统主要组成架构

在这里插入图片描述

2. HDFS架构示意图

在这里插入图片描述

1)NameNode(nn)
它是一个主管、管理者,Master节点,负责维护整个hdfs文件系统的目录树,以及每一个路径(文件)所对应的block块信息。
(1)管理HDFS的名称空间;
(2)配置副本策略;
(3)管理数据块(Block)映射信息;
(4)处理客户端读写请求。

2)DataNode
就是Slave。NameNode下达命令,DataNode执行实际的操作,负责存储client发来的数据块block;执行数据块的读写操作。Datanode是HDFS集群从节点,每一个block都可以在多个datanode上存储多个副本,副本数量也可以通过参数dfs.replication设置。
HDFS存储文件是分块存储(block),默认大小在hadoop2.x版本中是128M,老版本中是64M。这个可以通过配置参数dfs.blocksize来进行调整。HDFS块的大小设置主要取决于磁盘传输速率

3)Secondary NameNode
充当小弟的角色。
(1)辅助NameNode,分担其工作量,比如定期合并Fsimage和Edits,并推送给NameNode ;
(2)在NameNode挂掉时,可辅助恢复NameNode,不过现在有HA,所以很少使用Secondary NameNode。

4)Client
顾名思义,就是客户端。
(1)文件切分。Client将文件切分成一个一个的Block,然后进行上传到HDFS上。
(2)与NameNode交互,获得读取或写入文件的位置信息;
(3)与DataNode交互,读写数据;
(4)Client提供一些命令管理HDFS,比如NameNode格式化操作;
(5)Client提供一些命令访问HDFS,比如对HDFS增删查改操作;

5)Rack
每个DataNode是一部服务器,这些服务器放在一个机架里,构成一个Rack。一个Rack里的所有DataNode共享电源、网线和交换机,因此每次出故障时容易导致一整个Rack的DataNode都丢失数据,因此不能把一个block的所有备份都放在同一个Rack中,需要分散到不同的Rack上存储。
6)Block 数据块
HDFS中的文件是以数据块(Block)的形式存储的,默认最基本的存储单位是128MB(hadoop1.x是以64MB)的数据块,也就是说,存储在HDFS中的文件都会被切分成128MB的一块数据块进行存储,如果文件小于一个数据块的大小,那么按实际大小存储,并不占用整个数据块的空间,数据块之所以设置这么大,其目的是减少寻址的开销,数据块数量越多,寻址数据块所消耗的时间就越大,当然也不会设置过大,

原文链接详情: https://blog.csdn.net/weixin_41519463/article/details/108043646

Secondary NameNoed工作原理

SecondaryNameNode有两个作用,一是镜像备份,二是日志与镜像的定期合并。两个过程同时进行,称为checkpoint(检查点)。 从它的名字上看,它给人的感觉就像是NameNode的备份,但它实际上却不是。很多Hadoop的初学者都很疑惑,Secondary NameNode究竟是做什么的,以及它为什么会出现在HDFS中。
NameNode
NameNode主要是用来保存HDFS的元数据信息,比如命名空间信息,块信息等。当它运行的时候,这些信息是存在内存中的。但是这些信息也可以持久化到磁盘上。

在这里插入图片描述
上面的这张图片展示了NameNode怎么把元数据保存到磁盘上的。这里有两个不同的文件:

fsimage - 它是在NameNode启动时对整个文件系统的快照
edit logs - 它是在NameNode启动后,对文件系统的改动序列
只有在NameNode重启时,edit logs才会合并到fsimage文件中,从而得到一个文件系统的最新快照。但是在产品集群中NameNode是很少重启的,这也意味着当NameNode运行了很长时间后,edit logs文件会变得很大。

在这种情况下就会出现下面一些问题:

**edit logs文件会变的很大,怎么去管理这个文件是一个挑战。**
**NameNode的重启会花费很长时间,因为有很多改动要合并到fsimage文件上。**
如果NameNode挂掉了,那我们就丢失了很多改动因为此时的fsimage文件非常旧。因此为了克服这个问题,我们需要一个易于管理的机制来帮助我们减小edit logs文件的大小和得到一个最新的fsimage文件,这样也会减小在NameNode上的压力。这跟Windows的恢复点是非常像的,Windows的恢复点机制允许我们对OS进行快照,这样当系统发生问题时,我们能够回滚到最新的一次恢复点上。

现在我们明白了NameNode的功能和所面临的挑战 - 保持文件系统最新的元数据。那么,这些跟Secondary NameNode又有什么关系呢?

在这里插入图片描述

Secondary NameNode所做的不过是在文件系统中设置一个检查点来帮助NameNode更好的工作。它不是要取代掉NameNode也不是NameNode的备份, SecondaryNameNode有两个作用,一是镜像备份,二是日志与镜像的定期合并。两个过程同时进行,称为checkpoint(检查点)。 
镜像备份的作用:备份fsimage(fsimage是元数据发送检查点时写入文件); 日志与镜像的定期合并的作用:将Namenode中edits日志和fsimage合并,防止如果Namenode节点故障,namenode下次启动的时候,会把fsimage加载到内存中,应用edits log,edits log往往很大,导致操作往往很耗时。(这也是namenode容错的一套机制)

Secondarynamenode工作过程

SecondaryNameNode备份由三个参数控制fs.checkpoint.period控制周期(以秒为单位,默认3600秒),fs.checkpoint.size控制日志文件超过多少大小时合并(以字节为单位,默认64M), dfs.http.address表示http地址,这个参数在SecondaryNameNode为单独节点时需要设置。

SecondaryNameNode通知NameNode准备提交edits文件,此时主节点将新的写操作数据记录到一个新的文件edits.new中。 
SecondaryNameNode通过HTTP GET方式获取NameNode的fsimage与edits文件(在SecondaryNameNode的current同级目录下可见到 temp.check-point或者previous-checkpoint目录,这些目录中存储着从namenode拷贝来的镜像文件)。 
SecondaryNameNode开始合并获取的上述两个文件,产生一个新的fsimage文件fsimage.ckpt。 
SecondaryNameNode用HTTP POST方式发送fsimage.ckpt至NameNode。 
NameNode将fsimage.ckpt与edits.new文件分别重命名为fsimage与edits,然后更新fstime,整个checkpoint过程到此结束。 

在这里插入图片描述

从工作过程可以看出,SecondaryNameNode的重要作用是定期通过编辑日志文件合并命名空间镜像,以防止编辑日志文件过大。SecondaryNameNode一般要在另一台机器上运行,因为它需要占用大量的CPU时间与namenode相同容量的内存才可以进行合并操作。它会保存合并后的命名空间镜像的副本,并在namenode发生故障时启用。

4.hdfs 的读、写

1、读过程

在这里插入图片描述

当客户端读取文件时,首先向Name Node发起读请求,Name Node收到请求后,会将请求的数据块在Data Node中的具体位置(元数据信息)返回给客户端,客户端根据文件的数据块位置。直接找到相应的Data Node发起读请求

注意

1.遵循就近原则,因为网络延迟最小
2、写操作

在这里插入图片描述
当客户端需要写文件时,首先向Name Node发起写请求,将需要写入的文件名、文件大小等信息告诉Name Node,Name Node会将文件信息记录到本地,同时会验证客户端写入权限,若验证通过,会向客户端返回文件数据块能够存放在Data Node上的存储位置信息,然后客户端直接向Data Node的相应位置写入数据块,被写入数据块的Data Node也会将数据块备份到其他Data Node上

1.这里是根据网络拓扑计算节点的距离,按照最近距离进行分配。一般而言,再本机机架节点负载允许的范围内,会优先选择本机机架节点当作dn1,然后选择最近的机架。用改机架的两个服务端当作其余两个节点dn1,dn2
3、 Hdfs Shell命令
3.1 语法操作

1)hadoop fs 命令
2)hdfs dfs 命令

3.2 常用命令

hadoop的shell命令使用起来非常简单,和linux Shell命令十分相似。
1.启动集群

sbin/start-dfs.sh
sbin/start-yarn.sh

2.查看命令帮助

hadoop fs -help ls

3.查看系统系统目录

[v2admin@hadoop sbin]$ hadoop fs -ls /
2020-12-29 10:20:58,645 INFO  [main] Configuration.deprecation (Configuration.java:logDeprecation(1395)) - No unit for dfs.client.datanode-restart.timeout(30) assuming SECONDS
Found 7 items
drwxr-xr-x   - v2admin supergroup          0 2020-12-23 20:37 /flume
drwxr-xr-x   - v2admin supergroup          0 2020-12-28 17:23 /hbase
drwxr-xr-x   - v2admin supergroup          0 2020-12-23 14:43 /home

4.创建文件夹

[v2admin@hadoop sbin]$ hadoop fs -mkdir /student

5.多级文件夹创建

[v2admin@hadoop sbin]$ hadoop fs -mkdir /student/zhangsan/course_count

6.上传和下载文件从本地拷贝文件至hdfs

[v2admin@hadoop10 sbin]$ cd /home/v2admin/demo
[v2admin@hadoop10 demo]$touch words.txt
[v2admin@hadoop10 demo]$echo aaa > words.txt
[v2admin@hadoop10 demo]$ hadoop fs -put words.txt /student
// words 是我本地的文件  后面跟上传hdfs的目录
[// hadoop fs -copyFromLocal words.txt /student
// 等同于put
[v2admin@hadoop10 demo]$ hadoop fs -ls /student
2020-12-29 10:32:34,660 INFO  [main] Configuration.deprecation (Configuration.java:logDeprecation(1395)) - No unit for dfs.client.datanode-restart.timeout(30) assuming SECONDS
Found 2 items
-rw-r--r--   3 v2admin supergroup          4 2020-12-29 10:31 /student/words.txt

6.1 从本地剪贴到HDFS

[v2admin@hadoop demo]$ touch bbb.txt[v2admin@hadoop10 demo]$ ls
bbb.txt  f  pos.log  words.txt[v2admin@hadoop10 demo]$ hadoop fs -moveFromLocal bbb.txt /student
2020-12-29 10:40:20,634 INFO  [main] Configuration.deprecation (Configuration.java:logDeprecation(1395)) - No unit for dfs.client.datanode-restart.timeout(30) assuming SECONDS
[v2admin@hadoop demo]$ ls
f  pos.log  words.txt[v2admin@hadoop10 demo]$ hadoop fs -ls /student
2020-12-29 10:40:40,097 INFO  [main] Configuration.deprecation (Configuration.java:logDeprecation(1395)) - No unit for dfs.client.datanode-restart.timeout(30) assuming SECONDS
Found 3 items
-rw-r--r--   3 v2admin supergroup          0 2020-12-29 10:40 /student/bbb.txt
-rw-r--r--   3 v2admin supergroup        151 2020-12-21 14:45 /student/stu.txt
-rw-r--r--   3 v2admin supergroup          4 2020-12-29 10:31 /student/words.txt

6.2 追加文件到已经存在的文件末尾

[v2admin@hadoop demo]$ echo bbb > bbb.txt
[v2admin@hadoop demo]$ hadoop fs -appendToFile bbb.txt /student/words.txt

6.3 那么下载words.txt文件,看看文件发生什么变化吧

[v2admin@hadoop demo]$ mkdir download
[v2admin@hadoop demo]$ hadoop fs -get /student/words.txt ./download/
[v2admin@hadoop demo]$ cat download/words.txt 
aaa
bbb

6.4 下载文件除了get还有其他两个

// 等同于get
[v2admin@hadoop demo]$ hadoop fs -copyToLocal /student/words.txt ./download/
// 合并下载多个文件
[v2admin@hadoop demo]$ hadoop fs -getmerge /student/* ./download/

7.从HDFS一个路径拷贝到HDFS另一个路径

[v2admin@hadoop demo]$hadoop fs -mkidr /newStu
[v2admin@hadoop demo]$hadoop fs -cp /student/bbb.txt /newStu8.
//在HDFS上移动文件
[v2admin@hadoop10 demo]$hadoop fs -mv /student/words.txt /newStu

8.在HDFS上删除文件

// 常规删除
[v2admin@hadoop demo]$hadoop fs -rm /newStu/bbb.txt
// 强制删除
[v2admin@hadoop demo]$hadoop fs -rm -r /newStu

9.查看文件内容

[v2admin@hadoop demo]$hadoop fs -cat /student/bbb.txt

10.其他命令详解

cat
使用方法:hadoop fs -cat URI [URI …]
将路径指定文件的内容输出到stdout 。
示例:
hadoop fs -cat hdfs://host1:port1/file1 hdfs://host2:port2/file2
hadoop fs -cat file:///file3 /user/hadoop/file4
返回值:
成功返回0,失败返回-1。
chgrp
使用方法:hadoop fs -chgrp [-R] GROUP URI [URI …] Change group association of files. With -R , make the change recursively through the directory structure. The user must be the owner of files, or else a super-user. Additional information is in the Permissions User Guide . -->
改变文件所属的组。使用-R 将使改变在目录结构下递归进行。命令的使用者必须是 文件的所有者或者超级用户。更多的信息请参见HDFS 权限用户指南 。
chmod
使用方法:hadoop fs -chmod [-R] <MODE[,MODE]... | OCTALMODE> URI [URI …]
改变文件的权限。使用-R 将使改变在目录结构下递归进行。命令的使用者必须是文 件的所有者或者超级用户。更多的信息请参见HDFS 权限用户指南 。
chown
使用方法:hadoop fs -chown [-R] [OWNER][:[GROUP]] URI [URI ]
改变文件的拥有者。使用-R 将使改变在目录结构下递归进行。命令的使用者必须是 超级用户。更多的信息请参见HDFS 权限用户指南 。
copyFromLocal
使用方法:hadoop fs -copyFromLocal <localsrc> URI
除了限定源路径是一个本地文件外,和put 命 令相似。
copyToLocal
使用方法:hadoop fs -copyToLocal [-ignorecrc] [-crc] URI <localdst>
除了限定目标路径是一个本地文件外,和get 命 令类似。
cp
使用方法:hadoop fs -cp URI [URI …] <dest>
将文件从源路径复制到目标路径。这个命令允许有多个源路径,此时目标路径必须是一个目录。
示例:
hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2
hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2 /user/hadoop/dir
返回值:
成功返回0,失败返回-1。
du
使用方法:hadoop fs -du URI [URI …]
显示目录中所有文件的大小,或者当只指定一个文件时,显示此文件的大小。
示例:
hadoop fs -du /user/hadoop/dir1 /user/hadoop/file1 hdfs://host:port/user/hadoop/dir1
返回值:
成功返回0,失败返回-1。
dus
使用方法:hadoop fs -dus <args>
显示文件的大小。
-lsexpunge
使用方法:hadoop fs -expunge
清空回收站。请参考HDFS 设计 文档以获取更多关于回收站特性的信息。
get
使用方法:hadoop fs -get [-ignorecrc] [-crc] <src> <localdst>
复制文件到本地文件系统。可用-ignorecrc 选项复制CRC校验失败的文 件。使用-crc 选项复制文件以及CRC信息。
示例:
hadoop fs -get /user/hadoop/file localfile
hadoop fs -get hdfs://host:port/user/hadoop/file localfile
返回值:
成功返回0,失败返回-1。
getmerge
使用方法:hadoop fs -getmerge <src> <localdst> [addnl]
接受一个源目录和一个目标文件作为输入,并且将源目录中所有的文件连接成本地目标文件。addnl 是 可选的,用于指定在每个文件结尾添加一个换行符。
ls
使用方法:hadoop fs -ls <args>
如果是文件,则按照如下格式返回文件信息:
文件名 <副本数> 文件大小 修改日期 修改时间 权限 用户ID 组ID
如果是目录,则返回它直接子文件的一个列表,就像在Unix中一样。目录返回列表的信息如下:
目录名 <dir> 修改日期 修改时间 权限 用户ID 组ID
示例:
hadoop fs -ls /user/hadoop/file1 /user/hadoop/file2 hdfs://host:port/user/hadoop/dir1 /nonexistentfile
返回值:
成功返回0,失败返回-1。
lsr
使用方法:hadoop fs -lsr <args>
ls 命令的递归版本。类似于Unix中的ls -R 。
mkdir
使用方法:hadoop fs -mkdir <paths>
接受路径指定的uri作为参数,创建这些目录。其行为类似于Unix的mkdir -p,它会创建路径中的各级父目录。
示例:
hadoop fs -mkdir /user/hadoop/dir1 /user/hadoop/dir2
hadoop fs -mkdir hdfs://host1:port1/user/hadoop/dir hdfs://host2:port2/user/hadoop/dir
返回值:
成功返回0,失败返回-1。
movefromLocal
使用方法:dfs -moveFromLocal <src> <dst>
输出一个”not implemented“信息。
mv
使用方法:hadoop fs -mv URI [URI …] <dest>
将文件从源路径移动到目标路径。这个命令允许有多个源路径,此时目标路径必须是一个目录。不允许在不同的文件系统间移动文件。
示例:
hadoop fs -mv /user/hadoop/file1 /user/hadoop/file2
hadoop fs -mv hdfs://host:port/file1 hdfs://host:port/file2 hdfs://host:port/file3 hdfs://host:port/dir1
返回值:
成功返回0,失败返回-1。
put
使用方法:hadoop fs -put <localsrc> ... <dst>
从本地文件系统中复制单个或多个源路径到目标文件系统。也支持从标准输入中读取输入写入目标文件系统。
hadoop fs -put localfile /user/hadoop/hadoopfile
hadoop fs -put localfile1 localfile2 /user/hadoop/hadoopdir
hadoop fs -put localfile hdfs://host:port/hadoop/hadoopfile
hadoop fs -put - hdfs://host:port/hadoop/hadoopfile
从标准输入中读取输入。
返回值:
成功返回0,失败返回-1。
rm
使用方法:hadoop fs -rm URI [URI …]
删除指定的文件。只删除非空目录和文件。请参考rmr命令了解递归删除。
示例:
hadoop fs -rm hdfs://host:port/file /user/hadoop/emptydir
返回值:
成功返回0,失败返回-1。
rmr
使用方法:hadoop fs -rmr URI [URI …]
delete的递归版本。
示例:
hadoop fs -rmr /user/hadoop/dir
hadoop fs -rmr hdfs://host:port/user/hadoop/dir
返回值:
成功返回0,失败返回-1。
setrep
使用方法:hadoop fs -setrep [-R] <path>
改变一个文件的副本系数。-R选项用于递归改变目录下所有文件的副本系数。
示例:
hadoop fs -setrep -w 3 -R /user/hadoop/dir1
返回值:
成功返回0,失败返回-1。
stat
使用方法:hadoop fs -stat URI [URI …]
返回指定路径的统计信息。
示例:
hadoop fs -stat path
返回值:
成功返回0,失败返回-1。
tail
使用方法:hadoop fs -tail [-f] URI
将文件尾部1K字节的内容输出到stdout。支持-f选项,行为和Unix中一致。
示例:
hadoop fs -tail pathname
返回值:
成功返回0,失败返回-1。
test
使用方法:hadoop fs -test -[ezd] URI
选项:
-e 检查文件是否存在。如果存在则返回0。
-z 检查文件是否是0字节。如果是则返回0。
-d 如果路径是个目录,则返回1,否则返回0。
示例:
hadoop fs -test -e filename
text
使用方法:hadoop fs -text <src>
将源文件输出为文本格式。允许的格式是zip和TextRecordInputStream。
touchz
使用方法:hadoop fs -touchz URI [URI …]
创建一个0字节的空文件。
示例:
hadoop -touchz pathname

5、常见问题处理

1、cdh报hdfs块计数超过警告阈值

关键词:
hdfs,DN,dn,DataNode,块计数阈值

描述:
日程巡检过程中发现cdh上有hdfs的警告提示,提示内容是:存在隐患:DataNode有500166个块,警告阈值是500000块
如下图:
在这里插入图片描述
问题原因:
经排查发现,hdfs上的身份证照片和身份证照片缩略图数量过多

解决方案:
1.切换到hdfs账户:export HADOOP_USER_NAME=hdfs
2.hdfs dfs -count / 查看根目录的文件数,然后逐级查看子目录的文件数,如图中间一列是文件数:
在这里插入图片描述
3.最后定位到照片和缩略图的块很多,由于照片不能删,缩略图可以删,删掉缩略图后问题解决
4.注意:删除后目录会丢进/user/HADOOP_USER_NAME/.Trash目录下,默认自动1天清理,如果情况紧急可以直接手动删除, 如果发现文件都不能删,就需要修改DN所占内存

2、HDFS副本由3个改为2个操作
关键词
hdfs  副本  dfs.replication 
症状描述
在现有资源的情况下,为了hdfs集群存储更多的数据,选择承受集群节点异常,导致数据无法恢复的风险。

解决方案:

1.在CDH管理界面,找到HDFS的配置选项,dfs.replication设置为2,如下图

在这里插入图片描述

2.在CDH管理界面,重启HDFS服务,如下图

在这里插入图片描述

3.在hdfs节点,执行 hdfs dfs  -setrep 2 / 

在这里插入图片描述

到此,HDFS存储副本由3副本,变成了2副本。
备注
需要考虑由3副本变成2副本的风险,虽然是节省了磁盘空间,但是也要预估风险把控,并告知项目经理和客户。
3、HDFS数据损坏处理步骤
1、概述
文档写入过程中发生异常或磁盘故障导致正常副本丢失,导致的HDFS数据损坏问题可参考文档进行数据修复。包括如下情况:
【1】副本处于RBW/RWR状态而NmaeNode中文件已关闭
【2】最小副本数为2,文件最后一块只有一个副本,文件无法关闭
【3】副本的GS小于NameNode记录的GS,其他GS正常的副本丢失
【4】副本的长度和NameNode记录的长度存在差异
2、原理
 NameNode侧记录了文件包含的块。DataNode上报块到NameNode后,获得块的副本保存在哪些DataNode的信息。概述中描述的4种情况,会导致NameNode忽略块上报导致丢块或客户端读取文件时返回异常。此时客户端均无法正常读取文件。这些场景下块文件还存在DataNode的磁盘中,可以使用DataNode磁盘中的文件恢复绝大部分数据。
恢复数据的步骤:
1)获取文件块存储在哪些DataNode,通过fsck命令输出和NameNode日志信息获取
2)从对应的DataNode 执行scp命令 复制文件到客户端节点进行合并
3)对本地文件和hdfs记录的文件大小,误差在预期返回内时通过put命令上传到HDFS
4、跨集群数据迁移

迁移之前需要先考虑的事:

迁移总数据量
新老集群之间的最大带宽,在减少业务影响条件下最多可以使用多少带宽
在迁移过程中如何限制使用带宽
在迁移过程中,哪些文件可能发生删除、新增数据的情况。
迁移过程中,那些目录可能会发生新增文件的情况
迁移后的数据一致性校验
迁移后HDFS文件权限与老集群保持一致

迁移方案:

1.迁移数据量评估
通过hdfs dfs -du -h /命令查看各目录总数据量。按照业务划分,统计各业务数据的总量
2.指定迁移节奏
因为数据量大,而且带宽有限,所以在HDFS文件变化之前全部迁移是不可能的,因为HDFS中的文件会随着业务每天变化。所以应该按照业务、分目录、分批次迁移
3.迁移工具
Hadoop自带的数据迁移工具DistCp,可以通过简单命令完成数据迁移
hadoop distcp hdfs://nn1:8020/data hdfs://nn2:8020/
4.迁移时间
因为老集群仍然在使用,所以建议在老集群低负载运行的时间段进行迁移
5.新老集群带宽
询问运维新老集群之间的最大传输带宽,多少的带宽可以尽量少的影响业务
是否可以对新老集群之间的网络进行改造,例如通过接网线的方式提高网络带宽
6.数据迁移前状态评估
先尝试小数据量迁移,可以先进行100G-1T的数据迁移,以评估迁移时会遇到的问题

迁移工具distCp
概述:

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

原理

Distcp的本质是一个MapReduce任务,只有Map阶段,没有Reduce阶段,具备分布式执行的特性。在Map任务中从老集群读取数据,然后写入新集群,以此来完成数据迁移。

命令使用
集群间复制

# nn1是源集群,nn2是目标集群
hadoop distcp hdfs://nn1:8020/foo/bar hdfs://nn2:8020/bar/foo
这会将nn1 上的/foo/bar下的命名空间扩展为一个临时文件, 将其内容划分到一组map任务中,并在每个NodeManager上执行从nn1到nn2的拷贝任务。

指定多个源目录

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

或者使用 -f 选项,从文件中获取多个源:

hadoop distcp -f hdfs://nn1:8020/srclist hdfs://nn2:8020/bar/foo

其中srclist的内容:

hdfs://nn1:8020/foo/a
hdfs://nn1:8020/foo/b

指定map数

# -m 参数指定map数,即并行度
hadoop distcp -m 30 hdfs://nn1:8020/foo/bar hdfs://nn2:8020/bar/foo

指定拷贝策略

# -overwrite 覆盖目标
hadoop distcp -overwrite hdfs://nn1:8020/foo/bar hdfs://nn2:8020/bar/foo
# -update 源文件和目标文件大小、块大小和校验和不同则覆盖
hadoop distcp -update hdfs://nn1:8020/foo/bar hdfs://nn2:8020/bar/foo

指定运行参数

# -D 指定运行参数,可指定多个参数
hadoop distcp -D ipc.client.fallback-to-simple-auth-allowed=true hdfs://nn1:8020/foo/bar hdfs://nn2:8020/bar/foo

命令行选项
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值