四、hadoop之HDFS
4.1HDFS的定义
HDFS定义:分布式文件系统
HDFS使用场景:一次写入,多次读写
4.2HDFS的优缺点
优点:
1)高容错性
(1)数据自动保存多个副本
(2)某个副本丢失后,可以自动恢复
2)适合处理大数据
(1)数据规模:能够处理GB 、TB甚至PB级别的数据
(2)文件规模:能够处理百万规模以上的文件数量
3)可构建在廉价机上,通过多副本机制,提高可靠性
缺点:
1)不适合低延时数据访问,比如毫秒级的存储数据
2)无法高效性的对大量小文件存储
(1)小文件的寻址时间会超过读取时间
(2)大量的小文件会占用namenode的内存来存储目录和块信息
3)不支持并发写入、文件随机修改。
(1)一个文件只能一个写,不能多个线程同时写
(2)仅支持数据追加,不支持文件随机修改
4.3HDFS的架构
HDFS存储文件时以块为单位
1)NameNode(nn): 即Master,它为集群的主管
(1)管理HDFS的命名空间
(2)配置副本策略
(3)管理数据块映射信息
(4)处理客户端的读写请求
2)DataNode(dn):即slave,执行namenode的命令
(1)存储实际数据块
(2)执行数据块的读写操作
3)client:客户端
(1)文件切分
(2)与namenode交互,获取文件的位置信息
(3)与DataNode交互,读取或写入数据
(4)提供一些命令来管理HDFS
(5)可以通过一些命令访问hdfs,如增删改查
4)Secondary NameNode:不是NameNode的热备,
4.4HDFS文件的大小
HDFS中存储块的大小可以通过配置dfs.blocksize来实现,默认128M。
寻址时间应为读取时间的1%。
4.5 HDFS的Shell操作
1)命令hadoop fs 或hdfs dfs
2)命令分类
(1)本地-> HDFS
put 上传
copyFromLocal 上传(同put)
moveFromLocal 剪切
appendToFile 追加
(2)HDFS->HDFS (同linux命令)
cp hadoop fs -cp /test /test2
mv
chown
chgrp
chmod
mkdir
du hadoop fs -du -h
df hadoop fs -df -h
cat
(3)HFDS->本地
get 下载
getmerge 合拼下载
copyToLocal 同(get)
4.6HDFS的数据流
1.HDFS写入、上传流程
1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。
2)NameNode返回是否可以上传。
3)客户端请求第一个 Block上传到哪几个DataNode服务器上。
4)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。
5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
6)dn1、dn2、dn3逐级应答客户端。
7)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
8)当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。
2.写入DataNode的选择
1)在HDFS写数据的过程中,NameNode会选择距离待上传数据最近距离的DataNode接收数据。
节点距离:两个节点到达最近的共同祖先的距离总和
算node节点的距离
2)机架感知(副本存储节点选择)
3.HDFS读取、下载流程
1)客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。
4.7NameNode和SecondaryNameNode
1)nn与2nn的工作机制
Fsimage 内存存档(保留最新两份)
Edits 操作记录(存档后的操作)(不删除)
集群启动时nn加载(存档)fsimage,操作前先记录edits,期间2nn用于合并FsImage和Edits。
1. 第一阶段:NameNode启动
(1)第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
(2)客户端对元数据进行增删改的请求。
(3)NameNode记录操作日志,更新滚动日志。
(4)NameNode在内存中对元数据进行增删改。
2. 第二阶段:Secondary NameNode工作
(1)Secondary NameNode询问NameNode是否需要CheckPoint。直接带回NameNode是否检查结果。
(2)Secondary NameNode请求执行CheckPoint。
(3)NameNode滚动正在写的Edits日志。
(4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。
(5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
(6)生成新的镜像文件fsimage.chkpoint。
(7)拷贝fsimage.chkpoint到NameNode。
(8)NameNode将fsimage.chkpoint重新命名成fsimage。
4.8DataNode介绍
(1) 一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
DataNode的工作机制为下图:
(2)掉线时限设置
需要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的单位为毫秒,dfs.heartbeat.interval的单位为秒。
Timeout = 2*dfs.namenode.heartbeat.recheck-interval+10*dfs.heartbeat.interval
dfs.namenode.heartbeat.recheck-interval默认5分钟,dfs.heartbeat.interval默认30秒
(3)数据完整性
1)当DataNode读取Block的时候,它会计算CheckSum。
2)如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏。
3)Client读取其他DataNode上的Block。
4)DataNode在其文件创建后周期验证CheckSum
4.9 服役新数据节点
当数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有集群基础上动态添加新的数据节点。
1.环境准备
(1)发送已配置hadoop到新机器
(2)修改IP地址和主机名称
(3)删除原来HDFS文件系统留存的文件
(4)配置环境变量
(5)启动单节点DataNode
4.10退役旧数据节点
1.白名单退役
添加到白名单的主机节点,都允许访问NameNode,不在白名单的主机节点,都会被退出
(1)进入主机的配置文件目录,目录下创建writerklist文件
(2)编辑该文件,添加要需要的主机名
(3)在NameNode的hdfs-site.xml配置文件中增加dfs.hosts属性
<property>
<name>dfs.hosts</name>
<value>/opt/app/hadoop-2.7.2/etc/hadoop/dfs.hosts</value>
</property>
(4)配置文件分发
(5)刷新NameNode、刷新ResourceManager
hdfs dfsadmin -refreshNodes
yarn rmadmin -refreshNodes
2.黑名单退役
(6)进入主机的配置文件目录,目录下创建blacklist文件
(7)编辑该文件,添加要退役的主机名
(8)在NameNode的hdfs-site.xml配置文件中增加dfs.hosts.exclude属性
<property>
<name>dfs.hosts.exclude</name>
<value>/opt/app/hadoop-2.7.2/etc/hadoop/blacklist</value>
</property>
(4)刷新NameNode、刷新ResourceManager
hdfs dfsadmin -refreshNodes
yarn rmadmin -refreshNodes
4.11Datanode多目录配置
1. DataNode也可以配置成多个目录,每个目录存储的数据不一样。即:数据不是副本
2.具体配置如下
hdfs-site.xml
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///${hadoop.tmp.dir}/dfs/data1,file:///${hadoop.tmp.dir}/dfs/data2</value>
</property>
4.12小文件存档
(1)需要启动YARN进程
(2)归档文件
把/user/input目录里面的所有文件归档成一个叫input.har的归档文件,并把归档后文件存储到/user/output路径下
bin/hadoop archive -archiveName input.har –p /user/input /user/output
(3)查看归档
hadoop fs -lsr /user/output/input.har
hadoop fs -lsr har:///user/output/input.har
(4)解归档文件
hadoop fs -cp har:/// user/output/input.har/* /user
五、hadoop之MapReduce
5.1MapReduce定义
MapReduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架。
MapReduce的核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个hadoop集群。
5.2MapReduce的优缺点
(1)优点
1.易于编程
2.良好的扩展性
3.高容错性
4.适合大数据的离线处理
(2)缺点
1.不擅长实时计算
2.不擅长流式计算
3.不擅长DAG(有向图)计算
5.3MapReduce核心思想
Map:把数据映射为想要的形式
Reduce:合并
5.4MapReduce进程
(1)MrAppMaster负责整个程序的过程调度及状态协调
(2)MapTask 负责map阶段的整个数据处理流程
(3)Reduce Task负责reduce阶段的整个数据处理流程
5.5hadoop序列化
序列化:把内存中的对象,转化成字节序列,以便存储到磁盘(持久化)和网络传输
反序列化:磁盘持久化数据转化为内存中的对象
Hadoop序列化Writable优点:
(1)紧凑:高效的使用存储空间
(2)快速:读写数据的额外开销小
(3)可扩展:随着通讯协议升级可以升级
(4)互相操:支持多语言的交互
5.6MapReduce框架原理
(1)InputFormat数据输入
数据块:Block是HDFS物理上把数据分成一块一块。
数据切片:数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储。
Maptask并行度由切片数据数据量决定,InputFormat进行切片,切片考虑文件而不整体。
(2)Shuffle机制
Map方法之后,Reduce方法之前的数据处理过程称之为Shuffle
(3)OutputFormat数据输出
数据最终处理:从(k,v)到数据输出。
默认格式为TextOutputFormat