Hadoop--HDFS详解(三)

                              Hadoop--HDFS详解(三)

 

一.副本放置策略

HDFS的副本放置个数是由dfs.replizhuangtacation 这个参数配置的,dfs.replication默认值是3,在生产环境下默认三个就可以了。

三个副本的存放位置:

       1.如果上传文件的节点存在dn,第一份副本则存放在本节点上面,如果上传文件的节点不存在dn,则第一份副本选择一个磁盘和cpu状态良好的机器上传

       2.第二份副本存放在和第一份副本不同机架的节点上面

       3.第三份副本存放在和第二份副本同一机架的不同节点上面

 

二.HDFS读写文件流程(client 和 nn dn之间通信使用的是rpc协议)

1.HDFS写文件流程

Hadoop--HDFS详解(三)

流程:

       1.首先HDFS客户端会发起写文件请求到分布式文件系统,然后分布式文件系统会向nn发起写文件的请求,nn检查需要写入的文件是否存在、发起写文件请求的用户是否有权限,如果nn检查不合格,则返回报错信息,否则会返回一个FSDataOutputStream对象,并创建一个文件,不关联任何block

       2.HDFS client调用FSDataOutputStream对象的write方法,FSDataOutputStream会先把文件节流,分成几个文件,这个取决于设置的block的大小

       3.首先先写入先写入第一份文件,把第一份文件传输给第一个dn写入,第一份副本写完,再传输给第二个dn,第二份副本写完,再传输给第三个dn,等第三份副本写完,第三份副本会检核自己写入是否OK,如果OK会给第二份副本返回一个ack  packet确认包,第二个dn收到第三个dn的ack  packet确认包并检核第二份副本写入是否OK,如果OK,则给第一个dn返回一个ack  packet确认包,第一个dn收到第二个dn的ack  packet确认包并检核自己写入是否OK,如果OK,则给FSDataOutputStream对象返回一个ack  packet确认包,标志第一份文件的三个副本已经写完了,剩下的还是这样写入

        4.当文件全部写入成功,HDFS client则会调用close方法,关闭流

        5.并调用FSDataOutputStream的complete方法告诉nn已经写入完成,并把副本信息维护在nn上面

 

2.HDFS文件读流程:

Hadoop--HDFS详解(三)

流程:

       1.HDFS client 会先向分布式文件系统发起Open请求,然后分布式文件系统会向nn发起读取此文件请求,nn会检查文件是否存在、此用户是否有权限读取这个文件,如果nn检查不合格,则返回报错信息,否则返回FSDataInputSteam对象和此文件的block信息

       2.HDFS会向FSDataInputSteam发起read请求,首先读取文件的第一块数据,会先向最近的一个副本读取数据,如果数据损坏,则记录block的损坏信息,下次不会再读取整个block,然后会向第一块的第二个副本读取数据,读取完第一块数据,则会读取后面块的数据

      3.读取完所有数据,client则会调用FSDataInputSteam对象的close方法,关闭流

 

3.rpc通信:

RPC(Remote Procedure Call Protocol)远程过程调用协议。
通俗的描述是:客户端在不知道调用细节的情况下,调用存在于远程计算上的某个过程或函数,就像调用本地应用程序中的一样。

RPC博客:https://www.cnblogs.com/alexzhang92/p/10526347.html

 

三.HDFS常用命令

hadoop fs 等价于hdfs dfs

hadoop fs -cat [-ignoreCrc] <src> ...] :查看HDFS里面文件内容

hadoop fs -chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...:修改HDFS文件用户用户组

hadoop fs -chown [-R] [OWNER][:[GROUP]] PATH... :修改HDFS文读、写、执行权限

hadoop fs -put [-f] [-p] [-l] <localsrc> ... <dst> 等价于hadoop fs -copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst>:

上传文件到HDFS

 hadoop fs -get [-p] [-ignoreCrc] [-crc] <src> ... <localdst> 等价于 hadoop fs -copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>:从HDFS下载文件

 hadoop fs -cp [-f] [-p | -p[topax]] <src> ... <dst>:在HDFS里面复制文件

 hadoop fs -ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [<path> ...] :在HDFS里面查询文件

 hadoop fs -find <path> ... <expression> ...:在HDFS里面搜索文件

