Week 12 学习总结
本周主要介绍了大数据的发展史、Hadoop中的HDFS、MapReduce、Yarn、Hive相关知识。
*架构师一定要关注问题是什么;学习一个技术首先要搞明白这个技术究竟解决了什么问题。
1 大数据概述
1.1 大数据技术发展史
今天我们常说的大数据技术,其实起源于Google 在2004年前后发表的三篇论文,也就是我们经常听到的大数据“三驾马车”,分别是分布式文件系统GFS、大数据分布式计算框架 MapReduce和NoSQL数据库系统 BigTable。
搜索引擎主要就做两件事情,一个是网页抓取,一个是索引构建和排序,而在这个过程
中,有大量的数据需要存储和计算。这“三驾马车”其实就是用来解决这个问题的,也就是,一个文件系统、一个计算框架、一个数据库系统。
Lucene 开源项目的创始人 Doug Cutting当时正在开发开源搜索引擎 Nutch,阅读了Google的论文后,根据论文原理初步实现了类似GFS和MapReduce 的功能。
2006年,Doug Cutting将这些大数据相关的功能从 Nutch 中分离了出来,然后启动了
一个独立的项目专门开发维护大数据技术,这就是后来赫赫有名的Hadoop,主要包括Hadoop 分布式文件系统HDFS 和大数据计算引擎 MapReduce。
在Hadoop早期,MapReduce既是一个执行引擎,又是一个资源调度框架,服务器集群的资源调度管理由MapReduce自己完成。但是这样不利于资源复用,也使得MapReduce非常臃肿。于是一个新项目启动了,将MapReduce 执行引擎和资源调度分离开来,这就是Yarn。2012年,Yarn成为一个独立的项目开始运营,随后被各类大数据产品支持,成为大数据平台上最主流的资源调度系统。
同样是在2012年,UC伯克利AMP 实验室(Algorithms、Machine和People 的缩写)
开发的Spark 开始崭露头角。当时 AMP 实验室的马铁博士发现使用MapReduce 进行机器学习计算的时候性能非常差,因为机器学习算法通常需要进行很多次的迭代计算,而MapReduce每执行一次Map和 Reduce 计算都需要重新启动一次作业,带来大量的无谓消耗。还有一点就是MapReduce主要使用磁盘作为存储介质,而2012年的时候,内存已经突破容量和成本限制,成为数据运行过程中主要的存储介质。Spark一经推出,立即受到业界的追捧,并逐步替代MapReduce 在企业应用中的地位。
一般说来,像MapReduce、Spark 这类计算框架处理的业务场景都被称作批处理计算,因为它们通常针对以“天”为单位产生的数据进行一次计算,然后得到需要的结果,这中间计算需要花费的时间大概是几十分钟甚至更长的时间。因为计算的数据是非在线得到的实时数据,而是历史数据,所以这类计算也被称为大数据离线计算。
而在大数据领域,还有另外一类应用场景,它们需要对实时产生的大量数据进行即时计
算,比如对于遍布城市的监控摄像头进行人脸识别和嫌犯追踪。这类计算称为大数据流
计算,相应地,有Storm、Flink、Spark Streaming 等流计算框架来满足此类大数据应
用的场景。流式计算要处理的数据是实时在线产生的数据,所以这类计算也被称为大数据实时计算。
NoSQL系统处理的主要也是大规模海量数据的存储与访问,所以也被归为大数据技术。
NoSQL曾经在2011年左右非常火爆,涌现出HBase、Cassandra等许多优秀的产品,其中HBase是从 Hadoop 中分离出来的、基于HDFS的 NoSQL 系统。
上面这些基本上都可以归类为大数据引擎或者大数据框架。
1.2 大数据处理的主要应用场景
大数据处理的主要应用场景包括:数据分析、数据挖掘与机器学习。
-数据分析主要使用Hive、Spark等SQL引擎完成;
-数据挖掘与机器学习则有专门的机器学习框架TensorFlow、Mahout以及MLlib 等,内置了主要的机器学习和数据挖掘算法。

