【博学谷学习记录】超强总结,用心分享|狂野大数据课程 【HDFS组件】

一、基准测试

一般在搭建完集群之后,运维人员需要对集群进行压力测试,对于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进程杀死

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HDFS(Hadoop Distributed File System)是Hadoop生态系统中的一种分布式文件系统,它的设计目标是能够在廉价的硬件上存储大量数据,并且保证高可靠性和高性能。 HDFS将大文件划分为若干个数据块(默认大小为64M),并将这些数据块分散存储在不同的节点上,这些节点可以是集群中的任何一台机器。每个数据块会有多个备份(默认为3份),这些备份会存储在不同的节点上,以保证数据的可靠性。HDFS会通过数据块的复制策略,将数据块尽可能地分散存储在不同的机器上,以保证数据的可靠性和高效性。当某个节点失效时,HDFS会自动将该节点上的数据块复制到其他节点上,保证数据的可靠性。 在HDFS中,数据的存储是通过NameNode和DataNode来实现的。NameNode是整个HDFS的管理节点,它负责管理文件系统的命名空间、文件元数据信息、数据块的分布情况等。DataNode是存储数据块的节点,它负责存储数据块、向NameNode汇报数据块的存储信息等。 在HDFS中,当一个客户端需要存储一个文件时,它会将文件切分成若干个数据块,并将这些数据块分散存储在不同的DataNode上。同时,客户端会向NameNode发送一个请求,将文件的元数据信息存储在NameNode上。当客户端需要读取文件时,它会向NameNode发送一个请求,获取文件的元数据信息,然后通过DataNode获取数据块,并将这些数据块组成完整的文件返回给客户端。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值