Hadoop大数据技术课程总结2021-2022学年第1学期
Posted IT从业者张某某
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop大数据技术课程总结2021-2022学年第1学期相关的知识,希望对你有一定的参考价值。
Hadoop大数据技术课程总结
1.大数据概述
1.1大数据时代的4V
数据量大Volume
第一个特征是数据量大。大数据的起始计量单位可以达到P(1000个T)、E(100万个T)或Z(10亿个T)级别。
类型繁多(Variety)
第二个特征是数据类型繁多。包括网络日志、音频、视频、图片、地理位置信息等等,多类型的数据对数据的处理能力提出了更高的要求。
价值密度低(Value)
第三个特征是数据价值密度相对较低。如随着物联网的广泛应用,信息感知无处不在,信息海量,但价值密度较低,如何通过强大的机器算法更迅速地完成数据的价值"提纯",是大数据时代亟待解决的难题。
速度快、时效高(Velocity)
第四个特征是处理速度快,时效性要求高。这是大数据区分于传统数据挖掘最显著的特征。既有的技术架构和路线,已经无法高效处理如此海量的数据,而对于相关组织来说,如果投入巨大采集的信息无法通过及时处理反馈有效信息,那将是得不偿失的。可以说,大数据时代对人类的数据驾驭能力提出了新的挑战,也为人们获得更为深刻、全面的洞察能力提供了前所未有的空间与潜力。
1.2大数据时代的三次浪潮
第一波浪潮
第一波浪潮起源于90年代,当时从计算机到软件大多还是企业级的,而数据分析就已经开始,这个时代也还是集中式软件时代,存储数据的成本也非常昂贵,所以大部分企业以KPI角度,抽取少量结构化数据,采取特定数据。代表企业如MicroStrategy、Microsoft、Oracle,代表产品诸如Sybase、Congos。这个时代能产生的数据有限,能处理数据的能力有限。
第二波浪潮
发展到2000年左右,互联网的兴起,带动了计算机和软件从工具型走向消费级,由于互联网基础设施的发展,以下三点带来了数据的爆发式增长。1) 网络带宽的升级优化,从2g到4g,从拨号上网到光纤入户。2) 围绕互联网信息化带来大量的数据产生,如门户网站,社交平台,内容和视频平台等。3) 科技发展,从PC到移动设备到各种智能设备,都可以采集传输数据。数据的存储成本越来越低,数据的产生速度越来越快,数据量越来越大,第一波浪潮时的技术体系无法满足需求,并且由于摩尔定律基础硬件设备和条件也在优化,处理数据的能力越来越强,此时带来了大数据平台第二波浪潮的发展:
第三波浪潮
发展到2010左右,互联网发展从信息化走向了服务化,创业方向也从之前的“门户时代”、“社交时代”,“垂直化门户时代”,“内容视频时代”走向了电商、 出行、外卖、O2O等本地服务。如果说面向信息化的时代更多的是基于流量广告等商业模式,面向服务化时代更多的是直接面对客户价值的变现商业模式,或者说 消费者服务,所以从行业发展来看,服务类对分析的需求也要旺盛很多。我们可以用破木桶蓄水过程来类比,到处都是水源的时候,并且外部水源流入率大于自身流失率的时候,更多的思考的是抓紧圈水源而不是找短板。从2000年到2014年,流量势头猛进,到处都是用户,对于企业而言更多的思考是如何圈用户,而不是如何留住用户并去分析流失原因。当外部没有更多水源进入并且四处水源有限的时候,我们需要的是尽可能修复木桶,并且找到木桶的短板。在2014到2015年之间,互联网流量红利也初现消退 之势,国内的经济下行压力也逐渐增大,就好比水源有限一样,企业更多的需要分析自身原因了,去提高各种转化率,增加用户的忠诚度和黏性,减少用户的流失。 因此分析需求开始逐步提升,各个业务部门也都需要自我分析优化成本,提高产出和利润。过去企业更多面临的是由上而下的KPI中心化式分析,形成了分析中心化体系,基本上整个公司有统一关注的指标和数据看板,但是各业务部门的分析需要单独处理。数据分析从行业、角色、部门和场景而言,都是差异化的。比如行业上,电商关注的是购买相关指标,内容关注的是阅读相关指标,社交关注的是参与度相关指标,工 具关注的是功能使用情况。角色上,CEO关注的是整体、财务各部门的KPI;市场VP关注的是营销相关的子项目KPI;销售VP关注的是销售阶段状态和结果相关的指标;如部门上,市场关注的是投放转化率等指标;产品关注的是功能留存率等指标。如果要更充分的满足分析需求,需要从KPI中心化分析转向分析去 中心化,也就面临着又一次大数据平台的技术革新,也因此推动了大数据平台第三波浪潮的变革。
1.3大数据时代的技术支撑
虚拟化和云计算技术
美国国家标准技术研究所认为,云计算是通过网络使得一组可配置的计算资源(例如网 络、计算机、存储、应用程序、服务等)能够在任何地点进行访问的模型,资源的提供和 释放可以快速完成,管理开销低,与提供商的交互简便易行。
云计算的关键技术有三大点:⑴虚拟化技术:云计算的虚拟化技术不同于传统的单一虚拟化,它是涵盖整个IT架构的,包括资 源、网络、应用和桌面在内的全系统虚拟化。⑵分布式资源管理技术:信息系统仿真系统在大多数情况下会处在多节点并发执行环境中,要保证 系统状态的正确性,必须保证分布数据的一致性。⑶并行编程技术:云计算采用并行编程模式。在并行编程模式下,并发处理、容错、数据分布、负 载均衡等细节都被抽象到一个函数库中,通过统一接口,用户大尺度的计算任务被自动并发和分布 执行,即将一个任务自动分成多个子任务,并行地处理海量数据。
基于分布式的Hadoop生态系统
分布式计算的产生:单台计算机的能力是有限的,而需要处理的问题规模在不断地增长。为此,人们开始探索用多台计 算机组成一个系统进行协同处理。因此遇到很多新问题: 网络带宽有限 当部分机器出现故障时,我们希望多机系统作为一个整体还能正常工作用户编写的程序要同时在不同的机器上运行,还要确保能够容易使用分布式计算就是为了解决这些问题而出现的。Hadoop生态系统:主流的开源分布式大数据处理软件,主要用Java语言编写,具有较好的平台移植性。关于Hadoop有几个概念需要理解清楚: HDFS 是Hadoop的分布式文件系统 MapReduce是Hadoop的一代计算资源管理和调度系统。YARN是Hadoop的二代计算资源管理和调度系统,接受任务请求,并根据请求的需要来分配 资源,调度任务的执行。除了可以执行MapReduce外,还可以执行MPI等传统并行程序。HBase是一个开源的非关系型分布式数据库(NoSQL),它参考了谷歌的BigTable建模,实 现的编程语言为 Java。它是Hadoop项目的一部分,运行于HDFS文件系统之上。Hive和Pig能让用户用较为简便的方式来查询保存在HDFS或HBase中的数据。 Mahout是用Hadoop实现的机器学习算法库,包括聚类、分类、推荐,以及线性代数中的一 些常用算法。 Spark是比MapReduce更丰富灵活的计算框架,由Scala语言编写。设计核心是一种叫做可靠 分布式数据集。
NoSQL
NoSQL数据库比SQL更满足Web应用对数据规模和读写性能的要求。 常见的NoSQL数据库大致可分为以下几类:基于列的存储,例如HBase、Cassandra等等 基于文档的存储,例如MongoDB、CouchDB等 键值对存储,分三种类型:
1.4谷歌的3篇论文
GFS :分布式文件系统
MapReduce :分布式计算引擎
BigTable :分布式列族数据库
1.5Hadoop集群规模
注意:本部分数据来源于网络,数据时间较久,但也足以说明问题。
1.百度
百度在2006年就开始关注Hadoop并开始调研和使用,在2012年其总的集群规模达到近十个。单集群超过2800台机器节点,Hadoop机器总数有上万台机器,总的存储容量超过100PB,已经使用的超过74PB,每天提交的作业数目有数千个之多,每天的输入数据量已经超过7500TB,输出超过1700TB。
百度的Hadoop集群为整个公司的数据团队、大搜索团队、社区产品团队、广告团队,以及LBS团体提供统一的计算和存储服务,主要应用包括:
数据挖掘与分析
日志分析平台
数据仓库系统
推荐引擎系统
用户行为分析系统
同时百度在Hadoop的基础上还开发了自己的日志分析平台、数据仓库系统,以及统一的C++编程接口,并对Hadoop进行深度改造,开发了HadoopC++扩展HCE系统。
2.阿里巴巴(旧的数据,现在已转而使用阿里云了)
阿里巴巴的Hadoop集群截至2012年大约有3200台服务器,大约30?000物理CPU核心,总内存100TB,总的存储容量超过60PB,每天的作业数目超过150?000个,每天hivequery查询大于6000个,每天扫描数据量约为7.5PB,每天扫描文件数约为4亿,存储利用率大约为80%,CPU利用率平均为65%,峰值可以达到80%。阿里巴巴的Hadoop集群拥有150个用户组、4500个集群用户,为淘宝、天猫、一淘、聚划算、CBU、支付宝提供底层的基础计算和存储服务,主要应用包括:
数据平台系统
搜索支撑
广告系统
数据魔方
量子统计
淘数据
推荐引擎系统
搜索排行榜
为了便于开发,其还开发了WebIDE继承开发环境,使用的相关系统包括:Hive、Pig、Mahout、Hbase等。
3.腾讯
腾讯也是使用Hadoop最早的中国互联网公司之一,截至2012年年底,腾讯的Hadoop集群机器总量超过5000台,最大单集群约为2000个节点,并利用Hadoop-Hive构建了自己的数据仓库系统TDW,同时还开发了自己的TDW-IDE基础开发环境。腾讯的Hadoop为腾讯各个产品线提供基础云计算和云存储服务,其支持以下产品:
腾讯社交广告平台。
搜搜(SOSO)。
拍拍网。
腾讯微博。
腾讯罗盘。
QQ会员。
腾讯游戏支撑。
QQ空间。
朋友网。
腾讯开放平台。
财付通。
手机QQ。
QQ音乐。
4.奇虎360
奇虎360主要使用Hadoop-HBase作为其搜索引擎so.com的底层网页存储架构系统,360搜索的网页可到千亿记录,数据量在PB级别。截至2012年年底,其HBase集群规模超过300节点,region个数大于10万个,使用的平台版本如下。
HBase版本:facebook0.89-fb。
HDFS版本:facebookHadoop-20。
奇虎360在Hadoop-HBase方面的工作主要为了优化减少HBase集群的启停时间,并优化减少RS异常退出后的恢复时间。
5.华为
华为公司也是Hadoop主要做出贡献的公司之一,排在Google和Cisco的前面,华为对Hadoop的HA方案,以及HBase领域有深入研究,并已经向业界推出了自己的基于Hadoop的大数据解决方案。
6.中国移动
中国移动于2010年5月正式推出大云BigCloud1.0,集群节点达到了1024。中国移动的大云基于Hadoop的MapReduce实现了分布式计算,并利用了HDFS来实现分布式存储,并开发了基于Hadoop的数据仓库系统HugeTable,并行数据挖掘工具集BC-PDM,以及并行数据抽取转化BC-ETL,对象存储系统BC-ONestd等系统,并开源了自己的BC-Hadoop版本。
中国移动主要在电信领域应用Hadoop,其规划的应用领域包括:
经分KPI集中运算。
经分系统ETL/DM。
结算系统。
信令系统。
云计算资源池系统。
物联网应用系统。
E-mail。
IDC服务等。
7.Facebook
Facebook使用Hadoop存储内部日志与多维数据,并以此作为报告、分析和机器学习的数据源。目前Hadoop集群的机器节点超过1400台,共计11200个核心CPU,超过15PB原始存储容量,每个商用机器节点配置了8核CPU,12TB数据存储,主要使用StreamingAPI和JavaAPI编程接口。Facebook同时在Hadoop基础上建立了一个名为Hive的高级数据仓库框架,Hive已经正式成为基于Hadoop的Apache一级项目。此外,还开发了HDFS上的FUSE实现。
1.6Hadoop安装过程
1)安装centos7或ubuntu16.04系统
2)修改 IP
3)修改 host 主机名
4)配置 SSH 免密码登录
5)关闭防火墙
6)安装 JDK
7)解压 hadoop 安装包
8)配置 hadoop 的核心文件 hadoop-env.sh,core-site.xml,mapred-site.xml,hdfs-site.xml
9)配置 hadoop 环境变量
10)格式化 hadoop namenode-format
11)启动节点 start-all.sh
2.HDFS专题
参考:
https://blog.csdn.net/weixin_38750084/article/details/82963235
https://www.cnblogs.com/codeOfLife/p/5375120.html
2.1 HDFS简介及作用
HDFS(Hadoop Distributed File System,Hadoop分布式文件系统),它是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,适合那些有着超大数据集(large data set)的应用程序。
HDFS的设计特点是:
1、大数据文件,非常适合上T级别的大文件或者一堆大数据文件的存储,如果文件只有几个G甚至更小就没啥意思了。
2、文件分块存储,HDFS会将一个完整的大文件平均分块存储到不同计算器上,它的意义在于读取文件时可以同时从多个主机取不同区块的文件,多主机读取比单主机读取效率要高得多得多。
3、流式数据访问,一次写入多次读写,这种模式跟传统文件不同,它不支持动态改变文件内容,而是要求让文件一次写入就不做变化,要变化也只能在文件末添加内容。
4、廉价硬件,HDFS可以应用在普通PC机上,这种机制能够让给一些公司用几十台廉价的计算机就可以撑起一个大数据集群。
5、硬件故障,HDFS认为所有计算机都可能会出问题,为了防止某个主机失效读取不到该主机的块文件,它将同一个文件块副本分配到其它某几个主机上,如果其中一台主机失效,可以迅速找另一块副本取文件。
重要特性:
1.HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,老版本中是64M
2.HDFS文件系统会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件
3.目录结构及文件分块信息(元数据)的管理由namenode节点承担——namenode是HDFS集群主节点,负责维护整个hdfs文件系统的目录树,以及每一个路径(文件)所对应的block块信息(block的id,及所在的datanode服务器)
4.文件的各个block的存储管理由datanode节点承担----datanode是HDFS集群从节点,每一个block都可以在多个datanode上存储多个副本(副本数量也可以通过参数设置dfs.replication)
5.HDFS是设计成适应一次写入,多次读出的场景,且不支持文件的修改
2.2 HDFS架构
先放上2张图:
2.3HDFS服务角色
Namenode
namenode又称为名称节点,是负责管理分布式文件系统的命名空间(Namespace),保存了两个核心的数据结构,即FsImage和EditLog。 你可以把它理解成大管家,它不负责存储具体的数据。
FsImage用于维护文件系统树以及文件树中所有的文件和文件夹的元数据
操作日志文件EditLog中记录了所有针对文件的创建、删除、重命名等操作
注意,这个两个都是文件,也会加载解析到内存中。
为啥会拆成两个呢? 主要是因为fsimage这个文件会很大的,多了之后就不好操作了,就拆分成两个。把后续增量的修改放到EditLog中, 一个FsImage和一个Editlog 进行合并会得到一个新的FsImage.FsImage就相当于你系统的引导区,如果FsImage坏了,那文件系统就崩溃了。 所以,这个重要的东西,需要备份。备份的功能就交给SecondaryNameNode实现
SecondaryNameNode
SecondaryNameNode工作过程
- SecondaryNameNode会定期和NameNode通信,请求其停止使用EditLog文件,暂时将新的写操作写到一个新的文件edit.new上来,这个操作是瞬间完成,上层写日志的函数完全感觉不到差别;
- SecondaryNameNode通过HTTP GET方式从NameNode上获取到FsImage和EditLog文件,并下载到本地的相应目录下;
- SecondaryNameNode将下载下来的FsImage载入到内存,然后一条一条地执行EditLog文件中的各项更新操作,使得内存中的FsImage保持最新;这个过程就是EditLog和FsImage文件合并;
- SecondaryNameNode执行完(3)操作之后,会通过post方式将新的FsImage文件发送到NameNode节点上
- NameNode将从SecondaryNameNode接收到的新的FsImage替换旧的FsImage文件,同时将edit.new替换EditLog文件,通过这个过程EditLog就变小了
DataNode
datanode数据节点,用来具体的存储文件,维护了blockId 与 datanode本地文件的映射。 需要不断的与namenode节点通信,来告知其自己的信息,方便nameode来管控整个系统。
这里还提到一个块的概念,就想linux本地文件系统中也有块的概念一样,这里也有块的概念。这里的块会默认是128m 每个块都会默认储存三份。
2.4 HDFS 如何读取文件
HDFS的文件读取原理,主要包括以下几个步骤:
- 首先调用FileSystem对象的open方法,其实获取的是一个DistributedFileSystem的实例。
- DistributedFileSystem通过RPC(远程过程调用)获得文件的第一批block的locations,同一block按照重复数会返回多个locations,这些locations按照hadoop拓扑结构排序,距离客户端近的排在前面。
- 前两步会返回一个FSDataInputStream对象,该对象会被封装成 DFSInputStream对象,DFSInputStream可以方便的管理datanode和namenode数据流。客户端调用read方法,DFSInputStream就会找出离客户端最近的datanode并连接datanode。
- 数据从datanode源源不断的流向客户端。
- 如果第一个block块的数据读完了,就会关闭指向第一个block块的datanode连接,接着读取下一个block块。这些操作对客户端来说是透明的,从客户端的角度来看只是读一个持续不断的流。
- 如果第一批block都读完了,DFSInputStream就会去namenode拿下一批blocks的location,然后继续读,如果所有的block块都读完,这时就会关闭掉所有的流。
2.5 HDFS 如何写文件
HDFS的文件写入原理,主要包括以下几个步骤:
- 客户端通过调用 DistributedFileSystem 的create方法,创建一个新的文件。
- DistributedFileSystem 通过 RPC(远程过程调用)调用 NameNode,去创建一个没有blocks关联的新文件。创建前,NameNode 会做各种校验,比如文件是否存在,客户端有无权限去创建等。如果校验通过,NameNode 就会记录下新文件,否则就会抛出IO异常。
- 前两步结束后会返回 FSDataOutputStream 的对象,和读文件的时候相似,FSDataOutputStream 被封装成 DFSOutputStream,DFSOutputStream 可以协调 NameNode和 DataNode。客户端开始写数据到DFSOutputStream,DFSOutputStream会把数据切成一个个小packet,然后排成队列 data queue。
- DataStreamer 会去处理接受 data queue,它先问询 NameNode 这个新的 block 最适合存储的在哪几个DataNode里,比如重复数是3,那么就找到3个最适合的 DataNode,把它们排成一个 pipeline。DataStreamer 把 packet 按队列输出到管道的第一个 DataNode 中,第一个 DataNode又把 packet 输出到第二个 DataNode 中,以此类推。
- DFSOutputStream 还有一个队列叫 ack queue,也是由 packet 组成,等待DataNode的收到响应,当pipeline中的所有DataNode都表示已经收到的时候,这时akc queue才会把对应的packet包移除掉。
- 客户端完成写数据后,调用close方法关闭写入流。
- DataStreamer 把剩余的包都刷到 pipeline 里,然后等待 ack 信息,收到最后一个 ack 后,通知 DataNode 把文件标示为已完成。
2.6HDFS 副本存放策略
namenode如何选择在哪个datanode 存储副本(replication)?
这里需要对可靠性、写入带宽和读取带宽进行权衡。Hadoop对datanode存储副本有自己的副本策略,在其发展过程中一共有两个版本的副本策略,分别如下所示
2.7HDFS基本命令
查看文件常用命令
hdfs dfs -ls path #查看文件列表
hdfs dfs -ls -R path #递归查看文件列表
hdfs dfs -du path #查看path下的磁盘情况,单位字节
创建文件夹
hdfs dfs -mkdir path
创建文件
hdfs dfs -touchz path
hdfs dfs -touchz /user/iron/iron.txt #该命令不可递归创建文件,即当该文件的上级目录不存在时无法创建该文件,如果重复创建会覆盖原有的内容
复制文件和目录
hdfs dfs -cp 源目录 目标目录
hdfs dfs -cp /user/iron /user/iron01 #该命令会将源目录的整个目录结构都复制到目标目录中
hdfs dfs -cp /user/iron/* /user/iron01 #该命令只会将源目录中的文件及其文件夹都复制到目标目录中
移动文件和目录
hdfs dfs -mv 源目录 目标目录
hdfs dfs -mv /user/iron /user/iron01
hdfs dfs -mv /user/aa.txt /user/bb.txt #将/user/aa.txt文件重命名为/user/bb.txt
赋予权限
hdfs dfs -chmod [权限参数][拥有者][:[组]] path
hdfs dfs -chmod 777 /user/* #该命令是将user目录下的所用文件及其文件夹(不包含子文件夹中的文件)赋予最高权限:读,写,执行 777表示该用户,该用户的同组用户,其他用户都具有最高权限
上传文件
hdfs dfs -put 源文件夹 目标文件夹
hdfs dfs -put /home/hadoop01/iron /user/iron01 #该命令上传Linux文件系统中iron整个文件夹
hdfs dfs -put /home/hadoop01/iron/* /user/iron01 #该命令上传Linux文件系统中iron文件夹中的所有文件(不包括文件夹)
下载文件
hdfs dfs -get 源文件夹 目标文件夹
hdfs dfs -get /user/iron01 /home/hadoop01/iron #该命令下载hdfs文件系统中的iron01整个文件夹到Linux文件系统中
hdfs dfs -get /user/iron01/* /home/hadoop01/iron #该命令下载hdfs文件系统中的iron01整个文件夹到Linux文件系统中(不包含文件夹)
查看文件内容
hadoop fs -cat path #从头查看这个文件
hadoop fs -tail path #从尾部查看最后1K
hadoop fs -cat /userjzl/home/book/aa.txt #查看/userjzl/home/book目录下文件aa.txt的内容(将-cat 换成-text效果一样)
hadoop fs -tail /userjzl/home/book/aa.txt
删除文件
hdfs dfs -rm 目标文件 #rm不可以删除文件夹
hdfs dfs -rm -R 目标文件 #递归删除(慎用)
hdfs dfs -rm /user/test.txt #删除test.txt文件
hdfs dfs -rm -R /user/testdir #递归删除testdir文件夹
3.MapReduce专题
参考:
https://blog.csdn.net/fanxin_i/article/details/80388221
https://www.cnblogs.com/cjsblog/p/8168642.html
https://www.cnblogs.com/cheng5350/p/11872221.html
MapReduce的基本模型和处理思想:
3.1.三个层面上的基本构思
1.如果对付大数据处理:分而治之
对相互之间不具有计算依赖关系的大数据,实现并行最自然的办法就是采取分而治之的策略。
2.上升到抽象模型:Mapper与Reduce
MPI等并行计算方法缺少高层并行编程模型,程序员需要自行指定存储,计算,分发等任务,为了克服这一缺陷,MapReduce借鉴了Lisp函数式语言中的思想,用Map和Reduce两个函数提供了高层的并发编程模型抽象。
3.上升到架构:统一架构,为程序员隐藏系统层细节
MPI等并行计算方法缺少统一的计算框架支持,程序员需要考虑数据存储、划分、分发、结果收集、错误恢复等诸多细节;为此,MapReduce设计并提供了同意的计算框架,为程序员隐藏了绝大多数系统层面的处理系统。
3.2.一个MapReduce的完整过程
在MapReduce整个过程可以概括为以下过程:
输入 --> map --> shuffle --> reduce -->输出
输入文件会被切分成多个块,每一块都有一个map task
map阶段的输出结果会先写到内存缓冲区,然后由缓冲区写到磁盘上。默认的缓冲区大小是100M,溢出的百分比是0.8,也就是说当缓冲区中达到80M的时候就会往磁盘上写。如果map计算完成后的中间结果没有达到80M,最终也是要写到磁盘上的,因为它最终还是要形成文件。那么,在往磁盘上写的时候会进行分区和排序。一个map的输出可能有多个这个的文件,这些文件最终会合并成一个,这就是这个map的输出文件。
流程说明如下:
1、输入文件分片,每一片都由一个MapTask来处理
2、Map输出的中间结果会先放在内存缓冲区中,这个缓冲区的大小默认是100M,当缓冲区中的内容达到80%时(80M)会将缓冲区的内容写到磁盘上。也就是说,一个map会输出一个或者多个这样的文件,如果一个map输出的全部内容没有超过限制,那么最终也会发生这个写磁盘的操作,只不过是写几次的问题。
3、从缓冲区写到磁盘的时候,会进行分区并排序,分区指的是某个key应该进入到哪个分区,同一分区中的key会进行排序,如果定义了Combiner的话,也会进行combine操作
4、如果一个map产生的中间结果存放到多个文件,那么这些文件最终会合并成一个文件,这个合并过程不会改变分区数量,只会减少文件数量。例如,假设分了3个区,4个文件,那么最终会合并成1个文件,3个区
5、以上只是一个map的输出,接下来进入reduce阶段
6、每个reducer对应一个ReduceTask,在真正开始reduce之前,先要从分区中抓取数据
7、相同的分区的数据会进入同一个reduce。这一步中会从所有map输出中抓取某一分区的数据,在抓取的过程中伴随着排序、合并。
8、reduce输出
3.3.MR的shuffle环节
在Map端的shuffle过程是对Map的结果进行分区、排序、分割,然后将属于同一划分(分区)的输出合并在一起并写在磁盘上,最终得到一个分区有序的文件,分区有序的含义是map输出的键值对按分区进行排列,具有相同partition值的键值对存储在一起,每个分区里面的键值对又按key值进行升序排列(默认),其流程大致如下:
Map的输出给进入Shuffle环节:Shuffle环节如下:
3.4.MR的编程
编程分析:
map任务处理:
读取输入文件内容,解析成key、value对。对输入文件的每一行,解析成key、value对。每一个键值对调用一次map函数。
写自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
对输出的key、value进行分区。
对不同分区的数据,按照key进行排序、分组。相同key的value放到一个集合中。
(可选)分组后的数据进行归约。
reduce任务处理:
对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。
对多个map任务的输出进行合并、排序。写reduce函数自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
把reduce的输出保存到文件中。
编程代码:
public class WordCount
//继承mapper接口,设置map的输入类型为<Object,Text>
//输出类型为<Text,IntWritable>
public static class Map extends Mapper<Object,Text,Text,IntWritable>
//one表示单词出现一次
private static IntWritable one = new IntWritable(1);
//word存储切下的单词
private Text word = new Text();
public void map(Object key,Text value,Context context) throws IOException,InterruptedException
//对输入的行切词
StringTokenizer st = new StringTokenizer(value.toString());
while(st.hasMoreTokens())
word.set(st.nextToken());//切下的单词存入word
context.write(word, one);
//继承reducer接口,设置reduce的输入类型<Text,IntWritable>
//输出类型为<Text,IntWritable>
public static class Reduce extends Reducer<Text,IntWritable,Text,IntWritable>
//result记录单词的频数
private static IntWritable result = new IntWritable();
public void reduce(Text key,Iterable<IntWritable> values,Context context) throws IOException,InterruptedException
int sum = 0;
//对获取的<key,value-list>计算value的和
for(IntWritable val:values)
sum += val.get();
//将频数设置到result
result.set(sum);
//收集结果
context.write(key, result);
/**
* @param args
*/
public static void main(String[] args) throws Exception
// TODO Auto-generated method stub
Configuration conf = new Configuration();
conf.set("mapred.job.tracker", "localhost:9001");
args = new String[]"hdfs://localhost:9000/user/hadoop/input/count_in","hdfs://localhost:9000/user/hadoop/output/count_out";
//检查运行命令
String[] otherArgs = new GenericOptionsParser(conf,args).getRemainingArgs();
if(otherArgs.length != 2)
System.err.println("Usage WordCount <int> <out>");
System.exit(2);
//配置作业名
Job job = new Job(conf,"word count");
//配置作业各个类
job.setJarByClass(WordCount.class);
job.setMapperClass(Map.class);
job.setCombinerClass(Reduce.class);
job.setReducerClass(Reduce.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
4.Yarn专题
参考:
https://blog.csdn.net/weixin_43930865/article/details/115708202
4.1.yarn简介
YARN 是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台。Spark、Storm 等运算框架都可以整合在 YARN 上运行,只要他们各自的框架中有符合 YARN 规范的资源请求机制即可
设计思想
YARN 的基本思想是将资源管理和作业调度/监控的功能拆分为单独的守护进程。这个想法是有一个全局 ResourceManager ( RM ) 和每个应用程序 ApplicationMaster ( AM )。应用程序是单个作业或作业的 DAG。
ResourceManager 和 NodeManager 构成了数据计算框架。ResourceManager 是在系统中的所有应用程序之间仲裁资源的最终权威。NodeManager 是每台机器的框架代理,负责容器、监控它们的资源使用情况(cpu、内存、磁盘、网络)并将其报告给 ResourceManager/Scheduler。
每个应用程序的 ApplicationMaster 实际上是一个特定于框架的库,其任务是协商来自 ResourceManager 的资源并与 NodeManager 一起执行和监视任务。
4.2.yarn架构与服务角色
架构图如下:
2.1ResourceManager
RM(ResourceManager)是 YARN 集群主控节点,负责协调和管理整个集群(所有 NodeManager)的资源。ResourceManager 会为每一个 Application 启动一个 AppMaster,并且 AppMaster 分散在各个 NodeManager 节点。
ResourceManager 的职责:
1、处理客户端请求,比如程序提交
2、启动或监控 MRAppMaster
3、监控 NodeManager健康状态
4、资源的分配与调度
ResourceManager 有两个主要组件:Scheduler 和 ApplicationsManager。
Scheduler 调度器负责根据熟悉的容量、队列等约束将资源分配给各种正在运行的应用程序。调度器是纯粹的调度器,因为它不执行应用程序的状态监控或跟踪。此外,它不保证由于应用程序故障或硬件故障而重新启动失败的任务。调度器根据应用程序的资源需求执行其调度功能;它是基于资源容器的抽象概念来实现的,该容器包含内存、CPU、磁盘、网络等元素。
2.2NodeManager
NodeManager 是 YARN 集群当中真正资源的提供者,是真正执行应用程序的容器的提供者,监控应用程序的资源使用情况(CPU,内存,硬盘,网络),并通过心跳向集群资源调度器ResourceManager 进行汇报以更新自己的健康状态。同时其也会监督 Container 的生命周期管理,监控每个 Container 的资源使用(内存、CPU 等)情况,追踪节点健康状况,管理日志和不同应用程序用到的附属服务(auxiliary service)。
2.3AppMaster
AppMaster对应一个应用程序,职责是:向YARN资源调度器申请执行任务的资源容器,运行任务,监控整个任务的执行,跟踪整个任务的状态,处理任务失败以异常情况
2.4Container容器
Container 容器是一个抽象出来的逻辑资源单位。容器是由 ResourceManager Scheduler 服务动态分配的资源构成,它包括了一个节点上的一定量 CPU,内存,磁盘,网络等信息,容器的大小是可以动态调整的,其最大大小就是一个nodemanger的资源,一个container只能在一个容器上。
4.3.Scheduler调度器
调度器根据应用程序的资源需求进行资源分配,不参与应用程序具体的执行和监控等工作,调度器会将总资源分为不同的队列供共享资源进行分配。资源分配的单位就是 Container,YARN 本身为我们提供了多种直接可用的调度器,比如 FIFO队列调度器,Fair 公平调度器和 Capacity 容量调度器等,可以在conf/yarn-site.xml 中配置调度器。
1.CapacityScheduler容量调度器
其中心思想是 Hadoop 集群中的可用资源在多个组织之间共享,这些组织根据其计算需求共同资助集群,为了保证集群总资源的安全和稳定性,CapacityScheduler提供了一组严格的限制,以确保单个应用程序或用户或队列不能在集群中消耗的资源的量不成比例。此外,CapacityScheduler对来自单个用户和队列的初始化和挂起的应用程序提供限制,以确保集群的公平性和稳定性。简单说就是当目前使用队列资源不够时,动态分配其他队列资源进行使用。参数配置指定调度器:yarn.resourcemanager.scheduler.class=指定挂起和运行最大程序个数:默认是10000:maximum-applications集群中程序最大可占用的运行资源:maximum-am-resource-percent默认是1-10%=90%的最大资源使用率,留10%给系统指定某用户的最大运行程序数:yarn.scheduler.capacity.user..max-parallel-apps 可以设置单个队列的资源占比,运行app任务数等。
2.Fair 公平调度器公平调度
是一种将资源分配给应用程序的方法,以便所有应用程序在一段时间内平均获得相等的资源份额。默认情况下,Fair Scheduler 仅基于内存进行调度公平性决策。简单来说就是对于两个程序抢夺同一资源时进行均分资源,保证都能得到一半。
3.FIFO Scheduler(先进先出调度器)
FIFO Scheduler把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。FIFO Scheduler是最简单也是最容易理解的调度器,也不需要任何配置,但它并不适用于共享集群。大的应用可能会占用所有集群资源,这就导致其它应用被阻塞。在共享集群中,更适合采用Capacity Scheduler或Fair Scheduler,这两个调度器都允许大任务和小任务在提交的同时获得一定的系统资源。
4.4.YARN 作业执行流程
利用yarn进行资源调度的程序,基本流程都和下面一致,包括spark,MR等数据处理组件
1.client向yarn提交job,首先找ResourceManager分配资源,
2.ResourceManager开启一个Container,在Container中运行一个Application manager
3.Application manager找一台nodemanager启动Application master,计算任务所需的计算
4.Application master向Application manager(Yarn)申请运行任务所需的资源
5.Resource scheduler将资源封装发给Application master
6.Application master将获取到的资源分配给各个nodemanager
7.各个nodemanager得到任务和资源开始执行map task
8.map task执行结束后,开始执行reduce task
9.map task和 reduce task将执行结果反馈给Application master
10.Application master将任务执行的结果反馈pplication manager
5.HIVE专题
参考:
https://blog.csdn.net/qq_32727095/article/details/120512994
5.1HIVE简介
Hive是一个数据仓库基础工具在Hadoop中用来处理结构化数据。它架构在Hadoop之上,总归为大数据,并使得查询和分析方便。并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。
最初,Hive是由Facebook开发,后来由Apache软件基金会开发,并作为进一步将它作为名义下Apache Hive为一个开源项目。Hive 没有专门的数据格式。 Hive 可以很好的工作在 Thrift 之上,控制分隔符,也允许用户指定数据格式。Hive不适用于在线事务处理。 它最适用于传统的数据仓库任务。
Hive 构建在基于静态批处理的Hadoop 之上,Hadoop 通常都有较高的延迟并且在作业提交和调度的时候需要大量的开销。因此,Hive 并不能够在大规模数据集上实现低延迟快速的查询,例如,Hive 在几百MB 的数据集上执行查询一般有分钟级的时间延迟。因此ÿ
以上是关于Hadoop大数据技术课程总结2021-2022学年第1学期的主要内容,如果未能解决你的问题,请参考以下文章