大数据入门必备
一、hadoop基本介绍:
hadoop分布式文件系统。是hadoop的核心组件之一,作为最底层的分布式服务而存在。
hadoop具体来说包含两个集群:hdfs集群yarn集群。
hdfs集群主要负责海量数据存储
yarn集群主要负责海量数据运算时的资源调度
二、hdsf的设计目标:
1、故障检测和自动快速恢复。
2、数据访问的高吞吐量。
3、支持大文件。
4、write-one-read-many。
5、移动计算的代价比移动数据的代价低。
6、异构的硬件平台和软件平台上的可移植性。
三、hdfs的重要特性:
hdfs采用master/slave的架构;一般是有一个NameNode(主节点)和多个DataNode(从节点)组成。
1、nameNode的元数据管理:目录结构和文件内容分块信息的管理
2、dataNode的数据存储:文件的各个block块的管理,DataNode需要定时向NameNode汇报管理的block的信息(默认六个小时汇报一次)
3、副本机制:为了容错,所有的block都会有副本
4、一次写入多次读出:不支持文件的修改
四、hdfs的基本shell操作:
1、hadoop fs -ls <path> 查看指定路径下的目录结构
2、hadoop fs -du <path> 统计目录下的文件大小
3、hadoop fs -count <path> 统计文件(文件夹)数量
4、hadoop fs -mv <源PATH> <目标PATH> 移动
5、hadoop fs -cp <源PATH> <目标PATH> 复制
6、hadoop fs -rm <path> 删除文件/空白文件夹
7、hadoop fs -rmr <path> 递归删除文件/文件夹
8、hadoop fs -put <源PATH> <目标PATH> 上传文件
9、hadoop fs -cat <path> 查看文件内容
10、hadoop fs -setrep -w <sum> <path> 修改文件的副本数
五、hdfs写数据流程【重点】
1、client通过RPC向nameNode发起文件上传请求;nameNode检查是否可以上传(文件或者文件的父目录是否存在)
2、client请求第一个block应该传输到哪些datanode
3、namenode返回可用的datanode地址
4、client请求其中的datanode建立连接(建立pipeline),该datanode再依调用其他datanode节点,pipeline建立成功后逐级返回client
5、client以packet为单位向第一个datanode发送数据,第一个datanode收到请求还会依次向下发送给其他的DataNode,每传一个packet会放入到等待应答队列
6、数据被封装成一个个packet在pipeline上依次传输,pipeline的反方向依次的返回ack响应,最终由pipeline中的第一个datanode返回给client
7、当第一个block完成后client再请求namenode上传第二个block到服务器</path></sum></path></path></path></path></path></path>
六、hdfs读数据流程【重点】
1、client向namenode发送请求获取block的所在位置
2、namenode会返回带有block的datanode的地址
3、namenode将datanode的地址根据网路拓扑结构进行排序
4、client选取排序靠前的datanode来获取数据
5、建立Socket Stream将当前的block的数据读取完毕
6、读取完列表的block之后,若文件读取还没结束,客户端会向namenode请求下一批block
七、MapReduce框架结构及编程规范
1、框架结构:一个mapreduce分布程序在分布式运行时有三类实例进程
MRAppMaster:负责整个程序过程的调度及状态协调
MapTask:负责map接断整个数据处理流程
ReduceTask:负责Reduce阶段整个数据处理流程
2、编程规范
用户编写的程序分成三个部分:Mapper、Reducer、Driver(提交mr程序的客户端)
mapper的输入输出数据均是<key,value>,mapper的业务逻辑写在map()方法中;map()方法对每个<key,value>调用一次
reducer的输入类型是mapper的输出类型,reducer的业务逻辑卸载reducer()中,ReducerTask对每一组key相同的<key,value>调用一次reduce()方法
用户自定义的Mapper和Reducer都要继承各自的父类
整个程序需要一个Driver来进行提交,提交的是一个描述了各种必要信息的job对象
8、MapReduce处理流程解析【重要】
Mapper执行任务过程:
1、第一阶段:将输入目录下的文件按照一定的标准进行逻辑切片,默认情况下,Split.size=Block size;每一个切片由一个MapTask处理
2、第二阶段:将切片中的数据解析成<key,value>对;默认是把每一行文本解析成键值对;key是每一行的起始位置,value是每一行的文本内容(TaskInputFormat)
3、第三阶段:调用Mapper中的map方法;上阶段的每解析出来的<key,value>调用一次map方***输出0或者多个键值对
4、第四阶段:对第三阶段输出的键值对进行分区,默认只有一个分区;分区的数量就是Reducer任务运行的数量
5、第五个阶段:对每个分区中的键值对进行排序
6、第六阶段:对数据进行局部的聚合处理,combiner处理,键相等的键值对会调用一次reduce方法
Reducer执行任务过程:
1、第一阶段:Reducer任务会主动复制多个Mapper任务的输出
2、第二阶段:将复制的数据在本地进行合并,合并成一个大的数据;再对合并后的数据进行排序
3、第三阶段:对排序后的键值对调用reduce方法,键相等的键值对调用一次reduce方法,每次调用会产生零到多个键值对
八、Hadoop的shuffle流程
suffle分为map端的和reduce端
map端的suffle:
map端会处理输入数据并产生中间结果写入到磁盘,每个map的输出会先写到内存缓存区中,当写入的数据达到指定的阀值之后,系统启动一个线程将缓冲区中的数据写入到磁盘,这个过程叫spill,每个map任务可能产生多个spill文件,在map任务完成之前用多路合并算法将多个文件合并成一个,map端的suffle就结束了
reduce端的suffle
copy阶段:将map阶段产生的文件copy到reduce端【只拷贝与自己对应的partition中的数据】,大小超过阀值写入到磁盘否则存在内存当中
merge阶段:在copy数据的同时,reduce启动了两条线程用来合并文件,防止内存使用过多或者磁盘中文件过多
sort阶段:map在写文件之前已经进行了局部排序,reduce函数时通过key来聚集数据,为了使相同的key聚集到一起采用了排序的策略,map端已经进行了局部排序,因此reduce只需要对取到数据进行一次归并排序即可
reduce阶段:reduce函数将计算结果写到hdfs上