大数据之hadoop分布式存储系统hdfs

目录:

  1. 什么是hdfs?
  2. hdfs架构模型
  3. 数据块
  4. NameNode与DataNode
  5. hdfs的优劣
  6. hdfs读写流程
  7. hdfs安全模式
  8. HDFS文件权限(POSIX)
  9. hadoop hdfs环境搭建

一、什么是hdfs?

hdfs是一款被设计成适合运行在通用硬件上的分布式文件系统。它是一个高容错性的系统,适合部署在廉价的机器上,提供了高吞吐量的数据访问,适合大规模数据集上的应用,放宽了POSIX约束,可以实现流式读取文件系统数据的目的。

二、hdfs架构模型

大数据之hadoop分布式存储系统hdfs_第1张图片

主要包括以下几部分:

  • 数据本身,block块形式存储
  • NameNode节点,保存文件元数据
  • DataNode节点,保存文件Block数据 (DataNode与NameNode保持心跳,提交Block列表)
  • hdfsClient,client与namenode交互元数据信息,client与datanode交互文件block数据

三、数据块

大数据之hadoop分布式存储系统hdfs_第2张图片

关于block的几点知识:
1.hdfs中大文件的存储,是将文件线性切割成块(block),然后block分散存储在集群节点中。

2.在hdfs中,无论文件时图片、视频、或是文本,均以字节形式存储。

3.hdfs中block块的默认大小: 在hadoop2.7.3版本之前是64MB; 在hadoop2.7.3版本之后是128MB。(可查看官方各版本说明文档)

4.文件从本地上传时可以设置Block大小和副本数。
设置文件的副本数是为了备份源文件的块,目的是为了解决某个节点单点故障后数据不会丢失的问题。
副本的数量不能大于集群节点的数量,并且副本不能与源文件的块放在一个节点上。
副本除备份作用外,在并发量大的时候可以并行提供服务,提高集群的性能。
(即牺牲空间来换取性能与安全)

5.只支持一次写入多次读取,同一时刻只有一个写入者

6.文件写入后不支持修改,但是可以追加内容(append)。
不支持修改的原因是hdfs文件一旦发生修改就会发生蝴蝶效应,使文件的所有块发生变化(偏移量的变化),进而造成集群的性能浪费。

四、NameNode与DataNode

4.1 NameNode

NameNode持久化

NameNode存储的信息会定时以快照的形式存放在磁盘,只是做备份持久化。
NN与客户端交互时,不会去磁盘读取快照,而是在内存中读取元信息。

在NameNode刚一开启机器的时候会初始化快照(fsimage),将元信息同步到内存。同时要加载Edits日志信息,将其中的增删查改命令再执行一遍,此时才能恢复到最后宕机时的状态。

Edits是用户对数据库的操作信息的日志记录。如果NN运行了很长时间,日志会很大,执行日志中记录的操作会很耗费时间。为了解决大日志恢复耗时问题,需要实时将快照与日志进行合并。
(时隔1小时或者edits文件大小达到64mb进行合并操作)

NameNode 功能

1.接收客户端的读写服务
2.收集DataNode汇报的Block列表信息
3.保存元信息(metadata),包括:
文件大小,创建时间,Block列表,Block偏移量等 -来源于客户端
位置信息(动态数据信息),block副本位置 -由DataNode上报

4.2 DataNode

本地磁盘目录存储数据(Block),datanode存放的元信息是block块的元信息,即数据信息。

心跳机制:
启动DN时会想NN汇报block信息,通过向NN发送心跳保持联系(每3秒一次),若NN超过10分钟没有收到DN心跳,则认为其已经宕机(lost),则copy其上的block到其他DN。
注意:
心跳机制中的copy不是从已经故障的DN上copy,而是从这个DN的备机上copy出新的块信息。

五、hdfs的优劣

优势

  1. 高容错性 :数据自动保存多个副本,数据丢失后自动恢复
  2. 适合批处理 : 移动计算而非数据计算,数据位置暴露给计算框架
  3. 适合大数据处理:GB,TB,甚至PB级数据
  4. 可构建在廉价的机器上
  5. 流式数据访问:一次写入,多次读取,简单的一致性模型,有利于提高吞吐量

劣势

  1. 不适合低延迟数据访问场景
  2. 不适合小文件存取场景: NameNode占用大量内存,寻道时间超过读取时间
  3. 不适合并发写入,文件随机修改场景:一个文件只能有一个写者,仅支持append

六、hdfs读写流程

6.1 hdfs写流程
大数据之hadoop分布式存储系统hdfs_第3张图片

写流程:
客户端提交文件的时候首先和NN服务器交互,提交文件的元数据信息。在NN服务器上创建上传文件的文件名和路径以及块列表信息,然后按照这个状态将文件信息上传到DN节点上。

注意:
1.DN中文件上传采用管道模式(pipeline),即 一个大文件切块后要存放到不同的DN节点上,但是客户端和DN交互时只和一个DN服务器节点交互,然后由这个DN服务器节点与下一个DN服务器节点建立socket,然后再由下一个DN与下下个DN建立socket,这个过程叫做Pipeline。
2.时间重叠上传技术,当DN从客户端接收到完整的block块后,将向NN回报心跳,提交块信息,与此同时客户端还在上传第二个块信息。 按照这样的方式,当客户端提交最后一个block块的时候,DN已经把之前的块信息都完成了心跳。
3.客户端上传文件的过程中,在DN服务器上的状态为:coping
当所有的块都copy完成且dn与nn完成心跳后,该文件就变成可用状态了。

