hdfs是一款被设计成适合运行在通用硬件上的分布式文件系统。它是一个高容错性的系统,适合部署在廉价的机器上,提供了高吞吐量的数据访问,适合大规模数据集上的应用,放宽了POSIX约束,可以实现流式读取文件系统数据的目的。
主要包括以下几部分:
关于block的几点知识:
1.hdfs中大文件的存储,是将文件线性切割成块(block),然后block分散存储在集群节点中。
2.在hdfs中,无论文件时图片、视频、或是文本,均以字节形式存储。
3.hdfs中block块的默认大小: 在hadoop2.7.3版本之前是64MB; 在hadoop2.7.3版本之后是128MB。(可查看官方各版本说明文档)
4.文件从本地上传时可以设置Block大小和副本数。
设置文件的副本数是为了备份源文件的块,目的是为了解决某个节点单点故障后数据不会丢失的问题。
副本的数量不能大于集群节点的数量,并且副本不能与源文件的块放在一个节点上。
副本除备份作用外,在并发量大的时候可以并行提供服务,提高集群的性能。
(即牺牲空间来换取性能与安全)
5.只支持一次写入多次读取,同一时刻只有一个写入者
6.文件写入后不支持修改,但是可以追加内容(append)。
不支持修改的原因是hdfs文件一旦发生修改就会发生蝴蝶效应,使文件的所有块发生变化(偏移量的变化),进而造成集群的性能浪费。
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出新的块信息。
优势
劣势
写流程:
客户端提交文件的时候首先和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完成心跳后,该文件就变成可用状态了。
读过程:
客户端读数据首先和NN交互元数据信息,NN会给客户端Block块的列表信息。
客户端获取到NN的元数据信息后,会根据block列表去对应的DN读取数据。
注意:
1.客户端读取block块信息选择DN的优先级顺序:
最高优先级: DN与客户端在同一节点
此高优先级: DN与客户端登录服务器在同一个机架(同一机架走同一交换机,效率高)
最低优先级:随机取
2.hdfs读流程体现了大数据的两大特性:
本地化读取
计算向数据转移
NameNode启动的时候,首先将快照载入内存,然后执行edits中的各项操作。一旦在内存中成功建立文件系统元数据的映射,则创建一个新的快照和一个空的edits,此时NN运行在安全模式。
安全模式下,NN的文件系统对于客户端来说是只读的。
注意:
在安全模式的阶段,NN收集各个DN的报告,当数据块达到最小副本数以上时,会被认为是安全的,然后过若干时间,安全模式结束。
当检测到副本数不足的数据块时,该块会被直接复制达到最小副本数。
r:read
w:write
x:execute
hdfs文件权限的目的:
阻止好人做坏事,而非阻止坏人做坏事。
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测试安装成功
免密钥,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执行同样的操作
采用xftp4将文件压缩包上传至虚拟机,然后解压
[root@node01 soft]# tar xvf hadoop-2.6.5.tar.gz -C /opt/neusoft/
[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
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
5.3 配置副本数量
因为是伪分布式,所以这里设置的副本数量是1,实践中要根据不同情况配置副本数量
5.4 设置从节点列表
设置从节点的列表,这里是伪分布式,所以只要node01一个节点。
5.5 设置hadoop临时目录所存放的目录
5.6 设置secondarynamecode启动位置
1.hdfs格式化
格式化前必须确保,设置的hadoop临时目录所存放的目录不存在或者为空!
[root@node01 hadoop]# hdfs namenode -format
2.启动hdfs
[root@node01 current]# start-dfs.sh
3.3.在浏览器中输入:http://node01:50070
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/