Hadoop入门一
大数据简介
(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
发送一次心跳,心跳带回NameNode
给DataNode
的命令:如把某数据块复制到哪个节点备份
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
的具体工作流程
未完待续…