hadoop fs -mkdir [-p] <path> ...:在HDFS里面创建文件夹

 hadoop fs -rm [-f] [-r|-R] [-skipTrash] <src> ...:在HDFS里面移动文件

hadoop fs -rm [-f] [-r|-R] [-skipTrash] <src> ... :在HDFS里面删除文件,其中skipTrash参数是跳过回收站的意思,开启回收站的参数是fs.trash.interval,默认是0,0默认是关闭,生产默认是回收站默认保存七天

 

四.HDFS安全模式

1.先手动进入安全模式


[[email protected] ~]$ hdfs dfsadmin -safemode enter
19/12/06 21:05:02 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Safe mode is ON

2.测试安全模式下,是否可以读写

[[email protected] data]$ hadoop fs -get /data/xk.log
19/12/06 21:07:41 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[[email protected] data]$ ll
总用量 4
-rw-r--r--. 1 hadoop hadoop 3 12月  6 21:07 xk.log

可以读取数据

[[email protected] data]$ hadoop fs -rm /data/xk.log
19/12/06 21:08:20 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
rm: Cannot delete /data/xk.log. Name node is in safe mode.

无法删除数据

[[email protected] data]$ echo "111" > demo.log
[[email protected] data]$ ll
总用量 8
-rw-rw-r--. 1 hadoop hadoop 4 12月  6 21:09 demo.log
-rw-r--r--. 1 hadoop hadoop 3 12月  6 21:07 xk.log
[[email protected] data]$ hadoop fs -put /data
19/12/06 21:09:12 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
put: `.': No such file or directory

无法写入数据

3.手动关闭安全模式

[[email protected] data]$ hdfs dfsadmin -safemode leave
19/12/06 21:10:14 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Safe mode is OFF

 

五.HDFS多节点和单节点的磁盘平衡

1.HDFS多节点磁盘平衡

检查HDFS各个节点状态

[[email protected] data]$ hdfs fsck /
19/12/06 21:12:41 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Connecting to namenode via http://xkhadoop:50070/fsck?ugi=hadoop&path=%2F
FSCK started by hadoop (auth:SIMPLE) from /192.168.182.128 for path / at Fri Dec 06 21:12:43 CST 2019
.......Status: HEALTHY
 Total size:    175051 B
 Total dirs:    13
 Total files:   7
 Total symlinks:                0
 Total blocks (validated):      6 (avg. block size 29175 B)
 Minimally replicated blocks:   6 (100.0 %)
 Over-replicated blocks:        0 (0.0 %)
 Under-replicated blocks:       0 (0.0 %)
 Mis-replicated blocks:         0 (0.0 %)
 Default replication factor:    1
 Average block replication:     1.0
 Corrupt blocks:                0
 Missing replicas:              0 (0.0 %)
 Number of data-nodes:          1
 Number of racks:               1
FSCK ended at Fri Dec 06 21:12:43 CST 2019 in 4 milliseconds


The filesystem under path '/' is HEALTHY

重点查看

       1.Corrupt blocks:损坏的块数量

       2.Missing replicas:损坏的副本数量

保持各个节点dn磁盘平衡

[[email protected] sbin]$ ./start-balancer.sh 

-threshold 这个参数代表是各个dn磁盘的最大差距

运行时间:可以每天晚上业务低谷时候调度,跑这个job

2.HDFS-dn单节点各个磁盘的数据平衡:

hdfs diskbalancer -plan xkhadoop                   生成xkhadoop.plan.json
hdfs diskbalancer -execute xkhadoop.plan.json      执行
hdfs diskbalancer -query xkhadoop                  查询状态

在dfs.datanode.data.dir这个参数下面配置哪些磁盘需要做平衡

默认是:file://${hadoop.tmp.dir}/dfs/data

/data01,/data02,/data03,/data04 ,参数以逗号隔开

在新加入磁盘或者磁盘剩余小于设定的阈值的时候,发送报警邮件,做下各个磁盘的数据平衡