一、副本放置策略
如图:
解释:
第一个副本:
假如上传节点为DN节点,优先放置本节点;
否则就随机挑选一台磁盘不太慢 CPU不太繁忙的节点;
第二个副本:
放置在于第一个副本的不同的机架的节点上
第三个副本:
放置于第二个副本相同机架的不同节点上
CDH机架有一个默认机架 虚拟的概念;
CDH一般不调整这种默认机架
二、HDFS读写流程
写流程
如图:
解释:
hadoop fs -put xxx.log /
无感知
FSDataOutputStream
1.第一步
Client调用FileSystem.create(filePath)方法,
与NN进行【rpc】通信,check是否存在及是否有权限创建;
假如不ok,就返回错误信息;
假如ok,就创建一个新文件,不关联任何的block块,返回
一个FSDataOutputStream对象;
2.第二步:
Client调用FSDataOutputStream对象的write()方法,
先将第一块的第一个副本写到第一个DN,第一个副本写完;
就传输给第二个DN,第二个副本写完;
就传输给第三个DN,第三个副本写完。
就返回一个ack packet确认包给第二个DN,第二个DN接收到
第三个的ack packet确认包加上自身ok,就返回一个ack packet确认包
给第一个DN,第一个DN接收到
第二个DN的ack packet确认包加上自身ok,就返回ack packet确认包
给FSDataOutputStream对象,标志第一个块 3个副本写完。
然后余下的块依次这样写;
第三步
当向文件写入数据完成后,
Client调用FSDataOutputStream.close()方法,关闭输出流。
再调用FileSystem.complete()方法,告诉NN该文件写入成功。
读流程
解释:
Client调用FSDataInputStream对象read()方法;
a.与第一个块最近的DN进行read,读取完成后,会check;
假如ok,就关闭与当前DN的通信;假如失败,会记录
失败块+DN信息,下次不会再读取;那么会去该块的
第二个DN地址读取。
b.然后去第二个块的最近的DN上通信读取,check后,关闭通信。
c.假如block列表读取完成后,文件还未结束,
就再次FileSystem会从NN获取该文件的下一批次的block列表。
(感觉就是连续的数据流,对于客户端操作是透明无感知的)
d.Client调用FSDataInputStream.close()方法,关闭输入流。
三、pid文件
没修改配置文件时,默认在/tmp下,但由于Linux系统存在clear机制(一个月删除),PID文件影响程序的启动和关闭
mkdir /home/pxj/tmp
chmod -R 777 /home/pxj/tmp
hadoop-env.sh
export HADOOP_PID_DIR=/home/pxj/tmp
yarn-env.sh
export YARN_PID_DIR=/home/pxj/tmp
四、常规命令
hadoop fs==> hdfs dfs
[-cat [-ignoreCrc] …]
[-chmod [-R] <MODE[,MODE]… | OCTALMODE> PATH…]
[-chown [-R] [OWNER][:[GROUP]] PATH…]
[-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [
[-put [-f] [-p] [-l] … ]
[-get [-p] [-ignoreCrc] [-crc] … ]
[-copyFromLocal [-f] [-p] [-l] … ]
[-copyToLocal [-p] [-ignoreCrc] [-crc] … ]
[-rm [-f] [-r|-R] [-skipTrash] …]
hadoop fs -cat
[pxj@pxj31 /home/pxj]$hadoop fs -cat /a/1.log
19/12/07 21:58:40 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
pxj
wfy
cdr
lzh
zcl
zmj
lx
bjs
crh
dd
yy
kk
llll
uu
pp
jjj
hadoop fs -chmod
[pxj@pxj31 /home/pxj]$hadoop fs -ls /
19/12/07 22:00:12 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 4 items
drwxr-xr-x - pxj supergroup 0 2019-12-01 14:32 /a
-rw-r--r-- 1 pxj supergroup 434354462 2019-12-02 00:37 /hadoop-2.6.0-cdh5.16.2.tar.gz
drwxr-xr-x - pxj supergroup 0 2019-12-07 22:00 /test
drwx------ - pxj supergroup 0 2019-12-01 13:06 /tmp
[pxj@pxj31 /home/pxj]$hadoop fs -chmod 777 /test
19/12/07 22:01:01 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[pxj@pxj31 /home/pxj]$hadoop fs -ls /test
19/12/07 22:01:16 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[pxj@pxj31 /home/pxj]$
[pxj@pxj31 /home/pxj]$hadoop fs -ls /
19/12/07 22:00:12 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 4 items
drwxr-xr-x - pxj supergroup 0 2019-12-01 14:32 /a
-rw-r--r-- 1 pxj supergroup 434354462 2019-12-02 00:37 /hadoop-2.6.0-cdh5.16.2.tar.gz
drwxr-xr-x - pxj supergroup 0 2019-12-07 22:00 /test
drwx------ - pxj supergroup 0 2019-12-01 13:06 /tmp
hadoop fs -chmod
[pxj@pxj31 /home/pxj]$hadoop fs -chmod 777 /test
19/12/07 22:01:01 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[pxj@pxj31 /home/pxj]$hadoop fs -ls /test
19/12/07 22:01:16 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[pxj@pxj31 /home/pxj]$
hadoop fs -ls
[pxj@pxj31 /home/pxj]$hadoop fs -ls /
19/12/07 22:00:12 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 4 items
drwxr-xr-x - pxj supergroup 0 2019-12-01 14:32 /a
-rw-r--r-- 1 pxj supergroup 434354462 2019-12-02 00:37 /hadoop-2.6.0-cdh5.16.2.tar.gz
drwxr-xr-x - pxj supergroup 0 2019-12-07 22:00 /test
drwx------ - pxj supergroup 0 2019-12-01 13:06 /tmp
hadoop fs -chown -R
[pxj@pxj31 /home/pxj]$hadoop fs -chown -R wfy:wfy /test
19/12/07 22:04:27 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[pxj@pxj31 /home/pxj]$hadoop fs -ls /
19/12/07 22:04:55 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 4 items
drwxr-xr-x - pxj supergroup 0 2019-12-01 14:32 /a
-rw-r--r-- 1 pxj supergroup 434354462 2019-12-02 00:37 /hadoop-2.6.0-cdh5.16.2.tar.gz
drwxrwxrwx - wfy wfy 0 2019-12-07 22:00 /test
drwx------ - pxj supergroup 0 2019-12-01 13:06 /tmp
hadoop fs -put
[pxj@pxj31 /home/pxj]$hadoop fs -put slaves1 /test
19/12/07 22:11:32 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[pxj@pxj31 /home/pxj]$hadoop fs -ls /test
19/12/07 22:11:49 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 1 items
-rw-r--r-- 1 pxj wfy 6 2019-12-07 22:11 /test/slaves1
hadoop fs -get
[pxj@pxj31 /home/pxj]$hadoop fs -get /test/slaves1 ./aa
19/12/07 22:13:35 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[pxj@pxj31 /home/pxj]$ll
总用量 8
-rw-r--r--. 1 pxj pxj 6 12月 7 22:13 aa
drwxrwxr-x. 3 pxj pxj 50 12月 1 00:40 app
drwxrwxr-x. 2 pxj pxj 19 12月 1 13:01 data
drwxrwxr-x. 2 pxj pxj 6 12月 1 00:05 lib
drwxrwxr-x. 2 pxj pxj 6 12月 1 00:05 log
-rw-r--r--. 1 pxj pxj 6 12月 1 01:49 slaves1
drwxrwxr-x. 2 pxj pxj 43 12月 1 00:37 software
drwxrwxr-x. 2 pxj pxj 6 12月 1 00:05 sourcecode
drwxrwxrwx. 4 pxj pxj 207 12月 7 19:50 tmp
hadoop fs -copyFromLocal
[pxj@pxj31 /home/pxj]$hadoop fs -copyFromLocal slaves1 /test/slaves27
19/12/07 22:16:39 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[pxj@pxj31 /home/pxj]$hadoop fs -ls /test
19/12/07 22:16:58 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 2 items
-rw-r--r-- 1 pxj wfy 6 2019-12-07 22:11 /test/slaves1
-rw-r--r-- 1 pxj wfy 6 2019-12-07 22:16 /test/slaves27
hadoop fs -copyToLocal
[pxj@pxj31 /home/pxj]$hadoop fs -copyToLocal /test/slaves27 ./test_copy
19/12/07 22:18:51 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[pxj@pxj31 /home/pxj]$ll
总用量 12
-rw-r--r--. 1 pxj pxj 6 12月 7 22:13 aa
drwxrwxr-x. 3 pxj pxj 50 12月 1 00:40 app
drwxrwxr-x. 2 pxj pxj 19 12月 1 13:01 data
drwxrwxr-x. 2 pxj pxj 6 12月 1 00:05 lib
drwxrwxr-x. 2 pxj pxj 6 12月 1 00:05 log
-rw-r--r--. 1 pxj pxj 6 12月 1 01:49 slaves1
drwxrwxr-x. 2 pxj pxj 43 12月 1 00:37 software
drwxrwxr-x. 2 pxj pxj 6 12月 1 00:05 sourcecode
-rw-r--r--. 1 pxj pxj 6 12月 7 22:18 test_copy
drwxrwxrwx. 4 pxj pxj 207 12月 7 19:50 tmp
开启回收站
[pxj@pxj31 /home/pxj/app/hadoop/etc/hadoop]$vim core-site.xml
<property>
<name>hadoop.tmp.dir</name>
<value>70000</value>
</property>
切记检查生产环境是否开启回收站,CDH默认是开启的
开了回收站,慎用 -skipTrash
hdfs dfs -put -skipTrash /rz.log
hadoop fs -rm
[pxj@pxj31 /home/pxj/app/hadoop/etc/hadoop]$hadoop fs -rm /test/slaves1
19/12/07 22:51:34 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
19/12/07 22:51:36 INFO fs.TrashPolicyDefault: Moved: 'hdfs://pxj31:9000/test/slaves1' to trash at: hdfs://pxj31:9000/user/pxj/.Trash/Current/test/slaves1
[pxj@pxj31 /home/pxj/app/hadoop/etc/hadoop]$hadoop fs -ls /user/pxj/.Trash/Current/test/
19/12/07 22:52:24 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 1 items
-rw-r--r-- 1 pxj wfy 6 2019-12-07 22:11 /user/pxj/.Trash/Current/test/slaves1
跳过垃圾回收站
[pxj@pxj31 /home/pxj/app/hadoop/etc/hadoop]$hadoop fs -rm -skipTrash /test/slaves27
19/12/07 22:53:52 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Deleted /test/slaves27
五、安全模式
如果NN log显示 进入 safe mode,
正常手动让其离开安全模式。很少做
进入安全模式
[pxj@pxj31 /home/pxj/app/hadoop/etc/hadoop]$hdfs dfsadmin -safemode enter
19/12/07 22:57:43 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Safe mode is ON
[pxj@pxj31 /home/pxj/app/hadoop/etc/hadoop]$hadoop fs -put core-site.xml /
19/12/07 22:59:28 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
put: Cannot create file/core-site.xml._COPYING_. Name node is in safe mode.
[pxj@pxj31 /home/pxj/app/hadoop/etc/hadoop]$hadoop fs -cat /a/1.log
19/12/07 23:00:25 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
pxj
wfy
cdr
lzh
zcl
zmj
lx
bjs
crh
dd
yy
kk
llll
uu
pp
jjj
结论:安全模式:只对写有影响
离开安全模式
[pxj@pxj31 /home/pxj/app/hadoop/etc/hadoop]$hdfs dfsadmin -safemode leave
19/12/07 23:01:31 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Safe mode is OFF
集群健康
hdfs fsck
[pxj@pxj31 /home/pxj]$hdfs fsck /
19/12/08 00:44:26 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Connecting to namenode via http://pxj31:50070/fsck?ugi=pxj&path=%2F
FSCK started by pxj (auth:SIMPLE) from /192.168.25.31 for path / at Sun Dec 08 00:44:30 CST 2019
...........Status: HEALTHY
Total size: 434731430 B
Total dirs: 17
Total files: 11
Total symlinks: 0
Total blocks (validated): 13 (avg. block size 33440879 B)
Minimally replicated blocks: 13 (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 Sun Dec 08 00:44:30 CST 2019 in 23 milliseconds
重点关注:
Under-replicated blocks: 0 (0.0 %)
Mis-replicated blocks: 0 (0.0 %)
各DN节点的数据均衡
剖析[pxj@pxj31 /home/pxj/app/hadoop/sbin]
.
/
s
t
a
r
t
−
b
a
l
a
n
c
e
r
.
s
h
脚
本
真
正
执
行
的
关
键
在
:
"
./start-balancer.sh 脚本 真正执行的关键在:"
./start−balancer.sh脚本真正执行的关键在:"HADOOP_PREFIX"/sbin/hadoop-daemon.sh --config
H
A
D
O
O
P
C
O
N
F
D
I
R
−
−
s
c
r
i
p
t
"
HADOOP_CONF_DIR --script "
HADOOPCONFDIR−−script"bin"/hdfs start balancer $@
阀值:threshold = 10.0
举例:90+60+80=230/3=76%
所有节点的磁盘used与集群的平均used之差要小于这个阈值
90-76=14
60-76=16
80-76=4
设置阀值:
dfs.datanode.balance.bandwidthPerSec 30m(带宽生产)
执行:执行完会自动结束
[pxj@pxj31 /home/pxj/app/hadoop/sbin]$./start-balancer.sh
[pxj@pxj31 /home/pxj/app/hadoop/sbin]$./start-balancer.sh -threshold 5
starting balancer, logging to /home/pxj/app/hadoop-2.6.0-cdh5.16.2/logs/hadoop-pxj-balancer-pxj31.out
Time Stamp Iteration# Bytes Already Moved Bytes Left To Move Bytes Being Moved
[pxj@pxj31 /home/pxj/app/hadoop/sbin]$stop-balancer.sh
no balancer to stop
在生产上建议操作(需要根据实际情况):
crontab job 每天凌晨20分调度
每天调度,数据平衡 毛刺修正
一个DN节点的多个磁盘的数据均衡
参考网站:
https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSDiskbalancer.html
df -h
/data01 90%
/data02 60%
/data03 80%
/data04 0%
dfs.disk.balancer.enabled must be set to true in hdfs-site.xml.
hdfs diskbalancer -plan pxj31001 生成pxj31.plan.json
hdfs diskbalancer -execute pxj31.plan.json 执行
hdfs diskbalancer -query pxj31001 查询状态
什么时候手动或调度执行?
a.新盘加入
b.监控服务器的磁盘剩余空间 小于阈值 10%,发邮件预警 手动执行
dfs.datanode.data.dir /data01,/data02,/data03,/data04 comma-delimited
为什么 DN的生产上挂载多个物理的磁盘目录
/data01 disk1
/data02 disk2
/data03 disk3
为了高效率写 高效率读
提前规划好2-3年存储量 ,避免后期加磁盘维护的工作量