6.2 hdfs读流程:
大数据之hadoop分布式存储系统hdfs_第4张图片

读过程:
客户端读数据首先和NN交互元数据信息,NN会给客户端Block块的列表信息。
客户端获取到NN的元数据信息后,会根据block列表去对应的DN读取数据。

注意:
1.客户端读取block块信息选择DN的优先级顺序:
最高优先级: DN与客户端在同一节点
此高优先级: DN与客户端登录服务器在同一个机架(同一机架走同一交换机,效率高)
最低优先级:随机取
2.hdfs读流程体现了大数据的两大特性:
本地化读取
计算向数据转移

七、hdfs安全模式

NameNode启动的时候,首先将快照载入内存,然后执行edits中的各项操作。一旦在内存中成功建立文件系统元数据的映射,则创建一个新的快照和一个空的edits,此时NN运行在安全模式。
安全模式下,NN的文件系统对于客户端来说是只读的。

注意:
在安全模式的阶段,NN收集各个DN的报告,当数据块达到最小副本数以上时,会被认为是安全的,然后过若干时间,安全模式结束。
当检测到副本数不足的数据块时,该块会被直接复制达到最小副本数。

八、HDFS文件权限(POSIX)

r:read
w:write
x:execute

hdfs文件权限的目的:
阻止好人做坏事,而非阻止坏人做坏事。

九、hadoop hdfs环境搭建

  1. 配置JDK
1. rpm -ivh jdk-7u67-linux-x64.rpm
2. vi profile
在profile最后追加以下内容:
export JAVA_HOME=/usr/java/jdk1.7.0_67
export PATH=$JAVA_HOME/bin:$PATH 
3.source profile   //执行一下profile
4.jps测试安装成功
  1. 为集群的各台虚拟机配置免密钥
免密钥,ssh远程管理要输入对方的密码,这样的话对集群的通信会有障碍,所以设置免密钥。
步骤:
node1执行:
1.ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa  //生成密钥
2.将密钥copy给其他虚拟机
ssh-copy-id -i ~/.ssh/id_dsa.pub root@node01
ssh-copy-id -i ~/.ssh/id_dsa.pub root@node02
ssh-copy-id -i ~/.ssh/id_dsa.pub root@node03
ssh-copy-id -i ~/.ssh/id_dsa.pub root@node04

node02,node03,node04执行同样的操作
  1. 上传解压hadoop

在这里插入图片描述

 采用xftp4将文件压缩包上传至虚拟机,然后解压
 [root@node01 soft]# tar xvf hadoop-2.6.5.tar.gz -C /opt/neusoft/ 
  1. 配置环境变量
[root@node01 hadoop-2.6.5]# vi /etc/profile
在最后追加HADOOP_HOME,并修改PATH

export JAVA_HOME=/usr/java/jdk1.7.0_67
export HADOOP_HOME=/opt/neusoft/hadoop-2.6.5
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/sbin:$HADOOP_HOME/bin 
  1. 配置hadoop配置文件

5.1 重新配置jdk路径

重新配置的原因:
原来默认的Java路径在被远程调用的时候无法读取到环境变量,所以会报错,
所以这里是需要重写配置的,把路径定义好即可。
[root@node01 hadoop]# vi hadoop-env.sh
[root@node01 hadoop]# vi yarn-env.sh
[root@node01 hadoop]# vi mapred-env.sh
将sh文件中的JAVA_HOME改为正确的JAVA_HOME

5.2 配置namenode启动

这个配置的主要目的就是告诉服务的namenode去哪里启动?同时也是告诉客户端去哪个地址去找namenode。所以localohst尽量写的详细具体,node01
[root@node01 hadoop]# vi core-site.xml

大数据之hadoop分布式存储系统hdfs_第5张图片

5.3 配置副本数量
因为是伪分布式,所以这里设置的副本数量是1,实践中要根据不同情况配置副本数量
大数据之hadoop分布式存储系统hdfs_第6张图片
5.4 设置从节点列表

设置从节点的列表,这里是伪分布式,所以只要node01一个节点。
大数据之hadoop分布式存储系统hdfs_第7张图片
5.5 设置hadoop临时目录所存放的目录
大数据之hadoop分布式存储系统hdfs_第8张图片
5.6 设置secondarynamecode启动位置
大数据之hadoop分布式存储系统hdfs_第9张图片

  1. 启动服务
1.hdfs格式化
格式化前必须确保,设置的hadoop临时目录所存放的目录不存在或者为空!
[root@node01 hadoop]# hdfs namenode -format
2.启动hdfs
[root@node01 current]# start-dfs.sh
3.3.在浏览器中输入:http://node01:50070

大数据之hadoop分布式存储系统hdfs_第10张图片
7. 文件上传测试

1.创建hdfs目录
[root@node01 dfs]# hdfs dfs -mkdir -p /user/root
2.从本地上传一个文件到hdfs
[root@node01 soft]# hdfs dfs -put ./hadoop-2.6.5.tar.gz /user/root/

大数据之hadoop分布式存储系统hdfs_第11张图片

你可能感兴趣的:(大数据开发)