Hadoop重点内容
1. 入门
- 大数据主要解决的是存储和计算问题
- 数据单位:bit、Byte、KB、MB、GB、TB、PB、EB、ZB、YB…
- 2006年,hadoop诞生
- Hadoop运行模式:本地模式,伪分布式模式,完全分布式模式
- 当namenode和datanode一直起不起来(或者起来一会就挂掉):
- 最可能的原因:格式化namenode的时候,没有删除data和log文件夹,这会导致namenode和datanode的clusterID不一致。
- 格式化namenode:
bin/hdfs namenode –format
- 一些端口:【版本:hadoop2.0】
- HDFS中namenode的地址:hdfs://hadoop102:9000
- secondarynamnode的地址:hadoop104:50090
- hdfs的web地址:hadop102:50070
- yarn的web地址:hadoop103:8088
- 历史服务器的web地址:hadoop102:19888
- 历史服务器的地址:hadoop102:10020
2. HDFS
-
hdfs的使用场景:适合一次写入,多次读出,且不支持并发写入、文件的修改
-
hdfs的文件在物理上是分块存储【Block】,块的大小可以通过配置参数(dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M
-
hdfs的shell操作:
- 从HDFS下载文件到本地:
hadoop fs -get /sanguo/shuguo/kongming.txt ./
- 从本地上传文件到HDFS:
hadoop fs -put ./zaiyiqi.txt /user/atguigu/test/
- 从HDFS下载文件到本地:
-
hdfs的客户端操作:
import org.apache.hadoop.fs.*; // 1 获取hdfs客户端对象 Configuration conf = new Configuration(); conf.set("dfs.replication", "2"); FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), conf, "sl"); // 2 执行上传API fs.copyFromLocalFile(new Path("D:/孙磊.txt"), new Path("/000.txt")); // 3 关闭资源 fs.close(); // 1 获取对象 Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), conf, "sl"); // 2 获取输入流 FileInputStream fis = new FileInputStream(new File("d:/banhua.txt")); // 3 获取输出流 FSDataOutputStream fos = fs.create(new Path("/banhua.txt")); // 4 流的对拷 IOUtils.copyBytes(fis, fos, conf); // 5 关闭资源 IOUtils.closeStream(fos); IOUtils.closeStream(fis); fs.close();
-
hdfs写数据流程:
- 客户端通过
Distributed FileSystem
模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。 - NameNode返回是否可以上传。
- 客户端请求第一个 Block上传到哪几个DataNode服务器上。
- NameNode返回3个DataNode节点,分别为dn1、dn2、dn3,表示采用这三个节点存储数据
- 客户端通过
FSDataOutputStream
模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。 - dn1、dn2、dn3逐级应答客户端。
- 客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
- 当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。
- 客户端通过
-
在hdfs写数据的过程中,NameNode会选择距离待上传数据最近距离的DataNode接收数据。那么这个最近距离怎么计算呢?
- 节点距离:两个节点到达最近的共同祖先的距离总和。
-
hdfs读数据流程:
- 客户端通过
Distributed FileSystem
向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。 - 挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
- DataNode开始**传输数据给客户端(**从磁盘里面读取数据输入流,以Packet为单位来做校验)。
- 客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。
- 客户端通过
-
namenode中的元数据是存储在哪里的?
- 假设存在硬盘,因为经常需要访问,那效率就会很低,因此,应该将元数据存储在内存中,但是这样也会产生一个问题,如果断电或者宕机,元数据就会丢失,因此,就有了在磁盘中备份元数据的FsImage,这样仍然有一个问题,当元数据更新的时候,如果同时更新FsImage,就会导致效率过低,因此,又引入了Edits文件(只进行追加操作),每当元数据有更新或者添加元数据的时候,修改内存中的元数据并且追加到Edits文件中。这样,一旦namenode断电,可以通过FsImage和Edits的合并,合成元数据,但是如果长时间添加数据到Edits中,会导致文件过大,效率变低,因此,需要定期进行FsImage和Edits的合并,如果这个操作由namenode来完成,效率过低,因此,引入一个新的节点,secondarynamenode,专门用于FsImage和Edits的合并
- FsImage文件:
- hdfs文件系统元数据的一个永久性的检查点
- Edits文件:
- 存放hdfs的所有更新操作的路径
- 每次namenode启动的时候都会将FsImage文件读入内存,加载Edits的操作,保证内存中的元数据是同步的、最新的,可以看成namenode的启动就将FsImage和Edits文件进行了合并。
-
集群安全模式:
- 当集群处于安全模式,不能执行重要操作(写操作)。当集群启动完成后,自动退出安全模式
- 基本语法:
bin/hdfs dfsadmin -safemode get/enter/leave/wait
-
datanode工作机制:
一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
- DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息。
- 心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。
-
datanode保证数据完整性的方法:
- 当DataNode读取Block的时候,它会计算CheckSum(校验和)
- 如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏。
- Client读取其他DataNode上的Block。
- DataNode在其文件创建后周期验证CheckSum
-
datanode进程死亡或者网络故障造成datanode无法与namenode通信,namenode不会立即把节点判定为死亡,要经过一段时间,该时间称为超时时长
- HDFS默认的超时时长为10分钟+30秒
-
服役新数据节点:克隆+简单配置即可
-
退役旧数据节点
- 添加白名单:在白名单内的节点,都允许访问namenode,不在的,都会被退出
- 黑名单退役:在黑名单上面的主机都会被强制退出。
-
DataNode也可以配置成多个目录,每个目录存储的数据不一样。即:数据不是副本
-
小文件归档:这是其中一种解决小文件过多的方法,
# 把/user/atguigu/input目录里面的所有文件归档成一个叫input.har的归档文件,并把归档后文件存储到/user/atguigu/output路径下。 bin/hadoop archive -archiveName input.har –p /user/atguigu/input /user/atguigu/output # 查看归档 hadoop fs -lsr /user/atguigu/output/input.har hadoop fs -lsr har:///user/atguigu/output/input.har # 解归档文件 hadoop fs -cp har:/// user/atguigu/output/input.har/* /user/atguigu