1.3 大数据应用发展史
-搜索引擎时代
-数据仓库时代
-数据挖掘时代
-机器学习时代
1.4 大数据应用领域举例
-医学影像智能识别
-病例大数据智能诊疗
-AI外语老师
-智能解题
-舆情监控与分析
-大数据风控
-新零售
-无人驾驶
2 HDFS
Hadoop分布式文件系统(HDFS)是指被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统(Distributed File System)。
大数据需要解决:
-如何存储海量数据;
-如何快速读写访问;
-如何保证数据安全性;
2.1 RAID
磁盘阵列(Redundant Arrays of Independent Disks,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意。
磁盘阵列是由很多块独立的磁盘,组合成一个容量巨大的磁盘组,利用个别磁盘提供数据所产生加成效果提升整个磁盘系统效能。利用这项技术,将数据切割成许多区段,分别存放在各个硬盘上。
磁盘阵列还能利用同位检查(Parity Check)的观念,在数组中任意一个硬盘故障时,仍可读出数据,在数据重构时,将数据经计算后重新置入新硬盘中。

2.2 HDFS系统架构
HDFS是在多台服务器上进行数据的分片和并发读写,这是和RAID的主要区别。

HDFS集群有两类节点,并以管理者-工作者模式运行,即一到两个NameNode(管理者)和多个DataNode(工作者)。
一个HDFS cluster包含一个NameNode和若干的DataNode,NameNode是master,主要负责管理hdfs文件系统,具体地包括:namespace管理(其实就是目录结构),block管理(其中包括 filename->block,block->datanode list的对应关系)。
NameNode提供的是始终被动接收服务的server,主要有四类协议接口:ClientDatanodeProtocol接口、ClientProtocol接口、DatanodeProtocol接口、NamenodeProtocol接口。
DataNode主要是用来存储数据文件,HDFS将一个文件分割成一个个的block,这些block可能存储在一个DataNode上或者是多个DataNode上。
DataNode负责实际的底层的文件的读写,如果客户端client程序发起了读hdfs上的文件的命令,那么首先将这些文件分成block,然后NameNode将告知client这些block数据是存储在哪些DataNode上的,之后,client将直接和DataNode交互。
当client程序发起了写hdfs数据的时候,DataNode会自动向其他服务器复制数据块,每份数据块在整个集群中缺省情况下会存储3份。

2.3 HDFS写文件
写文件步骤:



2.4 HDFS读文件
读文件步骤:


2.5 HDFS设计目标
HDFS以流式数据访问模式存储超大文件,运行于商用硬件集群上。
-超大文件
-流式数据访问,一次写入多次读取
不适合HDFS 的场景:
-低延迟的数据访问
-大量小文件,过NameNode的处理能力
-多用户随机写入修改文件
2.6 HDFS文件存储方式
文件切分成块(默认大小64M),以块为单位,每个块有多个副本存储在不同的机器上,副本数可在文件生成时指定(默认3)。
-NameNode:
NameNode是主节点,存储文件的元数据如文件名,文件目录结构,文件属性(生成
时间,副本数,文件权限),以及每个文件的块列表以及块所在的 DataNode 等等。
NameNode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。
文件操作,NameNode负责文件元数据的操作,DataNode负责处理文件内容的读写请
求,跟文件内容相关的数据流不经过NameNode,只会询问它跟那个DataNode联系,否则NameNode会成为系统的瓶颈。
副本存放在那些DataNode上由NameNode 来控制,根据全局情况做出块放置决定,
读取文件时NameNode尽量让用户先读取最近的副本,降低带块消耗和读取时延。
NameNode 全权管理数据块的复制,它周期性地从集群中的每个DataNode 接收心跳信号和块状态报告(Blockreport)。接收到心跳信号意味着该DataNode 节点工作正常。块状态报告包含了一个该DataNode上所有数据块的列表。
-DataNode:
DataNode在本地文件系统存储文件块数据,以及块数据的校验和可以创建、删除、移动或重命名文件,当文件创建、写入和关闭之后不能修改文件内容。
一个数据块在DataNode以文件存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode 上报所有的块信息。
心跳是每3秒一次,心跳返回结果带有NameNode 给该DataNode 的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个 DataNode 的心跳,则认为该节点不可用。
集群运行中可以安全加入和退出一些机器。
2.7 HDFS关键机制-高可用
-一个名字节点和多个数据节点
-数据复制(冗余机制),存放的位立置(机架感知策略)
-故障检测
-数据节点:心跳包(检测是否宕机);块报告(安全模式下检测);数据完整性检测(校验和比较)
-名字节点(日志文件,镜像文件)
-空间回收机制
关于节点失效:
- DataNode中的磁盘挂了怎么办?
部分磁盘挂了但DataNode可以正常服务;
坏掉的磁盘上的数据尽快通知 NameNode。
-DataNode所在机器挂了怎么办?
DataNode每3秒钟向NameNode 发送心跳,如果10分钟 DataNode没有向
NameNode发送心跳,则NameNode认为该DataNode 已经dead,NameNode 将取出该DataNode上对应的block,对其进行复制。
-NameNode 挂了怎么办?
持久化元数据:
-操作日志(edit log):记录文件创建,删除,修改文件属性等操作
-Fsimage:包含完整的命名空间;File -> Block的映射关系;文件的属性(ACL, quota,修改时间等)
-现在比较流行的做法是主从NameNode,如下图所示:

-Client 挂了怎么办?
Client所在机器挂了会导致数据一致性问题!
2.8 HDFS一致性模型
-文件创建以后,不保证在NameNode立即可见,即使文件刷新并存储,文件长度依
然可能为0;
-当写入数据超过一个块后,新的reader可以看见第一个块,reader不能看见当前在写入的块;
-HDFS提供 sync()方法强制缓存与数据节点同步,sync()调用成功后,当前写入数据对所有reader 可见且一致;
-调用sync()会导致额外的开销。
2.9 HDFS常见配置项
-NameNode参数(在 hdfs-site.xml中设置):
dfs.block.size(数据块block大小,默认64M,通常设置为128M):
<property>
<name>dfs.block.size</name>
<value>134217728</value>
</property>
dfs.name.dir:
<property>
<name>dfs.name.dir</name>
<value>/data0/name, /nfs/name</value>
<description>文件存储路径</description>
</property>
dfs.replication:
<property>
<name>dfs.replication</name>
<value>3</value>
<description>复本数</description>
</property>
-DataNode参数(在 hdfs-site.xml中设置):
dfs.data.dir:
<property>
<name>dfs.data.dir</name>
<value>/data0/hdfs, /data1/hdfs</value>
<description>数据存储目录</description>
</property>
2.10 HDFS Java接口

3 MapReduce
3.1 MapReduce概述
-MapReduce主要是做大规模数据处理的:
-处理海量数据(>1TB);
-上百上千CPU实现并行处理;
MapReduce由称为 map和reduce 的两部分用户程序组成,然后利用框架在计算机集群上面根据需求运行多个程序实例来处理各个子任务,然后再对结果进行归并。
-移动计算比移动数据更为划算!
-MapReduce特性:
-自动实现分布式并行计算
-容错
-提供状态监控工具
-模型抽象简洁,程序员易用
-适合MapReduce的计算类型:
TopK
K-means
Bayes
SQL
-不适合MapReduce的计算类型:
Fibonacci
3.2 一个示例:词频统计WordCount
-示例题目:

-MapReduce的WordCount词频统计代码实现:

说明:
map方法的参数key指的是所读取的文件的value对应的偏移量,这个参数我们不太关心;
map方法的参数value指的是所读取的文件的一行;
*context.write方法表示向框架输出单词以及该单词出现次数(这里次数都是1,最终reduce方法里会对相同的word的出现次数进行累加)

说明:
reduce方法的参数key指的是通过map方法输入的某一个的单词;
reduce方法的参数values指的是相同的key对应的出现次数;
*框架会把相同的key交给同一个reduce方法来处理的,而result结果即为传入的单词key对应的总出现次数了。

-MapReduce框架处理过程:

3.3 MapReduce框架执行过程

- map的输入为来自于HDFS的不同数据分片split(split为MapReduce的术语,通常一个split对应HDFS中的一个block);
-map的输出对于相同的key会通过网络copy到相同的reduce上(网络copy非常重要,它有个转有名词叫shuffle);
-然后进行排序和合并;
-最后会经过reduce处理。


3.4 MapReduce 1 架构

-JobClient:
大数据应用程序进程,作业提交者。
-JobTracker:
JobTracker是一个后台服务进程,启动之后,会一直监听并接收来自各个TaskTracker发送的心跳信息,包括资源使用情况和任务运行情况等信息。
JobTracker的主要功能:
1.作业控制:在hadoop中每个应用程序被表示成一个作业,每个作业又被分成多个任务,JobTracker的作业控制模块则负责作业的分解和状态监控。
*最重要的是状态监控:主要包括TaskTracker状态监控、作业状态监控和任务状态监控。主要作用:容错和为任务调度提供决策依据。
2.资源管理。
-TaskTracker:
TaskTracker是JobTracker和Task之间的桥梁:一方面,从JobTracker接收并执行各种命令:运行任务、提交任务、杀死任务等;另一方面,将本地节点上各个任务的状态通过心跳周期性汇报给JobTracker。
TaskTracker与JobTracker和Task之间采用了RPC协议进行通信。
TaskTracker的功能:
1.汇报心跳:Tracker周期性将所有节点上各种信息通过心跳机制汇报给JobTracker。这些信息包括两部分:
*机器级别信息:节点健康情况、资源使用情况等。
*任务级别信息:任务执行进度、任务运行状态等。
2.执行命令:JobTracker会给TaskTracker下达各种命令,主要包括:启动任务(LaunchTaskAction)、提交任务(CommitTaskAction)、杀死任务(KillTaskAction)、
杀死作业(KillJobAction)和重新初始化(TaskTrackerReinitAction)。
TaskTracker会调用map和reduce来实现对大数据的计算,它的数据来源就是DataNode;
TaskTracker和DataNode往往是部署在同一个服务器上的,这就是常说的移动计算了。
注意:
JobTracker 对应于 NameNode;
TaskTracker 对应于 DataNode;
DataNode 和NameNode 是针对数据存放来而言的;
JobTracker和TaskTracker是对于MapReduce执行而言的。
3.5 MapReduce几个相关的概念
-InputFormat:
验证作业的输入的正确性
将输入文件切分成逻辑的InputSplits,一个InputSplit将被分配给一个单独的Mapper task提供 RecordReader的实现,这个RecordReader 会从InputSplit中正确读出一条一条的K-V对供Mapper使用。
-FilelnputFormat:
得到分片的最小值minSize和最大值maxSize,可以通过设置mapred.min.split.size和mapred.max.split.size来设置;
对于每个输入文件,计算max(minSize,min(maxSize, blockSize));
如果minSize<=blockSize<=maxSize,则设为blockSize。
分片信息<file,start,length,hosts>,通过hosts 实现map本地性。
-OutputFormat:
OutputFormt 接口决定了在哪里以及怎样持久化作业结果。
默认的OutputFormat就是TextOutputFormat,它是一种以行分隔,包含制表符界定的键值对的文本文件格式。
-Partitioner:
Mapreduce通过Partitioner对Key进行分区,进而把数据按我们自己的需求来分发。
什么情况下使用Partitioner:
·如果你需要key按照自己意愿分发,那么你需要这样的组件。
·框架默认的HashPartitioner
·例如:数据内包含省份,而输出要求每个省份输出一个文件。
public int getPartition(K key, V value,
int numReduceTasks){
return (key.hashCode() &Integer.MAX_VALUE) % numReduceTasks;
}
-JobTracker容错:
JobTracker 失败,那么未完成Job失败;
通过Job日志,Job可部分恢复。
-TaskTracker 容错:
超时:TaskTracker 10分钟(mapred.tasktracker.expiry.interval)未汇报心跳,则将其从集群移除。
灰名单,黑名单:TaskTracker上部署性能监控脚本;如果性能表现太差,被 JobTacker 暂停调度
-Task容错:
允许部分Task失败:允许失败的任务占比,默认0,Mapred.max.map.failers.percent,
mapred.max.reduce.failures.percent
Task由 TIP监控,失败任务多次尝试,慢任务启动备份任务:
每次都是一个TA(Task Attempt),最大允许尝试次数:mapred.map.max.attempts,
mapred.reduce.max.attempts
-Record容错:
跳过导致 Task失败的坏记录:
.K,V超大,导致OOM,配置最大长度,超出截断mapred.linercordreader.maxlength。
.异常数据引发程序 bug,task重试几次后,自动进入skip mode,跳过导致失败的记录,mapred.skip.attempts.to.start.skipping。
4 Yarn
4.1 Yarn概述
Apache Yarn(Yet Another Resource Negotiator的缩写)是hadoop集群资源管理器系统,Yarn从hadoop 2引入,最初是为了改善MapReduce的实现,但是它具有通用性,同样执行其他分布式计算模式。
在MapReduce1中,具有如下局限性:
1、扩展性差:jobtracker兼顾资源管理和作业控制跟踪功能跟踪任务,启动失败或迟缓的任务,记录任务的执行状态,维护计数器),压力大,成为系统的瓶颈
2、可靠性差:采用了master/slave结构,master容易单点故障
3、资源利用率低:基于槽位的资源分配模型,槽位是一种粗粒度的资源划分单位,通常一个任务不会用完一个槽位的资源,hadoop1分为map slot和reduce slot,而它们之间资源不共享,造成一些资源空闲。
4、不支持多框架:不支持多种计算框架并行
yarn很好解决了MapReduce1中的局限性:
yarn基本思想;一个全局的资源管理器resourcemanager和与每个应用对用的ApplicationMaster,Resourcemanager和NodeManager组成全新的通用系统,以分布式的方式管理应用程序。
所以针对MapReduce1,yarn就有了如下特点:
1、支持非mapreduce应用的需求
2、可扩展性
3、提高资源是用率
4、用户敏捷性
5、可以通过搭建为高可用
4.2 Yarn架构

