HDFS =================== Hadoop Distributed File System
特点:
1.易于扩展的分布式的
2.运行在大量廉价机器上,提供容错机制(自动保存多个副本)
hdfs的容错表现:
hdfs的冗余机制(存储多个副本)。
定期向namenode进行状态报告。
读写异常会重试。
分布式的存储
3.为大量用户提供性能不错的文件存取服务
hdfs的三大服务:namenode,secondarynamenode,datenode
其他服务:matastore,client
每个服务具体职责:
hdfs的架构成主从架构master/slave.
namenode(master):1、接收来自client端的i/o请求;2、记录操作元数据;3、获取来自小弟(datanode)的汇报信息(心跳、块报告等);4、还决定副本存储;
secondarynamenode(小秘): 协同老大管理元数据(合并元数据)-----checkpoint
datenode(slaves): clinet请求小弟真正读写数据内容;接受老大命令读写数据;管理block,定时向namenode汇报block信息
metastore: 元数据。描述hdfs块数据的数据的数据(块的地址、块id、块大小、块的创建人、创建时间等);
client : 客户端(发送读写数据请求)
namenode工作机制:
1.元数据保存到内存
2.每隔一段时间生成fsimage
3.edits记录操作
secondarynamenode工作机制:
namenode请求checkpoint,secn 响应请求,然后回滚日志文件,加载最新的edits,http方式下载fsimage和edits文件,把最新的fsimage和edits的数据读取到内存中,进行合并运算,将数据dump到磁盘,生成fsimage.checkpoint文件, 上传http给namenode,检验数据,重命名fsimage。
secondarynamenode合并日志:
namenode的启动流程:
1、对于刚搭建后第一次启动,需要格式化namenode,使其初始化新的元数据,
2、启动,namenode则加载最新的fsimage和edits中的数据到namenode的内存中。
3、namenode等待datanode的注册,注册成功将向namenode发送块状态报告(使用datanode和namnode的rpc通信协议)。
4、namenode负责对集群数据完整性进行检验,当数据完整性达到安全模式阀值以上则离开安全模式,否则一直处于安全模式。
简:
1.格式化namenode,初始化元数据
2.启动,加载fsimage和edits到内存
3.等待datanode注册
4.检验集群数据完整性
fsimage:镜像文件,是元数据的压缩
edits:日志文件,操作的详细记录。
datanode启动过程:
向namenode请求注册,注册成功则向namenode发送block report(块报告)
hdfs的读写流程:
写文件:
1.client通过调用DFS(一个类,简写)的create方法向namenode去请求上传文件,namenode收到后,检查是否有同名文件存在及该用户是否有创建权限,检查通过,则为该文件创建一个新元数据记录,指定块地址(第一个block该存放在哪个namenode上),同时DFS(DistributedFileSystem)类返回一个FSDataOutputStream输出流以供client写入数据。
2.开始写入数据,client将流中写入的数据拆分成包(packet 64k)放到中间对列中,同时向namenode申请一个block来存放,namenode会选择合适的dn(datanode)构成管道线(假设有3个),数据以流的形式写入管道的dn1,再写到副本到dn2,在到dn3,dn3依次向前一个节点返回结果到ack队列确认传输,最后将最终结果返会给namenode,并关闭输出流。
读文件:
1,client通过调用DFS的open方法向namenode请求打开文件,请求得到第一块block的位置信息,nd(namenode)返回目标文件的元数据(块的地址、块id、块大小、块的创建人、创建时间),同时DFS返回一个FSDataIputStream输入流供Client读取数据。
2,开始读取数据,连接最近的datanode获取数据,重复read操作(这些操作hadoop包装得有个工具论文类对流执行操作:IOUtils),数据被流式送到Client,读到该block末尾时,关闭流,继续找到下一个block的位置信息,重复调用read流式读取数据,直到读取整个文件,最后关闭输入流。
传输过程问题:
1、如果传输过程中,dn3坏掉了?
namenode不做任何处理,只保留两个副本,如果dn3再启动时,会向nn汇报,nn通知dn3删除掉之前上传的副本。
2、如果dn3连接不上?
nd会重新选择(分配)新的3个nd。最大重新分配数 4次,4次重新分配不成功,则上传失败。
3、如果丢包了?
则队列会重新上传丢失的包,重传次数4次都失败的话,则上传文件失败
4、如果bk1,bk2上传完成,bk3上传失败?
namenode发出命令让dn1删除之前的bk1 和block2,返回结果,文件上传失败
5、如果上传bk3时,dn1挂掉了?
文件上传失败。
6、如果上传过程中,client挂了?
namenode长时间接收不到反馈,namnode标记上传失败,下一次再连接时,会通知上次的dn删除是上次上传成功的block。
1、如果namenode磁盘故障,导致宕机,如何恢复集群数据??
把secondarynamenode下的fsimage数据拷贝到namenode中,------- /hadoop/dfs/name/current/ 就是这个目录下的文件
会丢失一些数据。
2、如何做到不丢数据的恢复???
多配几个namenode备用硬盘,复制多份副本在不同磁盘上,
通过设置namenode元数据的多个设备:配置参数:dfs.namenode.name.dir=/b,/c,/d,
3、namenode挂机,hdfs不能提供服务。
4、blocksize大小依据自己需要的集群性能来定。
5、集群容量不够怎么扩充?? ------------- 优先加硬盘,还是不够,加机器。
6、datanode明明已经启动,但是列表没有,怎么办??
重新格式化集群。
=============================================================================================
机架:给服务器分组的,一个机架上有多台服务器,每个服务器都可以器多个服务。
数据块:文件局部(文件大于128M,被拆分成块,这就是文件的部分内容)或者全部数据内容。文件以块的形式进行存储,块又以文件的形式存储到磁盘。
1.x : 64M
2.x : 128M
3.x : 256M
默认每一个块3个副本,默认最小的副本数是1个。
多个副本不能同时存储在一台服务器中。理由如下:
如果存储到一台服务器中,多个副本路径将会重复,
降低服务器坏丢所有块。
副本数是小于等于datanode服务数量的。
hdfs不适合存储小文件(存储效率底下)
=================================================================================
namenode 存储元数据,放在内存中。
datanode 存储文件内容,放在磁盘中。
==================================================================================
进入安全模式:
启动过程会进入安全模式
当数据完整性没有达到安全模式阀值,当数据完整性达到0.99999(正常块/所有块,千分之999)以上就可以离开安全模式,否则进入安全模式。
离开安全模式:
强制离开
适当降低阀值(不建议)
fsck去修复(对不重要的文件选择删除)
安全模式下只允许用户读,不允许写操作。
安全模式
安全模式的查看:
50070的web上能看到
hdfs dfsadmin -safemode get
hdfs dfsadmin -report
hdfs dfsadmin -safemode enter : 命令进入安全模式(文件系统运维时)
hdfs dfs -put /home/words /words1
hdfs dfsadmin -safemode leave : 离开安全模式
hdfs的shell命令使用
hdfs dfs - hdfs://hadoop01:9000/
hdfs dfs - /
hdfs dfs - : 列出所有可以使用shell命令
hadoop fs -ls /
上传文件或目录:
hdfs dfs -put /
下载文件:
hdfs dfs -get /words /home/111111
读取文件:
hdfs dfs -cat /words
hdfs dfs -text /words (如读取的文件是压缩后的,并hadoop有对应解压源码,则会正常读取)
hdfs dfs -tail /words
hdfs dfs -tail -f /words
hdfs dfs -appendToFile /home/words /words
创建目录:
hdfs dfs -mkdir /test
hdfs dfs -mkdir -p /test/a1/a2 递归创建
显示目录列表:
hdfs dfs -ls -R /test
hdfs dfs -lsr /test
创建文件:
hdfs dfs -touchz /test/111 创建空文件
修改权限:
hdfs dfs -chmod a=rwx /test/111
hdfs dfs -chmod 644 /test/111
hdfs dfs -chmod -R 644 /test
修改所属:
chown dfs -chown hdfs:hdfs /test/111
hdfs dfs -chown :root /test/111
hdfs dfs -chgrp root /test/111 和上一句等价
hdfs dfs -chgrp -R root /test 递归修改
复制:
hdfs dfs -cp /test/111 /test/a1/222
hdfs dfs -cp /out /test/outman 复制目录,并重命名
剪切重命名:
hdfs dfs -mv /test/111 /test/a1/333
上传:
hdfs dfs -put
hdfs dfs -copyFromLocal
hdfs dfs -copyFromLocal /home/words /test/
hdfs dfs -moveFromLocal
下载:
hdfs dfs -get
hdfs dfs -getmerge
hdfs dfs -getmerge /test/words /test/var.sh /home/merg
hdfs dfs -copytoLocal:
hdfs dfs -moveToLocal:
设置副本:
hdfs dfs -setrep 2 /test/var.sh
删除:
hdfs dfs -rm /test/outman 删除目录失败,需要-r
hdfs dfs -rmr /test/outman 递归删除命令
hdfs dfs -rm -r /test/outman
查找:
hdfs dfs -find ...
hdfs dfs -df
hdfs dfs -du
垃圾回收:
Hadoop回收站trash,默认是关闭的。
习惯了window的同学,建议最好还是把它提前开开,否则误操作的时候,就欲哭无泪了
1.修改conf/core-site.xml,增加
<property>
<name>fs.trash.interval</name>
<value>1440</value>
<description>Number of minutes between trash checkpoints.
If zero, the trash feature is disabled.
</description>
</property>
默认是0.单位分钟。这里我设置的是1天(60*24)
删除数据rm后,会将数据move到当前文件夹下的.Trash目录。如果想恢复,则需要.trash中的对应文件copy出来即可。