大数据Hadoop基础

Hadoop简述

一个由Apache开发的基础分布式框架,主要目的是解决海量数据的存储、分析、计算问题。通常从广义上来说,Hadoop是一个更广泛的概念,发展至今已经是一个成熟的生态体系。Hadoop自2005年发行以来的迅速发展,标志着云计算时代的来临。

组成
Hadoop主要由以下三部分组成:

  1. HDFS:存储数据。一个分布式文件系统。
  2. MapReduce:计算。一个分布式离线并行计算框架。
  3. YARN:资源调度。一个作业调度与集群资源管理的框架。

Hadoop的优势

  • 高可靠性:Hadoop在设计之初就假设任何一个节点都可能故障,即使是最为重要的NameNode节点都有一个SecondaryNameNode作为宕机保障。
  • 高可扩展性:在集群之间分配数据,方便扩展千万级别的节点数量。
  • 高效性:Hadoop是并行工作的,能加快任务的处理速度。
  • 高容错性:自动保存多份副本数据,并且能够自动将失败的任务重新分配。

Hadoop环境搭建及简单测试

1. 构建基础Linux环境。让虚拟机联网、安装JDK、关闭防火墙等
关闭Linux防火墙
安装JDK成功
2. 安装Hadoop
下载、拷贝文件到Linux环境中安装Hadoop需要的压缩文件
解压Hadoop安装包到安装目录
解压
配置 hadoop-env.sh
在这里插入图片描述
将hadoop添加到Linux的环境变量中
在这里插入图片描述

3. 本地模式运行Hadoop的官方案例(Hadoop官方自带的WordCount 单词统计)
在/opt/module/hadoop-2.7.2目录下面创建一个目录用来存放输入文件
在这里插入图片描述
在里面放上一个测试文件,里面写上一些单词
在这里插入图片描述
执行命令 这里是采用官方提供的已经写好的单词统计的Jar包,其中各个命令的含义如下图
在这里插入图片描述
查看运行结果,如下图
在这里插入图片描述

4. 搭建Hadoop伪分布式模式运行环境
伪分布式环境基本上等同于实际场景中的分布式环境,不同的是它只有一个节点,但是伪分布式模式也能很好的把Hadoop的一些特点展现出来。
配置集群
需要配置以下两个文件,core-site.xml和 hdfs-site.xml,操作截图如下:
core-site.xml
在这里插入图片描述
hdfs-site.xml
在这里插入图片描述
启动伪分布式集群
分为三步:格式化Namenode, 启动namenode, 启动datanode
格式化Namenode
在这里插入图片描述
启动namenode
在这里插入图片描述
启动datanode
在这里插入图片描述
查看集群
方式一:可以通过查看产生的日志文件 到hadoop安装目录下的logs目录去用ls命令查看。
方式二:web端查看HDFS文件系统,端口是50070.在虚拟机里面使用火狐浏览器,输入localhost:50070即可。
在这里插入图片描述
除此之外,因为之前配置了宿主机的hosts文件,所以在windows系统上可以直接在浏览器查看集群状态。
在这里插入图片描述

5. 在Linux系统上操作集群,常用命令

(1)-help:输出这个命令参数
	$ hadoop fs -help rm
(2)-ls: 显示目录信息
	$ hadoop fs -ls /
(3)-mkdir:在 hdfs 上创建目录
	$ hadoop fs -mkdir -p /user/xiaosha/test
(4)-moveFromLocal 从本地剪切粘贴到 hdfs
	$ touch jinlian.txt
	$ hadoop fs -moveFromLocal ./jinlian.txt
(5)--appendToFile :追加一个文件到已经存在的文件末尾
	$ touch ximen.txt
	$ vi ximen.txt
(6)-cat :显示文件内容
(7)-tail:显示一个文件的末尾
	$ hadoop fs -tail /user/xiaosha/test/jinlian.txt
(8)-chgrp 、-chmod、-chown:linux 文件系统中的用法一样,修改文件所属权限
	$  hadoop  fs  -chmod  666
	/user/xaiosha/test/jinlian.txt
	$  hadoop  fs  -chown  xs:xs
	/user/xiaosha/test/jinlian.txt
(9)-copyFromLocal:从本地文件系统中拷贝文件到 hdfs 路径去
	$ hadoop fs -copyFromLocal README.txt
	/user/xiaosha/test
(10)-copyToLocal:从 hdfs 拷贝到本地
	$  hadoop  fs  -copyToLocal
	/user/xaiosha/test/jinlian.txt ./jinlian.txt
