1. Hahoop概述
1.1 Hodoop是什么
1) Hadoop是一个有Apache基金会所开发的分布式系统基础架构
2) 主要解决海量数据的存储和海量数据的分析计算问题
3) 广义上来说,Hadoop通常是指一个更广泛的概念——Hadoop生态圈
1.2 Hadoop优势
1) 高可靠性:Hadoop底层维护多个数据副本,所以即使Hadoop某个计算元素或存储出现故障,也不会导致数据的丢失。
2) 高扩展性:在集群间分配任务数据,可方便地扩展数以千计的节点。
3) 高效性:在MapReduce的思想下,Hadoop是并行工作的,以加快任务处理速度。
4) 高容错性:能够自动将失败的任务重新分配。
1.3 Hadoop组成
Hadoop1.x组成:Common(辅助工具)、HDFS(数据存储)、MapReduce(计算+资源调度)
Hadoop2.x组成:Common(辅助工具)、HDFS(数据存储)、Yarn(资源调度)、MapReduce(计算)
在Hadoop1.x时代,Hadoop中的MapReduce同时处理业务逻辑运算和资源的调度,耦合性较大。
在Hadoop2.x时代,增加了Yarn。Yarn只负责资源的调度,MapReduce只负责运算。
Hadoop3.x时代在组成上没有变化。
1.3.1 HDFS 架构概述
Hadoop Distributed File System,简称HDFS,是一个分布式文件系统。
1) NameNode(nn):存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间、副本数、文件权限),以及每个文件的块列表和块所在的DataNode等。
2) DataNode(dn):本地文件系统存储文件块数据,以及块数据的校验和。
3)Secondary NameNode(2nn):每隔一段时间对NameNode元数据备份。
1.3.2 YARN 架构概述
一种资源协调者,是Hadoop的资源管理器。(资源调度)
1) ResourceManager(RM):整个集群资源(内存、CPU等)的老大
2) NodeManage(NM):单个节点服务器的老大
3) ApplicationMaster(AM):单个任务运行的老大
4) Container :容器,相当于一台独立的服务器,里面封装了任务运行所需要的资源,如内存、CPU、磁盘、网络等。
1.3.3 MapReduce架构概述
MapReduce将计算过程分为俩个阶段:Map和Reduce (运算)
1) Map阶段并行处理输入数据
2) Reduce阶段对Map结果进行汇总
1.3.4 HDFS、YARN、MapReduce三者关系
1.3.5 大数据技术生态体系
图中涉及的技术名词解释如下:
1)Sqoop:Sqoop是一款开源的工具,主要用于在Hadoop、Hive与传统的数据库(MySQL)间进行数据的传递,可以将一个关系型数据库(例如 :MySQL,Oracle 等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
2)Flume:Flume是一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;
3)Kafka:Kafka是一种高吞吐量的分布式发布订阅消息系统;
4)Spark:Spark是当前最流行的开源大数据内存计算框架。可以基于Hadoop上存储的大数据进行计算。
5)Flink:Flink是当前最流行的开源大数据内存计算框架。用于实时计算的场景较多。
6)Oozie:Oozie是一个管理Hadoop作业(job)的工作流程调度管理系统。
7)Hbase:HBase是一个分布式的、面向列的开源数据库。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。
8)Hive:Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
9)ZooKeeper:它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。
2. HDFS概述
2.1 HDFS产出背景及定义
2.1.1 HDFS产生背景
随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS只是分布式文件管理系统中的一种。
2.1.2 HDFS定义
HDFS(Hadoop Distributed File System),它是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。
HDFS的使用场景:适合一次写入,多次读出的场景。一个文件经过创建、写入和关闭之后就不需要改变。
2.1.3 HDFS优缺点
优点:
缺点:
2.1.4 HDFS组成架构
2.1.5 HDFS文件块大小(面试重点)
2.2 HDFS的操作
2.2.1 基本语法
hadoop fs 具体命令 或者 hdfs dfs 具体命令 两个是完全相同的。 可以通过命令 bin/hadoop fs 或者直接输入 hadoop fs 查看所有命令 注意:执行命令前需启动集群
2.2.2 准备工作
集群启动: 切换到集群目录:(首先需要完全切换到hadoop用户下: su - hadoop) 通过shell脚本启动集群: sbin/start-all.sh 或者直接执行 start-all.sh 启动验证: jps 之后有6个进程,对应的 PID 服务名 关闭集群: stop-all.sh
集群意思就是 多台服务器组成的一个 服务器群体。
集群分为: 完全分布式 跟 伪分布式 完全分布式有多节点(Cluster) 多台服务器 伪分布式 只有一个节点 模拟集群运行环境
HDFS文件存储系统:http://192.168.5.100:9870/
集群监控页面:http://192.168.5.100:8088/
2.2.3 创建 /sanguo 文件夹
hadoop fs -mkdir /sanguo 如果报出以下错误: mkdir: Cannot create directory /sanguo. Name node is in safe mode. 解决方案: hadoop dfsadmin -safemode leave # 强制关闭安全模式
2.2.4 上传
- -moveFromLocal:从本地剪切粘贴到HDFS 先编写文件: vim shuguo.txt (输入内容:shuguo)
执行命令将本地文件剪切粘贴到HDFS中 /sanguo 目录下: hadoop fs -moveFromLocal ./shuguo.txt /sanguo
- -copyFromLocal:从本地文件系统中拷贝文件到HDFS路径去 在本地编写文件: vim weiguo.txt (输入内容:weiguo) 执行命令: hadoop fs -copyFromLocal weiguo.txt /sanguo
- -put:等同于copyFromLocal,生产环境更习惯用put 在本地编写文件: vim wuguo.txt (输入内容:wuguo) 执行命令: hadoop fs -put liubei.txt /sanguo/shuguo.txt
2.2.5 下载
- -copyToLocal:从HDFS拷贝到本地 hadoop fs -copyToLocal /sanguo/shuguo.txt /home/hadoop # 必须下载到hadoop的目录里面
- -get:等同于copyToLocal,生产环境更习惯用get hadoop fs -get /sanguo/shuguo.txt /home/hadoop # 必须下载到hadoop的目录里面
2.2.6 HDFS直接操作
- -ls: 显示目录信息 hadoop fs -ls /sanguo
- -cat:显示文件内容 hadoop fs -cat /sanguo/shuguo.txt
- -chmod、-chown:Linux文件系统中的用法一样,修改文件所属权限 hadoop fs -chmod 666 /sanguo/shuguo.txt hadoop fs -chown tom:tom /sanguo/shuguo.txt
- -mkdir:创建路径 hadoop fs -mkdir /jinguo
- -cp:从HDFS的一个路径拷贝到HDFS的另一个路径 hadoop fs -cp /sanguo/shuguo.txt /jinguo
- -mv:在HDFS目录中移动文件 hadoop fs -mv /sanguo/wuguo.txt /jinguo hadoop fs -mv /sanguo/weiguo.txt /jinguo
- -rm:删除文件或文件夹 hadoop fs -rm /sanguo/shuguo.txt
- -rm -r:递归删除目录及目录里面内容 hadoop fs -rm -r /sanguo
- -du统计文件夹的大小信息 hadoop fs -du -s -h /jinguo hadoop fs -du -h /jinguo 上面命令查询出来会有三个参数,例如: 27 81 /jinguo 其中27表示文件大小,81表示27*3个副本,/jinguo 表示查看的目录
2.3 HDFS的读写流程(面试重点)
2.3.1 HDFS写数据流程
(1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。
(2)NameNode返回是否可以上传。
(3)客户端请求第一个 Block上传到哪几个DataNode服务器上。
(4)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。
(5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
(6)dn1、dn2、dn3逐级应答客户端。
(7)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
(8)当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。
2.3.2 HDFS读数据流程
(1)客户端通过DistributedFileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
(2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
(3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
(4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。
3. MapReduce
3.1 MapReduce概述
3.1.1 MapReduce定义
MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。
3.1.2 MapReduce优缺点
优点:
1)MapReduce易于编程 它简单的实现一些接口,就可以完成一个分布式程序,这个分布式程序可以分布到大量廉价的PC机器上运行。也就是说你写一个分布式程序,跟写一个简单的串行程序是一模一样的。就是因为这个特点使得MapReduce编程变得非常流行。 2)良好的扩展性 当你的计算资源不能得到满足的时候,你可以通过简单的增加机器来扩展它的计算能力。 3)高容错性 MapReduce设计的初衷就是使程序能够部署在廉价的PC机器上,这就要求它具有很高的容错性。比如其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由Hadoop内部完成的。 4)适合PB级以上海量数据的离线处理 可以实现上千台服务器集群并发工作,提供数据处理能力。
缺点:
1)不擅长实时计算 MapReduce无法像MySQL一样,在毫秒或者秒级内返回结果。 2)不擅长流式计算 流式计算的输入数据是动态的,而MapReduce的输入数据集是静态的,不能动态变化。这是因为MapReduce自身的设计特点决定了数据源必须是静态的。 3)不擅长DAG(有向无环图)计算 多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce并不是不能做,而是使用后,每个MapReduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常的低下。
3.2 MapReduce核心思想
(1)分布式的运算程序往往需要分成至少2个阶段。
(2)第一个阶段的MapTask并发实例,完全并行运行,互不相干。
(3)第二个阶段的ReduceTask并发实例互不相干,但是他们的数据依赖于上一个阶段的所有MapTask并发实例的输出。
(4)MapReduce编程模型只能包含一个Map阶段和一个Reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序,串行运行。
总结:分析WordCount数据流走向深入理解MapReduce核心思想。
4. Yarn资源调度器
Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序。
4.1 Yarn基础架构
4.2 Yarn工作机制
(1)MR程序提交到客户端所在的节点。
(2)YarnRunner向ResourceManager申请一个Application。
(3)RM将该应用程序的资源路径返回给YarnRunner。
(4)该程序将运行所需资源提交到HDFS上。
(5)程序资源提交完毕后,申请运行mrAppMaster。
(6)RM将用户的请求初始化成一个Task。
(7)其中一个NodeManager领取到Task任务。
(8)该NodeManager创建容器Container,并产生MRAppmaster。
(9)Container从HDFS上拷贝资源到本地。
(10)MRAppmaster向RM 申请运行MapTask资源。
(11)RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。
(12)MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序。
(13)MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
(14)ReduceTask向MapTask获取相应分区的数据。
(15)程序运行完毕后,MR会向RM申请注销自己。