飞道的博客

入门级,Hadoop详情教程(一)

390人阅读  评论(0)

大数据简介

(1)概念
①无法在一定的时间内通过常规软件进行抓取,管理和处理的数据
②解决海量数据的存储和计算问题

(2)特性
数量大Volume,增长快Velocity,种类多Variety,价密低Value
(3)固有特性
时效性,不可变性
(4)分布式计算:
①传统分布式:
1)多数据节点-copy data->单计算节点 master
2)特点:数据量小,受限于单体计算节点CPU性能
3)提升方法:提升单体计算机的运算能力
②hadoop分布式:
1)都具有存储和运算功能节点-copy computed result from single node->汇总计算节点
2)特点:数据量大,受单体计算节点影响小
3)提升方法:扩展低成本集群

Hadoop

(1)概念
开源分布式计算框架
(2)hadoop生态圈

(3)为什么使用大数据?
①高扩展性:添加数据节点
②高可靠性:多个数据备份
③高容错性:失败任务重新分配
④低成本:允许部署在低价机器上
(4)普通关系型数据库和Hadoop的区别

Hadoop框架(1)

hdfs dfs命令

注意:在集群里面的任何一个节点执行 hdfs dfs -之类的命令,使用的是主节点或者从节点,否则使用的就是客户端,客户端是不包括在我们的hadoop集群中的
hdfs dfs -ls / 查看目录
hdfs dfs -du [-s] /dir_name 统计文件夹信息
hdfs dfs -mkdir /dir_name 创建目录
hdfs dfs -mkdir -p /dir_name1/dir_name2 创建多级目录
hdfs dfs -rmdir /dir_name1/dir_name2 删除目录,逐层删除

