文章目录
概述
hdfs(Hadoop Distribute File System)是分布式文件系统,分布式文件系统是指文件系统管理的物理存储资源不一定直接链接在本地节点上,而是通过计算机网络与节点相连,可让多机器上的多用户分享文件和存储空间
分布式文件系统的特点:
- 分布式文件系统可以有效解决大数据的存储和管理难题
- 将固定于某个地点的某个文件系统,扩展到任意多个地点/多个文件系统
- 众多的节点组成一个文件系统网络
- 每个节点可以分布在不同的地点,通过网络进行节点间的通信和数据传输
- 在使用分布式文件系统时,无需关心数据是存储在哪个节点上、或者是从哪个节点获取的,只需要像使用本地文件系统一样管理和存储文件系统中的数据
HDFS优势
- 可构建在廉价机器上,设备成本相对低
- 高容错性,HDFS将数据自动保存多个副本,副本丢失以后,自动回复,防止数据丢失或者损坏
- 适合批处理,HDFS适合一次写入、多次查询(读取)的情况,适合在已有的数据进行多次分析,稳定性好
- 适合存储大文件,其中的大表示可以存储单个大文件,因为是分块存储,以及表示可以存储大量的数据
HDFS劣势
- 由于提高了吞吐量,所以降低了实时性
- 由于每个文件都会在namenode中记录元数据,如果存储了大量的小文件,会对namenode造成很大的压力
- 不合适小文件处理,在mapreduce的过程中小文件的数量会造成map数量的增大,导致资源被占用,而且速度慢。
- 不适合文件的修改,文件只能追加在文件的末尾,不支持任意位置修改,不支持多个写入者操作
安装
- Java环境
略 - 修改主机名称
# centos7 里面修改hostname的方式有所改变,修改/etc/hosts和/etc/sysconfig/network两个文件已经不能生效。使用的新命令是:
# 修改主机名
[root@localhost ~]# hostnamectl set-hostname Hadoop
# 重启主机
[root@localhost ~]# reboot
[root@Hadoop ~]# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.11.20 Hadoop
- 关闭防火墙
# 查看防火墙状态
[root@Hadoop ~]# systemctl status firewalld
# 关闭防火墙
[root@Hadoop ~]# systemctl stop firewalld
# 关闭开启自启
[root@Hadoop ~]# systemctl disable firewalld
- ssh免密登录
[root@Hadoop ~]# ssh-keygen -t rsa # 生成密钥
[root@Hadoop .ssh]# touch authorized_keys # 创建文件
[root@Hadoop .ssh]# cat id_rsa.pub >> authorized_keys # 将公钥写入到文件中
- 配置Hadoop环境变量
export HADOOP_HOME=/home/hadoop/hadoop-2.6.0
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
- 配置 etc/hadoop/core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://Hadoop:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/software/hadoop-2.6.0/hadoop-${user.name}</value>
</property>
- 配置 etc/hadoop/hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
- 初始化HDFS
[root@Hadoop ~]# hdfs namenode -format
[root@Hadoop ~]# tree /home/software/hadoop-2.6.0/hadoop-root
/home/software/hadoop-2.6.0/hadoop-root
└── dfs
└── name
└── current
├── fsimage_0000000000000000000
├── fsimage_0000000000000000000.md5
├── seen_txid
└── VERSION
3 directories, 4 files
- 启动Hdfs
# 开启HDFS
[root@hadoop ~]# start-dfs.sh
# 关闭hdfs
[root@hadoop ~]# stop-dfs.sh
常用命令
- -help:显示帮助信息
hadoop fs -help rm
- -ls:显示目录信息
hadoop fs -ls /
- -put:将本地文件上传到HDFS,等同于copyFromLocal
hadoop fs -put hadoop-2.6.0.tar.gz /file
- -get:从HDFS中拷贝到本地,等同于copyToLocal
hadoop fs -get /file/hadoop-2.6.0.tar.gz
- -mkdir:在HDFS上创建目录
hadoop fs -mkdir -p /user
- -cat:显示文件内容
hadoop fs -cat /user/a.txt
- -cp:在HDFS中拷贝文件
hadoop fs -cp /file/hadoop-2.6.0.tar.gz /user
- -du:统计文件夹的大小信息
hadoop fs -du -s -h /file
- -setrep:设置HDFS文件中的副本数量
hadoop fs -setrep 5 /a.txt
- -moveFromLocal:从本地剪切粘贴到HDFS
- -appendToFile:追加一个文件到已经存在的文件末尾
- -chmod、-chown:修改文件权限、所有者
- -copyFromLocal:从本地文件系统中拷贝文件到HDFS中
- copyToLocal:从HDFS拷贝到本地
- -mv:在HDFS目录中移动文件
- -getmerge:合并下载多个文件
- -tail:显示文件末尾的内容
- -rm:删除文件夹或者文件
- -rmdir:删除空目录
架构
NameNode
NameNode:
存储元数据,负责管理DataNode,保存了两个核心的数据结构FsImage和EditLog
- FsImage:用于维护文件系统树以及文件树中所有的文件和文件夹的元数据
- Edits:记录操作的日志文件,记录了所有针对文件的创建、删除、重命名等操作
注意:
这个两个都是文件,也会加载解析到内存中
DataNode
DataNode:
用于存储数据块的节点,负责相应客户端的对块的读写请求,向NameNode汇报自己的信息
Block块
block:
数据块,hdfs中对文件拆分的最小单元,切分尺度默认128M,每个块在默认情况下有三个副本
Rack
rack:
机架,使用机架配置文件对存储节点进行物理编排,用于优化存储和计算
Rack Awareness 机架感知
对于常见情况,当复制因子为3时,HDFS的放置策略是将一个副本放在本地机架中的一个节点上,另一个放在本地机架中的另一个节点上,将最后一个放在另一个机架中的一个节点上。此策略可以减少机架间写入流量,从而提高写入性能。机架故障的可能性远小于节点故障的可能性;此策略不会影响数据可靠性和可用性保证。但是,它确实减少了读取数据时使用的聚合网络带宽,因为块只放在两个唯一的机架而不是三个。使用此策略时,文件的副本不会均匀分布在机架上。三分之一的副本位于一个节点上,三分之二的副本位于一个机架上,另外三个副本均匀分布在剩余的机架上。此策略可提高写入性能,而不会影响数据可靠性或读取性能。
NameNode和SecondaryNameNode
fsimage:
元数据信息的备份,会被加载到内存中
edits:
edits文件帮助记录增加和更新操作,提高效率
检查点(checkpoint)
namenode使用fsimage和edits文件保存元数据,2nn会定期的下载主的(Active)namenode的fsimage文件和edits 文件,并在本地进行合并。
合并的时机就称之为检查点
检查点有两种触发机制:
- 默认一个小时进行合并
- 操作数量达到100W次进行合并
DataNode工作机制
(1)一个数据块在datanode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
(2)DataNode启动后向namenode注册,通过后,周期性(1小时)的向namenode上报所有的块信息。
(3)心跳是每3秒一次,心跳返回结果带有namenode给该datanode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个datanode的心跳,则认为该节点不可用。
(4)集群运行中可以安全加入和退出一些机器。
HDFS的读写流程
HDFS写入流程
- 跟NN通信请求上传文件,NN检查目标文件是否存在,父目录是否存在
- NN返回是否可以上传
- client会先对文件进行切分,比如一个block块128M,文件300M就会被切分成3个块,两个128M,一个44M。请求第一个block该传输到哪些DN服务器上
- NN返回DN的服务器
- client请求一个台DN上传数据(RPC调用,建立pipeline),第一个DN收到请求会继续调用第二个DN,然后第二个调用第三个DN,将整个pipeline建立完成,逐级返回客户端
- client开始传输block(先从磁盘读取数据存储到一个本地内存缓存),以packet为单位(一个packet为64kb),写入数据的时候datanode会进行数据校验,并不是通过packet为单位校验,而是以chunk为单位校验(512byte),第一个DN收到第一个packet就会传给第二台,第二台传给第三台;第一台每传一个packet就会放入一个应答队列等待应答
- 当一个block传输完成时,client再次请求NN上传第二个block的服务器
HDFS读取流程
- 跟NN通信查询元数据(block所在的DN的节点),找到文件块所在的DN的服务器
- 挑选一台DN(就近原则,然后随机)服务器,请求建立socket流
- DN开始发送数据(从磁盘里读取数据放入流,一packet为单位做校验)
- 客户端以packet为单位接收,首先写入本地缓存,然后写入目标文件中,后面的block块就相当于append到前面的block块,最后合成最终需要的文件