(11)-cp :从 hdfs 的一个路径拷贝到 hdfs 的另一个路径
	$ hadoop fs -cp /user/xiaosha/test/jinlian.txt
	/jinlian2.txt
(12)-mv:在 hdfs 目录中移动文件
	$ hadoop fs -mv /jinlian2.txt /user/xiaosha/test/
(13)-get:等同于 copyToLocal,就是从 hdfs 下载文件到本地
	$ hadoop fs -get /user/xiaosha/test/jinlian2.txt ./
(14)-getmerge :合并下载多个文件,比如 hdfs 的目录 /aaa/下有多个文件:log.1,log.2,log.3,...
	$  hadoop  fs  -getmerge
	/user/xiaosha/test/* ./zaiyiqi.txt
(15)-put:等同于 copyFromLocal
	$ hadoop fs -put ./zaiyiqi.txt /user/xiaosha/test/
(16)-rm:删除文件或文件夹
	$ hadoop fs -rm /user/xiaosha/test/jinlian2.txt
(17)-rmdir:删除空目录
	$ hadoop fs -mkdir /test
	$ hadoop fs -rmdir /test
(18)-df :统计文件系统的可用空间信息
	$ hadoop fs -df -h /

6. 在Eclipse里面创建Java工程,编写链接HDFS文件系统的代码
将集群启动、Jar包准备、编写在HDFS文件系统上新建目录的代码
在这里插入图片描述
运行成功,查看HDFS:
在这里插入图片描述
其他测试不再展示,代码GitHub链接如下:
https://github.com/xiaoshaDestiny/HadoopHdfsClient

HDFS

简述
HDFS,()它是一个分布式文件系统,用于存储文件,通过目录树来定位文件,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。HDFS 的设计适合一次写入,多次读出的场景,且不支持文件的修改。适合用来做数据分析,并不适合用来做网盘应用。

优点
高容错性,适合大数据处理,流式数据访问,可构建在廉价机器上,通过多副本机制,提高可靠性。

缺点
不适合低延时数据访问,无法高效的对大量小文件进行存储,并发写入、文件随机修改,一个文件只能有一个写,不允许多个线程同时写,仅支持数据 append(追加),不支持文件的随机修改。

扫描二维码关注公众号,回复: 11399567 查看本文章

组成
HDFS文件系统由HDFS Client、NameNode、DataNode 和 Secondary NameNode 四部分组成。

  • Client:就是客户端
    (1)文件切分。文件上传 HDFS 的时候,Client 将文件切分成一个一个的 Block,然后进行存储。
    (2)与 NameNode 交互,获取文件的位置信息。
    (3)与 DataNode 交互,读取或者写入数据。
    (4)Client 提供一些命令来管理 HDFS,比如启动或者关闭 HDFS。
    (5)Client 可以通过一些命令来访问 HDFS。

  • NameNode:就是 master,它是一个主管、管理者
    (1)管理 HDFS 的名称空间。
    (2)管理数据块(Block)映射信息
    (3)配置副本策略
    (4)处理客户端读写请求。

  • DataNode:就是 Slave。NameNode 下达命令,DataNode 执行实际的操作
    (1)存储实际的数据块。
    (2)执行数据块的读/写操作。

  • Secondary NameNode:并非 NameNode 的热备,当 NameNode 挂掉的时候,它并不能马上替换 NameNode 并提供服务。
    (1)辅助 NameNode,分担其工作量。
    (2)定期合并 Fsimage 和 Edits,并推送给 NameNode。
    (3)在紧急情况下,可辅助恢复 NameNode。

MapReduce

简述
Mapreduce 是一个分布式运算程序的编程框架,是用户开发“基于 hadoop 的数据分析应用”的核心框架。Mapreduce 核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的
分布式运算程序,并发运行在一个 hadoop 集群上。

优点
1、MapReduce 易于编程 。它简单的实现一些接口,就可以完成一个分布式程序,这个分布式程序可以分布到大量廉价的 PC 机器上运行。也就是说你写一个分布式程序,跟写一个简单的串行程序是一模一样的。就是因为这个特点使得 MapReduce 编程变得非常流行。
2、良好的扩展性,当你的计算资源不能得到满足的时候,你可以通过简单的增加机器来扩展它的计算能力。
3、高容错性,MapReduce 设计的初衷就是使程序能够部署在廉价的 PC 机器上,这就要求它具有很高的容错性。比如其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由Hadoop 内部完成的。
4、适合 PB 级以上海量数据的 离线处理 。这里加红字体离线处理,说明它适合离线处理而不适合在线处理。比如像毫秒级别的返回一个结果,MapReduce 很难做到。

缺点
1、实时计算,MapReduce 无法像 Mysql 一样,在毫秒或者秒级内返回结果。
2、流式计算,流式计算的输入数据是动态的,而 MapReduce 的输入数据集是静态的,不能动态变化。这是因为 MapReduce 自身的设计特点决定了数据源必须是静态的。
3、DAG (有向图)计算,多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce 并不是不能做,而是使用后,每个 MapReduce 作业的输出结果都会写入到磁盘,会造成大量的磁盘 IO,导致性能非常的低下。

核心
分布式的运算程序往往需要分成至少 2 个阶段。
第一个阶段的 maptask 并发实例,完全并行运行,互不相干。
第二个阶段的 reduce task 并发实例互不相干,但是他们的数据依赖于上一个阶段的所有maptask 并发实例的输出。
MapReduce 编程模型只能包含一个 map 阶段和一个 reduce 阶段,如果用户的业务逻辑非常复杂,那就只能多个 mapreduce 程序,串行运行。

编程规范
用户编写的程序分成三个部分:Mapper,Reducer,Driver(提交运行 mr 程序的客户端)
1、Mapper 阶段
(1)用户自定义的 Mapper 要继承自己的父类
(2)Mapper 的输入数据是 KV 对的形式(KV 的类型可自定义)
(3)Mapper 中的业务逻辑写在 map()方法中
(4)Mapper 的输出数据是 KV 对的形式(KV 的类型可自定义)
(5)map()方法(maptask 进程)对每一个<K,V>调用一次
2、Reducer 阶段
(1)用户自定义的 Reducer 要继承自己的父类
(2)Reducer 的输入数据类型对应 Mapper 的输出数据类型,也是 KV
(3)Reducer 的业务逻辑写在 reduce()方法中
(4)Reducetask 进程对每一组相同 k 的<k,v>组调用一次 reduce()方法
3、Driver 阶段
整个程序需要一个 Drvier 来进行提交,提交的是一个描述了各种必要信息的 job 对象

Yarn

概述
Yarn 是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式
的操作系统平台,而 MapReduce 等运算程序则相当于运行于操作系统之上的应用程序。

工作机制
MR(MapReduce) ,RM(ResourceManeger)
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 申请容器,运行 reduce task。
14、reduce task 向 maptask 获取相应分区的数据。
15、程序运行完毕后,MR 会向 RM 申请注销自己。

作业提交过程

  • (1)作业提交
    第 1步:client 调用 job.waitForCompletion 方法,向整个集群提交 MapReduce 作业。
    第 2 步:client 向 RM 申请一个作业 id。
    第 3 步:RM 给 client 返回该 job 资源的提交路径和作业 id。
    第 4 步:client 提交 jar 包、切片信息和配置文件到指定的资源提交路径。
    第 5 步:client 提交完资源后,向 RM 申请运行 MrAppMaster。

  • (2)作业初始化
    第 6 步:当 RM 收到 client 的请求后,将该 job 添加到容量调度器中。
    第 7 步:某一个空闲的 NM 领取到该 job。
    第 8 步:该 NM 创建 Container,并产生 MRAppmaster。
    第 9 步:下载 client 提交的资源到本地。

  • (3)任务分配
    第 10 步:MrAppMaster 向 RM 申请运行多个 maptask 任务资源。
    第 11 步:RM 将运行 maptask 任务分配给另外两个 NodeManager,另两个 NodeManager分别领取任务并创建容器。

  • (4)任务运行
    第 12步:MR 向两个接收到任务的 NodeManager 发送程序启动脚本,这两个NodeManager 分别启动 maptask,maptask 对数据分区排序。
    第13步:MrAppMaster等待所有maptask运行完毕后,向RM申请容器,运行reduce task。
    第 14 步:reduce task 向 maptask 获取相应分区的数据。
    第 15 步:程序运行完毕后,MR 会向 RM 申请注销自己。

  • (5)进度和状态更新
    YARN 中的任务将其进度和状态(包括 counter)返回给应用管理器, 客户端每秒(通过
    mapreduce.client.progressmonitor.pollinterval 设置)向应用管理器请求进度更新, 展示给用户。

  • (6)作业完成
    除了向应用管理器请求作业进度外, 客户端每 5 分钟都会通过调用 waitForCompletion()
    来检查作业是否完成。时间间隔可以通过 mapreduce.client.completion.pollinterval 来设置。作
    业完成之后, 应用管理器和 container 会清理工作状态。作业的信息会被作业历史服务器存储
    以备之后用户核查。

本文资源来自于尚硅谷老师课程笔记,感谢!

猜你喜欢

转载自blog.csdn.net/XiaoA82/article/details/102820545