hdfs dfs -put ~/linux_dir/file_name /dir_name1/dir_name2 上传文件
hdfs dfs -get /dir_name1/dir_name2/hadoopfile_name ~/linux_dir 下载文件
hdfs dfs -getmerge /dir_name1/dir_name2/* ~/linux_dir/file_name 合并下载
hdfs dfs -rm /dir_name1/dir_name2/hadoopfile_name 删除文件
hdfs dfs -cat /dir_name1/dir_name2/hadoopfile_name 查看文件

HDFS分布式文件系统

hdfs 就是 hadoop file system 分布式文件系统,将数据存储在群集中的多个节点或机器上,并允许多个用户访问数据
hdfs中的重要组成:
对于主机:
NameNode 管理整个文件系统的元数据
SecondaryNameNode namenode的帮手,在出现特殊情况,帮助namenode恢复数据
JobHistoryServer 历史数据
对于从机:
DataNode 文件块block的存储管理节点
优缺点
1)支持超大文件:将文件切块,发送到不同节点上
2)心跳检测机制
3)复本高容错
4)高扩展性
6) 不适合低延时(毫秒以下)
7) 不适合大量小文件
8) 不支持并发写入、随机修改,只支持追加

YARN资源管理系统

yet another resource nigotiator
yarn是Hadoop框架中的一个资源管理系统,负责资源管理和调度
对于主机:
ResourceManager 处理客户端请求,负责整个集群的资源管理和调度
对于从机:
NodeManager 单个节点上的资源管理和任务管理
ApplicationMaster 为应用程序申请资源,进一步分配给内部任务汇总
Container 任务运行资源,动态资源划分单位,是根据应用程序的需求动态生成的

关于主机和从机的相关问题

1、DataNode 每1小时向NameNode汇报所有Block块信息
2、DataNode每3秒钟向NameNode发送一次心跳,心跳带回NameNodeDataNode的命令:如把某数据块复制到哪个节点备份
3、如10分钟没有收到某DataNode的心跳包,则认为不可用并移出集群,注意不是删除节点,集群在运行中可以安全添加或移除节点

读写数据


写入文件流程:
1、数据文件上传时候,需要划分成文件块block,默认大小为128MB
2、客户端向namenode发送写入申请
3、namenode在接收到客户端请求之后,对其进行验证,例如文件是否存在已经权限验证。通过验证之后,namenode通过与dataname的通信,包括节点的状态,磁盘空间,找到相对空闲的节点,将这些节点的地址放入队列返回给客户端。
4、客户端在收到能够写入的节点地址之后,依次将文件块block 写入对应节点上,注意这里再写入到datanode上时,有一个类似于传输管道的方式,因为不知道写完第一台从机,第二台从机是否能成功写入,那么文件块在访问了第一台之后
并不会写入文件,而是确定能写入,向下一个从机发出访问,直到最后一个节点;然后将文件块开始写入到一个bytebuffer 缓冲区中,完成应答,继续完成前面节点的文件写入。这里注意是,返回的空闲节点地址是随机的,即每个文件块不一定是在同一个节点之下。
5、客户端再写完之后,会向namenode 发送写完数据的信号,namenode 返回一个关闭文件的信号
读取文件流程:
1、客户端发起读取请求
2、namenode 会查询元数据,找到客户端请求读取的文件的存储位置对应的文件块的信息
3、namenode 将这些对应的文件块的节点地址放入队列返回给客户端
4、client会从队列中取出第一个数据块对应的节点地址,从这些节点地址中选择一个相对空闲的节点进行读取,并且对这个block进行验证,如果文件块损坏,那么client会从这个数据块对应的其他节点读取。其他数据块以此类推。
5、所有文件块读取完毕之后,会在这些对应的文件块的节点中运行一个Application Master程序,向资源调度器申请执行任务的资源容器Container,存储读取的所有文件块,并且向namenode发送读取完毕的信息,同时生成一个磁盘结果文件

MapReduce

概念:大数据的并行运算过程,拆分机制。

对于不同的分区来说,因为HashPartition的存在,就不可能存在相同的键,导致最后的生成的三个磁盘文件是不可能有重复键的,即一个键只出现在一个磁盘文件里,不出现在另一个磁盘文件里
mapreduce主要分为三大块:mapper、shuffle、reduce
mapper:
1、InputFormat以默认的Text类型读文件数据,inputSplit将文件切成相应文件分片(伪切割,实则是在整个文件中确定多个截取段,以换行符为分割点)
2、RecordReader方法依次读取文件分片的一行数据默认是字符串Text,包括行号key和行内容value,作为mapper的入口参数
3、map拿到参数之后,进行解析context.write根据不同业务(分词统计、不同类型统计)解析成新的(key,value)输出到OutPutCollector收集器
4、把收集到的(key,value)写入环形缓冲区,当环形缓冲区中的数据大小到达80%时,触发spill溢出(关于环形缓冲区:有一个“起点”,当数据写入达到80%时,触发spill开始溢出,同时,数据依然实在继续写入(当剩下的20%不够写入时,就等一会在写入)缓冲区,此时的新起点变成了达到80%的这个溢出点的“下标”)
5、溢出文件过大的话,将会分成几个个小文件,每个小文件里有分区,便于归并排序,在排序完成之后,将溢出的所有文件合并成一个大文件,且这个大文件带有分区,每个分区里有序。
6、如上图所示,此时每个节点上都是有一个带有分区的且有序的大文件,reduce task会将不同节点下的,同一个分区在进行一次归并排序,内容value按照key有序排列,shuffle的过程中有一个repatitioner过程
7、接下来是reduce逻辑运算过程。Reduer类,接收到缓存发送过来的数据后,会自动将key相同的数据进行分组运算,将他们的value都放入到重写的reduce方法的迭代器中,然后遍历该迭代器,就能拿到该key值的每个value值,将value进行累加,就能算出该key值所对应的value总数,然后用context.write输出新的以key为键,values为值的新的map,最终经过OutPutForemat方法将结果写入结果文件中。
8、一个job的具体工作流程

未完待续…


转载:https://blog.csdn.net/weixin_44147632/article/details/108111970
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场