一、基准测试
一般在搭建完集群之后,运维人员需要对集群进行压力测试,对于HDFS来讲,主要是读写测试
#写入测试
hadoop jar /export/server/hadoop-3.3.0/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.3.0-tests.jar TestDFSIO -write -nrFiles 10 -fileSize 10MB
读取测试
hadoop jar /export/server/hadoop-3.3.0/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.3.0-tests.jar TestDFSIO -read -nrFiles 10 -fileSize 10MB
二、查看历史服务
开启历史服务器组件,所有跑过的MapReduce任务都可以在19888端口查看,同时可以通过后台的日志先查看任务详细的执行流程,以便排查错误
三、文件系统
文件系统的分类
1.本地磁盘文件系统:
类Windows文件系统:盘符体系(D盘,E盘)NTFS
类Unix文件系统: /目录
2.光盘文件系统:ISO镜像文件
3.网络文件系统:NFS(使用网络来远程访问其他主机的文件,就像访问本机文件一样方便)
4.分布式文件系统:分布式文件系统是由多态主机模拟出来的一个文件系统,文件是分散存储在不同的主机上
四、HDFS如何解决海量数据问题
文件查询问题
NameNode: 存储HDFS的文件的元数据,NodeName工作时,这些元数据会被加载到内存中,同时也会被持久化存储到硬盘上,描述文件除内容之外的额数据(文件的权限,大小,存储路径,Block信息)
DataNode: 具体存储文件数据的,这些数据最后分散在不同主机的硬盘上
HDFS的简介
1、HDFS(Hadoop Distributed File System) 是Hadoop分布式文件系统
2、HDFS主要是存储TB和PB,EB级别文件
3、HDFS上存储的文件只能追加写入(在尾部加入内容),不能随机修改(在中间修改),HDFS除了最后一个Block之外,前边的所有的Block一旦定型,永远不能修改
4、HDFS的读写速度有延迟,不能保证实时,如果你对时效性要求比较高,则不要使用HDFS
5、HDFS适合存储大文件,不适合存储小文件:
5.1)一个文件,不管大小,都会占用一条元数据,一条元数据大概是150字节
5.2)在工作时,元数据是保存在NameNode主机的内存中,内存如果有限的情况下,保存的元数据数量也是有限的,NameNode主机内存固定的情况下,能存多少条元数据是固定的
5.3)如果你存储太多的小文件,这些小文件会占用大量的元数据,会占用namenode大量的内存空间,会导致 NameNode内存空间不够用的问题。
6、由于HDFS强调的是集群整体的性能,单机的性能可以很弱,机器可以很廉价(蚂蚁多了,力量也很强大)
HDFS的切片问题
1、默认情况下,HDFS是以Block为单位进行存储,每一个Block最大是128M,如果一个文件不足128M,则默认也是一个Block,所以Block是一个逻辑单位
2、举例:1.txt 300M
Block1 128M
Block2 128M
Block3 44M
3、我们可以去修改每个Block的大小:dfs.blocksize 134217728 字节 在hdfs-site.xml中做如下配置:
<property>
<name>dfs.blocksize</name>
<value>268435456</value>
</property>
在node1修改完之后,要将这个配置文件分发给node2和node3,然后重启hadoop
HDFS如何解决数据丢失问题-副本机制
1、每一个Block切片都会存储多个副本(默认是3个)
2、副本机制就是通过牺牲空间来换取数据的安全可靠性
3、我们可以通过dfs.replication参数来修改副本数量,在hdfs-site.xml中做如下配置:
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
在node1修改完之后,要将这个配置文件分发给node2和node3,然后重启hadoop
#在Linux如何造一个任意大小的测试文件
dd if=/dev/zero of=my_file bs=1M count=300 #300M文件
dd if=/dev/zero of=my_file bs=1G count=1 #1G文件
HDFS文件如何让用户访问-名称空间
1、为了让客户不去关心HDFS文件复杂的元数据管理,我们只需要给用户暴露一个唯一的目录树结构的访问路径鸡即可,这个被称为名称空间。
访问的主机本身就在集群内部:/benchmarks/TestDFSIO/io_data/test_io_0
访问的主机本身就在集群外部:hdfs://node1:8020/benchmarks/TestDFSIO/io_data/test_io_0
2、HDFS的路径和Linux主机的本地路径没有关系
HDFS的元数据
1、元数据是描述文件特征的数据,不是文件内容
2、元数据包含的信息:
2.1)文件自身属性信息
文件名称、权限,修改时间,文件大小,副本数,Block大小。
-rw-r--r-- root supergroup 6 B Jan 12 21:34 3 128 MB a.txt
2.2) 文件块位置映射信息
记录文件块和DataNode之间的映射信息,即哪个块位于哪个节点上。
a.txt 300M
------------------------------
{
blk1:node2,node1,node3
blk2:node3,node1,node2
blk3:node1,node2,node3
}
HDFS的架构
NameNode:
1、存储HDFS的文件的元数据,NodeName工作时,这些元数据会被加载到内存中,同时也会被持久化存储到硬盘
2、NameNode接受客户端读写请求,因为NameNode知道每一个文件都存在哪个DataNode上
3、NameNode接受各个DataNode的心跳信息、Block汇报信息、资源使用情况(硬盘)
4、如果NameNode一旦挂掉,整个集群将不能工作
DataNode:
1、存具体的文件数据
2、定时向NameNode汇报心跳信息、Block汇报信息、资源使用情况
3、如果某个DataNode挂掉,只要丢失Block的信息其他主机有,则不影响集群运行
HDFS的Shell命令
hadoop fs 参数 #该方式可以操作任何文件系统:磁盘文件系统、HDFS文件系统
hdfs dfs 参数 #该方式只能操作HDFS文件系统
#1、查看指定路径的当前目录结构
hadoop fs -ls /
hdfs dfs -ls /
#2、递归查看指定路径的目录结构
hadoop fs -lsr / #已淘汰
hadoop fs -ls -R / #用这个
#3、查看目录下文件的大小
hadoop fs -du -h /
#4、文件移动(HDFS之间)
hadoop fs -mv /a.txt /dir1
#5、文件复制(HDFS之间)
hadoop fs -cp /dir1/a.txt /dir1/b.txt
#6、删除操作 !!!!!!!!!!!!!!!!!!
hadoop fs -rm /dir1/b.txt #删文件
hadoop fs -rm -r /dir1 #删目录
#7、文件上传(本地文件系统到HDFS文件系统) --- 复制操作 !!!!!!!!!!!!
hadoop fs -put a.txt /dir1
#8、文件上传(本地文件系统到HDFS文件系统) --- 剪切操作
hadoop fs -moveFromLocal test1.txt /
#8、文件下载(HDFS文件系统到本地文件系统) !!!!!!!!!!!
hadoop fs -get /aaa.txt /root
#9、文件下载(HDFS文件系统到本地文件系统)
hadoop fs -getmerge /dir/*.txt /root/123.txt
#10、将小文件进行合并,然后上传到HDFS
hadoop fs -appendToFile *.txt /hello.txt
hadoop fs -appendToFile 1.txt 2.txt 3.txt /hello.txt
hadoop fs -appendToFile /root/* /hello.txt
#11、查看HDFS文件内容
hadoop fs -cat /dir1/1.txt
#12、在HDFS创建文件夹 !!!!!!!!!!!!
hadoop fs -mkdir /my_dir
#13、修改HDFS文件的权限
hadoop fs -chmod -R 777 /dir1
#14、修改HDFS的所属用户和用户组
useradd hadoop
passwd hadoop
hadoop fs -chown -R hadoop:hadoop /dir
回收站配置
#在每个节点的core-site.xml上配置为1天,1天之后,回收站的资源自动
<property>
<name>fs.trash.interval</name>
<value>1440</value>
<description>minutes between trash checkpoints</description>
</property>
#需要重启Hadoop
五、HDFS的安全模式
1、在HDFS启动时,HDFS会自动的进入安全模式,在该模式下进行Block数量的检测和自我修复,当BLock数量完整率达到99.9%时,会自动的离开安全模式
2、安全模式停留多长时间不固定,你的Block数量越多,检测的时间越长,安全模式停留时间越长
3、在安全模式状态下,文件系统只接受读数据请求,而不接受删除、修改等变更请求。
hdfs dfsadmin -safemode get #查看安全模式状态
hdfs dfsadmin -safemode enter #进入安全模式
hdfs dfsadmin -safemode leave #离开安全模式
hdfs dfsadmin -safemode forceExit #强制离开安全模式
六、HDFS的元数据管理
当触发checkpoint操作条件(每隔一个小时,或者edits文件达到64M)时,SNN发生请求给NN滚动edits log。然后NN会生成一个新的编辑日志文件:edits new,便于记录后续操作记录。
同时SNN会将edits文件和fsimage复制到本地(使用HTTP GET方式)。
SNN首先将fsimage载入到内存,然后一条一条地执行edits文件中的操作,使得内存中的fsimage不断更新,这个过程就是edits和fsimage文件合并。合并结束,SNN将内存中的数据dump生成一个新的fsimage文件。
SNN将新生成的Fsimage new文件复制到NN节点。
至此刚好是一个轮回,等待下一次checkpoint触发SecondaryNameNode进行工作,一直这样循环操作。
#查看日志文件内容
hdfs oev -i edits_0000000000000000011-0000000000000000025 -o edits.xml
七、HDFS的远程拷贝命令
集群内部拷贝
#推数据
scp -r /root/test/ root@192.168.88.161:/root
#拉数据
scp root@192.168.88.162:/root/test.txt /root/test.txt
集群之间拷贝
hadoop distcp hdfs://node1:8020/a.txt hdfs://hadoop1:8020/
八、HDFS的归档机制
如果HDFS上有很多的小文件,会占用大量的NameNode元数据的内存空间,需要将这些小文件进行归档(打包),归档之后,相当于将多个文件合成一个文件,而且归档之后,还可以透明的访问其中的每一个文件
操作:
#数据准备
hadoop fs -mkdir /config
hadoop fs -put /export/server/hadoop-3.3.0/etc/hadoop/*.xml /config
#创建归档文件
hadoop archive -archiveName test.har -p /config /outputdir
hadoop fs -rm -r /config
#查看合并后的小文件全部内容
hadoop fs -cat /outputdir/test.har/part-0
#查看归档中每一个小文件的名字
hadoop fs -ls har://hdfs-node1:8020/outputdir/test.har
#查看归档中其中的一个小文件内容
hadoop fs -cat har:///outputdir/test.har/core-site.xml
#还原归档文件
hadoop fs -mkdir /config
hadoop fs -cp har:///outputdir/test.har/* /config
九、HDFS的动态上下线
1、当集群的存储容量达到上限时,我们可以通过添加主机的方式来扩展DataNode节点,来横向增加集群的存储空间
2、我们在动态扩容时,不要一影响当前集群的正常工作
操作:
==================1、基础环境配置====================
1、从node1克隆一台主机:node4
2、修改node4的Mac地址、IP地址为164,主机名为node4
3、关闭node4的防火墙、安装JDK,关闭Selinux (已做)
4、node1、node2、node3、node4要修改域名映射
192.168.88.161 node1 node1.itcast.cn
192.168.88.162 node2 node2.itcast.cn
192.168.88.163 node3 node3.itcast.cn
192.168.88.164 node4 node4.itcast.cn
5、node1、node2、node3、node4重新构建免密登录
5.1)在node4上,生成一个密钥对:ssh-keygen -t rsa
5.2)在node4上,将node4的公钥发送给node1:ssh-copy-id node1
5.3)将node1上,将所有公钥发送给:node2,node3,node4
scp /root/.ssh/authorized_keys node2:/root/.ssh
scp /root/.ssh/authorized_keys node3:/root/.ssh
scp /root/.ssh/authorized_keys node4:/root/.ssh
6、在node4上,删除Hadoop的所有痕迹
6.1)删除Hadoop安装包: rm -fr /export/server/hadoop-3.3.0/
6.2)删除Hadoop数据: rm -fr /export/data/hadoop-3.3.0/
6.3)删除Hadoop的环境变量:vim /etc/profile
==================1、Hadoop上线核心配置====================
7、在node1上修改namenode(node1)节点workers配置文件,增加新节点主机名
vim /export/server/hadoop-3.3.0/etc/hadoop/workers
node1
node2
node3
node4
8、在node1上,将Hadoop分发给node4
scp -r /export/server/hadoop-3.3.0 node4:/export/server
9、在node4上,新机器上配置hadoop环境变量
vim /etc/profile
export HADOOP_HOME=/export/server/hadoop-3.3.0
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
最后:source /etc/profile
10、在node4上启动datanode
hdfs --daemon start datanode
11、通过页面查看
http://node1:9870/dfshealth.html#tab-datanode
#---------------设置负载均衡---------------
#设置在负载均衡期间DataNode在数据搬移时,能够使用的最大带宽(100M)
hdfs dfsadmin -setBalancerBandwidth 104857600
#当不同主机之间存储的比率超过5%时,会自动进行负载均衡操作
hdfs balancer -threshold 5
十、HDFS高可用
1、HDFS的高可用是由NameNode组成,一个是Active状态的NameNode,一个是Standby状态的NameNode
2、Journal Node集群两个NamNode之间元数据的同步,同步的数据是日志文件Edits,由NameNode自己完成fsimage文件的生成,没有SecondaryNameNode
3、两个NameNode的主备切换,是由ZKFC和Zookeeper集群共同来完成
3.1 正常情况下由ZKFC来监控 Active NameNode的健康状态,一旦发现主NameNode健康不良,则立刻通知Zookeeper,Zookeeper会通知备ZKFC,然后备ZKFC会改变备NameNode状态由Standby改为Active,备NameNode成为新的主节点
如何解决脑裂问题
原因
由于极端情况下,主NameNode发生了假死现象,临时假死,后来又复活,这样原来的主NameNode状态是Active,后来的备用NameNode状态也改为Active,这样就会有两个Active状态的NameNode,会造成元数据的管理混乱,就相当于一个大脑被拆分了。
解决方案
方案1:调用旧Active状态的RPC接口中的相关方法,将其状态由Active强制改为StandBy
方案2:如果方案1没有实现,则ZK会远程登录到旧Active的NameNode主机上,将NameNode进程杀死