大数据---HDFS

1.HDFS:分布式文件存储系统,是用来进行文件存储的,简单的理解就是大数据领域的硬盘或者磁盘(但是还是有非常大的区别的,这个我们接下来进行解释)。

 

2.那么它和传统的存储方式有什么区别呢?

 

首先,传统的方式保存数据就是我们平时用的上传到磁盘普通模式,但是我们站在大数据角度来看,如果我们的文件比较大(比如2T=2000G的文件),那么用这种方式就比较消耗时间,占用大量处理内存,而且磁盘的存储空间也会不够,如果我们采取纵向扩展的解决方式,就是在这一台机器上加磁盘,加内存,是一种手段,但是一台机器能够容纳的磁盘与内存空间是有上限的。如果文件大小超过了这个上限,我们就必须用横向扩展,增加服务器。同时把我们的大规模文件数据进行分块,分布到每一台服务器存储,并且同时进行执行并行存储操作,这样就解决了时间与空间的问题。

3.设计目标:

构成的服务器众多,因此可能出现的故障就多,HDFS可以快速故障的检测与修复。

因为注重大数据量的存储,所以与存储时间相比,更加注重于数据访问的高吞吐量,以及提供了很高的聚合数据带宽。而且为了实现这一特性。它一般情况下,一旦创建写入,关闭之后就不需要修改了,一次写入,多次写出的模式,这个就与传统的硬盘,磁盘有极大的区别。

特殊的计算处理模式,简单理解就是传统计算模式情况下,是代码不动将数据读取加载过来进行处理计算功能,而HDFS因为数据比较大,实现的模式是数据不动,将计算代码移动到数据上进行计算处理的模式。

4.重要特性:

架构

采用了master/slave  架构的模式。一般情况下一个HDFS有一个namenode(高可用模式除外)和一定数目的DataNode,其中namenode是主节点,DataNode是从节点。

存储

我们需要存储的数据在存储的时候被分块了(block),是真实的切割,在2.0版本以后默认大小是128M,这个大小可以通过配置参数来改变它。例如:一个文件大小200M,它会被切割成两部分去分布式存储,一部分大小为128M,另一部分大小为72M(200-128),

5.HDFS的角色:

HDFS包含三个角色:Namenode  DataNode  Secondary NameNode

Namenode:

用于管理元数据,。为防止一台服务器挂掉造成的数据丢失或者不可用问题,我们采取对同一个分块进行备份存储的方式(同一个分块存储在不同的服务器上),Namenode还记录了文件块备份存储和存储服务器的信息。Namenode的数据保存是在内存中,所以部署Namenode的机器要有比较大的内存,正常模式集群中如果Namenode挂掉了,那么这个集群或者说hadoop系统就无法使用(高可用模式除外)。

元数据:包括目录的结构、文件分块存储的信息、文件备份的信息以及datanode的信息池。为了客户端的请求响应效率,元数据保存在内存上(内存元数据),但是内存一旦出现状况其数据就会丢失,所以还有一种保存在磁盘上的元数据(元数据文件)用来对元数据进行持久化。

元数据文件包含两种:(1):fsimage 镜像文件:定期执行dump操作将内存元数据拷贝到磁盘,但是有弊端,如果在拷贝周期之间发生了宕机,那么备份的数据就不是最新的。(2)Edits 编辑日志:记录每一次hadoop文件系统更改操作。在拷贝周期基础上再加上Edits 编辑日志这样就避免的以上的弊端。(内存元数据=fsimage +Edits)

注意:fsimage 镜像文件没有保存文件块位置的信息,这一部分信息在重新启动的时候会通过datanode向namenode定时反馈来获得。

元数据还有一些目录文件记录namenode唯一标识,这个和联邦机制有关(联邦机制在下一篇博客中会有讲解)

Datanode:用来完成对数据分块的真实存储,并且要定时的反馈给Namenode自己的心跳(周默认期时间是3秒)与数据块(block)的信息(默认周期时间是6小时),如果长时间没有发送心跳信息,那么久认为这个DataNode失效了。备份的数据块叫做副本,这个副本大小与原数据块相同,但是副本的个数是可以通过参数来进行更改的(dfs.replication)默认是3个,当集群中的一个DataNode关闭时,并不会影响集群的运行,Namenode会安排其他的DataNode根据副本信息来弥补空缺,因为用来进行执行存储,所以DataNode一般所在机器要配有大量的硬盘空间,在一个集群中DataNode的数量是多个的。

Secondary NameNode: 从名字上看感觉像是NameNode的备份角色,其实不然,当一个HDFS集群运行一段时间后,它的操作日志(edit logs)会变得很大,而且有时候镜像文件( fsimage)会变得很陈旧,为了减小Namenode压力,Secondary NameNode的职责简单理解就是合并Namenode的edit logs到fsimage中,从而达到减小操作日志(edit logs)的大小并且生成最新的镜像文件( fsimage)。

元数据合并:实质就是合并Namenode中的操作日志(edit logs)与镜像文件( fsimage),在满足触发条件(checkpoint)时,Secondary NameNode会把操作日志(edit logs)与镜像文件( fsimage)通过HTTP GET 方式拉取到自己角色所在服务器的磁盘上,然后把镜像文件( fsimage)加载到本机内存,之后去一个一个的读取操作日志(edit logs)的每一条记录,形成新的镜像文件,然后把新的镜像文件传回给Namenode,生成最新的操作日志(edit logs)与镜像文件( fsimage)。把这个合并的操作交给Secondary NameNode保证了Namenode不中断。