-Yarn包括两个部分:
一个是资源管理器(Resource Manager),一个是节点管理器(Node Manager)。
这也是Yarn的两种主要进程:
ResourceManager进程负责整个集群的资源调度管理,通常部署在独立的服务器上;
NodeManager进程负责具体服务器上的资源和任务管理,在集群的每一台计算服务器上都会启动,基本上跟 HDFS 的DataNode进程一起出现。
-资源管理器又包括两个主要组件:调度器和应用程序管理器。
调度器其实就是一个资源分配算法,根据应用程序(Client)提交的资源申请和当前服务器集群的资源状况进行资源分配。Yarn内置了几种资源调度算法,包括Fair Scheduler
、Capacity Scheduler 等,你也可以开发自己的资源调度算法供 Yarn 调用。
Yarn进行资源分配的单位是容器(Container),每个容器包含了一定量的内存、CPU
等计算资源,默认配置下,每个容器包含一个CPU核心。容器由NodeManager 进程
启动和管理,NodeManger 进程会监控本节点上容器的运行状况并向ResourceManger进程汇报。
应用程序管理器负责应用程序的提交、监控应用程序运行状态等。应用程序启动后需要
在集群中运行一个ApplicationMaster,ApplicationMaster 也需要运行在容器里面。
每个应用程序启动后都会先启动自己的 ApplicationMaster,由ApplicationMaster根据应用程序的资源需求进一步向 ResourceManager进程申请容器资源,得到容器以后就会分发自己的应用程序代码到容器上启动,进而开始分布式计算。
4.3 Yarn的工作流程(以MapReduce为例)

5 Hive
5.1 Hive概述
Hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。
Hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,能将SQL语句转变成MapReduce任务来执行。
Hive的优点是学习成本低,可以通过类似SQL语句实现快速MapReduce统计,使MapReduce变得更加简单,而不必开发专门的MapReduce应用程序。
Hive十分适合对数据仓库进行统计分析。
5.2 Hive架构


5.3 Hive执行流程
-操作符(Operator)是 Hive的最小处理单元;
-每个操作符处理代表 HDFS 操作或 MR作业;
-编译器把Hive SQL 转换成一组操作符。
5.4 Hive编译器


5.5
评论