三、HDFS
1.使用场景:一次写入多次读出
2.优点:高容错、适合处理大数据、可构建于廉价机器
-
缺点:不适合低延时数据访问、无法高效的对大量文件进行存储、不支持并发写入
3.NameNode、DataNode、Client、Secondery NameNode
4.hdfs分块储存(Block),为128M,寻址时间为传输时间的1%,磁盘速率为100MB/s(速率影响)
-
块太小会增加寻址时间、太大会放慢处理文件速度
5.命令:
-
上传:hadoop fs -moveFromLocal、-copyFromLocal、-put、-appendToFile
-
下载:-copyToLocal、-get
-
一般:-ls、-cat、-chmod、-chown、、、-rm -r、-du、-setrep、、
6.API:(需要配置环境变量、再配置xml文件、设置用户名(VM Options:))
-
文件上传:
-
获取文件系统 --FileSystem.get(new URI(namenode地址,参数配置,用户)
-
上传文件--fs.copyFromLocatFile(new Path("***"),new Path("***"))
-
关闭资源--fs.close
-
文件下载:
-
下载文件--fs.copyToLocalFile(原文删除,原文路径,目标路径,开启文件校验)--文件校验(验证文件完整性)
7.设置备份数量参数(优先级):
-
客户端---代码
-
客户端---配置文件
-
服务器端----xxx-site.xml
-
服务器端----xxx-default.xml
-
客户端操作:代码 > 客户端---配置文件 > 服务器端默认配置xxx-default.xml
-
服务器操作:xxx-site.xml > 服务器端----xxx-default.xml
8.给main方法传参:
-
idea:Program Arguments:参数1 参数2 ......
-
命令:java 字节码文件名 参数1 参数2 .......
-
jar包:hadoop jar xxx.jar 类的全类名 参数1 参数2 参数3 ......
9.HDFS写流程:packet(chunk+chunksum)
-
客户端--->namenode(返回节点位置)
-
客户端--->datannode1:传第一个块
-
datanode1--->datanode2
-
datanode2--->datanode3
-
第二个块。。。循环
10.节点距离:连个节点到达最近的共同祖先的距离总和
-
namenode会选择最近距离datanode接收数据
-
副本节点选择:
-
第一个副本在Client所处节点上,若客户端在集群外,随机选一个
-
第二个副本在另一个机架的随机一个节点
-
第三个副本在第二个副本所处机架的随机节点
10.HDFS读流程:
-
客户端--->namenode(返回节点位置)
-
客户端--->datanode:返回第一个packet
-
第二块。。。循环
11.nn--2nn工作机制
-
启动nn,加载edits和fsimage到内存
-
client的请求,记录到edits_inrogress,再转为edits发送到2nn
-
2nn将全部edits加载到内存,2nn触发checkpoint(默认时间1h、数量100w)
-
将edits转为fsimage,并将fsimage发送到nn
12.fsimage、edits
-
fsimage:包含所有信息
-
edits:包含指令
-
查看fsimage( current路径下):hdfs oiv -p 文件类型 -i镜像文件 -o 转换后文件输出路径
-
查看edits:hdfs oev -p 文件类型 -i编辑日志 -o 转换后文件输出路径
13.datanode工作机制:
-
datanode存储着数据本身和元数据(数据块长度、校验和、时间戳)
-
datanode每6小时向namenode上报块信息
-
datanode3秒一次心跳,namenode收到并返回命令,若10分30秒nn未收到心跳,则认为该节点不可用
14.数完整性
-
datanode读取block时,会计算checksum
-
若与创建是不同,则判断为数据损坏,会周期性验证
-
常见校验算法有:crc,md5,sha1