触发条件(checkpoint):可以再配置文件 core-site.xml 中配置周期时间,默认是一小时。(同时也可以在此文件中配置未完成事物数量作为周期,默认是100万条,一般不用这种方式)

6.HDFS的操作:

Hadoop提供了文件系统的shell命令行客户端,所以用shell命令可以对HDFS进行操作。格式为(举一个例子):显示HDFS根目录下所有的文件hadoop fs -ls  hdfs://namenode:host/  这里如果是HDFS系统hadoop fs可以写成hdfs dfs。如果没有特殊更改的话在我们默认的配置文件fs.defaultFS 中有配置,可以简写成hadoop fs -ls  / ,hadoop fs是固定的格式,-ls是操作指令,之后的是路径,大部分的指令就是Linux指令前面加- ,但是还有一些特殊的,对于指令都有哪些,可以网上查找。

7.HDFS默认的数据块备份模式:

Hadoop 在设计时考虑到数据的安全与高效,数据文件默认在 HDFS 上存放三份,存储策略为本地一份,同机架内其它某一节点上一份,不同机架的某一节点上一份。

8.HDFS上传文件的流程:

发起上传请求,namenode要先进行检测,文件是否存在,目录是否完整正确,返回是否可以上传的权限,再次请求上传,namenode会返回目前可以存储的DataNode信息(选择机制:当DataNode都处于较空闲与空间较富余的时候,会根据网络拓扑的距离来排序,离得比较进的排在前面),之后客户端建立与DataNode的连接,并且让DataNode之间创建数据管道(pipelline),目的是客户端不用与每一个DataNode都建立连接,效率增加,时间缩短。当管道打通之后,客户端才传送第一个块数据(以128M进行切割之后的数据块),传送的数据时以包(packet)为单位(单位:64k),数据包可以理解为传送数据的最小包装单位,这些包在管道里面进行传输,并且同时完成设置好的数据备份功能,保存传输完成之后,并返回数据校验的信息,表示数据保存成功,

9.HDFS读取数据的流程:

客户端发起请求,下载文件,namenode客户端权限与检测文件是否存在,权限不足或者文件不存在会报错,都满足namenode会返回该文件的所有元数据信息,这里要注意,我们把文件按照128M切割分块了,并且保存在不同的datanode上,是按照网络拓扑就近原则来返回的,离得越近其对应的分块id就排在前面,之后客户端就按照返回的对应的数据块存储信息,到不同的datanode上去获取数据,并最终合并形成最终形式。

10.HDFS的目录操作:

可以在Linux系统通过shell命令行的方式,也可以通过java代码对目录进行操作,实质就是操作相关api之后打包成一个jar包去运行来实现(比较简单)。

实际开发模式很多时候我们需要定时上传文件到HDFS上,用shell客户端与java代码都可以实现,我们的服务器每天产生日志的时候,需要我们去定时的将日志上传,日志也会滚动的去形成,比如按照每一个小时生成对应的日志,目的是这样做可以避免单个文件过大导致上传困难,

用shell脚本就可以实现这个功能,那么脚本的格式是怎样的呢?

首先在shell脚本里面导入环境变量,代码格式如下:

export JAVA_HOME=jdk安装目录

export JRE_HOME=${JAVA_HOME}/jre

export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

export PATH=${JAVA_HOME}/bin:$PATH

export HADOOP_HOME=hadoop安装目录

export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH

如果你的hadoop已经配置完好,这里可以省略,但是建议写上。

建立文件存放与等待上传目录。(自定义)

逻辑实现:判断我们的文件存放目录里面是否有满足要求格式的文件,

满足的话移动文件到等待上传目录,并且重命名,而且对于处于不同进程的文件命名为不同名字后缀,比如待上传为 .doing 成功为 .down。

而在日常开发中,要求周期性的去执行定时上传的功能,比如对每天的日志文件都要上传,可以用Linux指令来实现(如下):

Linux :crontab -e

0 0 * * * /shell/ (文件名).sh //每天凌晨 12:00 执行一次

 

11.HDFS的安全模式:

是一种保护机制,在这种模式下,HDFS文件系统只能被查看,其他的功能(删除,修改)都是不被允许的、也不能执行。

Namenode启动时,自动进入安全模式,需要Datanode向Namenode报告block信息,当block数量满足我们配置需求的条件时(一般是接受到全部block的信息)HDFS自动离开安全模式。

安全模式的相关配置在 hdfs-site.xml 文件中,主要配置如下三个:

dfs.namenode.replication.min:每个数据块最小的副文本数量,默认为1,虽然我们为了整体的运行会对数据进行文本备份多份,但是默认上传一份就是成功的状态了,其余的会自行复制。

dfs.namenode.safemode.threshold-pct:满足最小副文本数量个数与整体个数的百分比。默认是0.999f,小于这个默认值得时候会一直处于安全模式,

dfs.namenode.safemode.extension:时间限制。当一切条件都满足离开安全模式的时候,还要等这个时间结束才可以离开,默认是30000毫秒。

 

12.手动控制安全模式:

进入安全模式:hdfs dfsadmin -safemode enter

退出安全模式:hdfs dfsadmin -safemode leave

猜你喜欢

转载自blog.csdn.net/jinyusheng_1991/article/details/81865276