hadoop:包含分布式文件系统和分布式计算的一个框架。 HDFS,mapreduce
-
HDFS的架构:三种节点:NN,SNN,DN。
- 不可替代
- 存放海量的数据。
- 数据 --》----》文件—》存放HDFS—》数据文件(元数据,内容数据)—》元数据在NN,内容数据形成block在DN。
- 非常兼容各种分布式计算
HDFS:分布式文件存储系统,提供了 高可靠性、高扩展性和高吞吐率的数据存储服务;
分布式计算框架MapReduce:计算向数据移动,具有易于编程、高容错性和高扩展性等优点;
分布式资源管理框架YARN:负责集群资源的管理和调度;
1.HDFS优点:
高容错性
•数据自动保存多个副本
• 副本丢失后,自动恢复
适合批处理
•移动计算而非数据
•数据位置暴露给计算框架(Block偏移量)
适合大数据处理
•GB 、TB 、甚至PB 级数据
•百万规模以上的文件数量
•10K+ 节点
可构建在廉价机器上
•通过多副本提高可靠性
•提供了容错和恢复 机制
2.HDFS缺点:
低延迟数据访问
•比如毫秒级
•低延迟与高吞吐率
小文件存取
•占用NameNode 大量内存
•寻道时间超过读取时间
并发写入、文件随机修改
•一个文件只能有一个写者
•仅支持append
3.存储模型:字节
文件线性切割成块(Block):偏移量 offset (byte),Block分散存储在集群节点中,单一文件Block大小一致,文件与文件可以不一致,数据文件切割形成的;
Block可以设置副本数,副本分散在不同节点中
•副本数不要超过节点数量
文件上传可以设置Block大小和副本数,已上传的文件Block副本数可以调整,大小不变
只支持一次写入多次读取,同一时刻只有一个写入者,可以append追加数据
4.架构模型
–文件元数据MetaData,文件数据
•元数据
•数据本身
(主)NameNode节点保存文件元数据:单节点 posix
(从)DataNode节点保存文件Block数据:多节点
DataNode与NameNode保持心跳,提交Block列表
HdfsClient与NameNode交互元数据信息
HdfsClient与DataNode交互文件Block数据
5.节点的作用:
**1.NameNode(NN)主: **
1、接受客户端的读写请求。
2、存储和管理HDFS的元数据(收集DataNode汇报的Block列表信息)。
3、基于内存存储 ,不会和磁盘发生交换;
**2.SNN: **合并元数据文件(edits 和 fsimage)(这个功能也可以由其他节点来完成)
它不是NN的备份(但可以做备份),它的主要工作是帮助NN合并edits log,减少NN启动时间。
SNN执行合并时机
•根据配置文件设置的时间间隔fs.checkpoint.period 默认3600秒
•根据配置文件设置edits log大小 fs.checkpoint.size 规定edits文件的最大值默认是64MB ,最大128M
3.DataNode(DN)从 :
1、存放和管理block(数据),
2、实时往NN汇报
3、通过向NN发送心跳保持与其联系(3秒一次),如果NN 10分钟没有收到DN的心跳,则认为其已经lost,并copy其上的block到其它DN。
4.block(数据块):数据文件切割之后形成一个一个的数据块。还有偏移量 offset (byte),每个块默认有3个副本。默认64M,最大128M
5.元数据:除文件内容之外的。包括文件的名字、时间、所属用户、权限、大小等等,包括block的位置信息。
-
**读写流程:**重点
-
写流程
Client:
切分文件Block
按Block线性和NN获取DN列表(副本数)
验证DN列表后以更小的单位流式传输数据
各节点,两两通信确定可用
Block传输结束后:
DN向NN汇报Block信息
DN向Client汇报完成
Client向NN汇报完成
获取下一个Block存放的DN列表
最终Client汇报完成
NN会在写流程更新文件状态
解释2:
客户端调用 create()来创建文件, Distributed File System 用 RPC 调用 NameNode
节点, 在文件系统的命名空间中创建一个新的文件。 NameNode 节点首先确定文件原来不
存在, 并且客户端有创建文件的权限, 然后创建新文件。
Distributed File System 返回 DFSOutputStream, 客户端用于写数据。 客户端开始
写入数据, DFSOutputStream 将数据分成块, 写入 Data Queue。 Data Queue 由 Data
Streamer 读取, 并通知 NameNode 节点分配数据节点, 用来存储数据块(每块默认复制 3
块)。 分配的数据节点放在一个 Pipeline 里。 Data Streamer 将数据块写入 Pipeline 中的第
一个数据节点。 第一个数据节点将数据块发送给第二个数据节点。 第二个数据节点将数据发
送给第三个数据节点。
DFSOutputStream 为发出去的数据块保存了 Ack Queue, 等待 Pipeline 中的数据节
点告知数据已经写入成功。
-
读流程
Client:
•和NN获取一部分Block副本位置列表
•线性和DN获取Block,最终合并为一个文件
•在Block副本列表中按距离择优选取
-
-
fsimage和edits的合并
edits文件记录了客户端对HDFS所做的各种更新操作,客户端所有的写操作都被记录在了此文件中。
而fsimage文件记录了元数据的文件,这个文件不是实时的,通俗来说,更像是对HDFS的一个快照,它记录了某个时刻下的HDFS的状态信息。
触发这两个文件合并的条件
1.HDFS的重新启动
2.edits文件达到指定的大小(默认64M,可更改)3.设置了指定时间促使两文件合并(默认3600s,可更改)
合并过程(SecondaryNameNode)
NameNode中产生一个新的edits文件,名为edits.new后续的更新操作写在此文件中
SecondaryNameNode通过http协议从Name上获取edits文件和fsimage文件
在SecondaryNameNode上将fsimage文件加载到内存中,然后将edits文件的操作更新到内存中,然后写成一个新的文件fsimage.ckpt
SecondaryNameNode通过http协议将fsimage.ckpt文件发送到NameNode上NameNode将fsimage.ckpt文件更名为fsimage,将edits.new更名为edits
注意:
SecondaryNameNode不是NameNode的热备,但也能起到一定的备份作用,这就说明在一定情况下可能会产生数据丢失情况,所以在Hadoop2.0完全分布式中,抛弃了SecondaryNameNode,采用了双NameNode机制来进行热备
edits文件和fsimage文件的合并发生在SecondaryNameNode上是因为这两个文件比较合并耗时,如果在NameNode上合并可能会导致系统卡顿,所以在SecondaryNameNode上进行
hadoop 伪集群部署
1.环境准备
1.1.配置jdk
从已有服务器中远程拷贝jdk
scp -r jdk1.8.0_171-amd64 root@192.168.200.23:/usr/local/jdk1.8
配置环境变量
vi ~/.bash_profile
export JAVA_HOME=/usr/local/jdk1.8
export JRE_HOME=/usr/local/jdk1.8/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
使文件生效
source ~/.bash_profile
1.2.配置SSH免密钥登陆
远程登陆操作示例:
ssh root@192.168.200.22 'ls -l /'
#创建密钥公钥文件,实现是把公钥放在访问方的认证文件里
$ ssh-keygen -t dsa -P '' -f /root/.ssh/id_dsa
$ cd ~/.ssh/
$ ll
总用量 12
id_dsa #密钥
id_dsa.pub #公钥
known_hosts
#把公钥放在访问方的认证文件里
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
测试
[root@bd003 .ssh]# ssh root@localhost
The authenticity of host 'localhost (::1)' can't be established.
RSA key fingerprint is 2c:67:f7:97:59:8c:de:d0:c5:75:1a:fb:32:35:09:55.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (RSA) to the list of known hosts.
Last login: Tue Jun 11 13:49:32 2019 from 192.168.200.1
[root@bd003 ~]#
#没有输入密码即可进
复制密钥
/root/.ssh
[root@bd003 .ssh]# ssh-copy-id -i ~/.ssh/id_dsa.pub root@bd002
到此完成
1.3.时间同步
yum install ntp
service ntpd status
ntpdate time.nist.gov
或者
date -s "2019-6-11 09:25:10"
1.4.配置hosts
vi /etc/hosts
添加
192.168.200.21 bd001
192.168.200.22 bd002
192.168.200.23 bd003
192.168.200.24 bd004
查看network
[root@bd003 /]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=bd003
2.hadoop部署
2.1 上传解压安装包
解压
tar -zxvf hadoop-2.7.7.tar.gz
移动
mv hadoop-2.7.7 /opt/bd/
2.2配置hadoop环境变量
vi ~/.bash_profile
export HADOOP_HOME=/opt/bd/hadoop-2.7.7
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
修改内置的环境变量
/opt/hadoop-2.6.5/etc/hadoop/hadoop-env.sh
文件中修改部分:
# The java implementation to use.
export JAVA_HOME=/usr/local/jdk1.8
#同样的修改mapred-env.sh和yarn-env.sh中的JAVA_HOME
2.3配置hadoop
1./opt/hadoop-2.6.5/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://bd003:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop_data</value>
</property>
</configuration>
2./opt/hadoop-2.6.5/etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>bd003:50090</value>
</property>
</configuration>
3./opt/hadoop-2.6.5/etc/hadoop/slaves
bd003
2.4 NameNode 格式化
/opt/hadoop-2.6.5/etc/hadoop/bin
./hadoop namenode -format
2.5 启动
/opt/hadoop-2.6.5/sbin
[root@bd003 sbin]# ./start-dfs.sh
访问: http://192.168.200.23:50070/
上传测试文件
/opt/hadoop-2.6.5/bin
[root@bd003 bin]# ./hdfs dfs -put ~/hadoop-2.6.5.tar.gz /