一、Apache Hadoop

Apache Hadoop

 

大数据时代的发展趋势一数据将成为资产

长期以来,困扰企业最大的难题就是“如何更了解他的客户” 。传统企业衰落的根本原因在于难以贴近消费者,难以了解消费者的真正需求。互联网公司的强项恰恰是天然地贴近消费者、了解消费者。企业需要花大力气真正研究消费者的数据,这样才能了解消费者,才能将数据资产化, 将数据变现。

在信息传播极其迅速的今天,各种数据渗透我们的生活,并以指数级的速度增长。我们也正从IT进入DT时代

**IT**,英文 Information Technology 的缩写,即 信息技术。信息技术是一项基于计算机和互联网,用来提升人们信息传播能力的技术。

**DT**,英文 Data Technology 的缩写,即 数据技术。是对数据进行存储、清洗、加工、分析、挖掘,从数据中发掘规律的技术。DT让我们能够借助计算机的计算能力认知我们的客户,提升我们认知的同时,影响我们的思考、帮助我们决策。简单说,**IT提供信息传播能力,DT是解决数据决策能力**

**DT是数据技术**它首先需要大量的数据,其次需要强大的计算能力**,`大数据+大算力`是DT的保证**。IT二十年我们在互联网上积累了海量的数据。同时,5G物联网的到来,把万物的连接在一起,产生了全新的数据生产能力。在这种情况下,让数据技术来帮助人类认知世界,解决思考决策就成为必然。

什么是大数据?

一般认为,大数据主要具有四方面的典型特征一一**规模性(Volume)、多样性(Variety)、高速性(Velocity)和价值性(Value),即所谓的“ 4V ”**

  1. 规模性,即大数据具有相当的规模, 其数据量非常巨大。淘宝网近4亿的会员每天产生的商品交易数据约20TB, Facebook (脸书)约10 亿的用户每天产生的日志数据超过300TB。 数据的数量级别可划分为B 、KB 、MB 、GB 、TB 、PB 、EB 、ZB 等,而数据的数量级别为PB 级别的才能称得上是大数据

  2. 多样性,即大数据的数据类型呈现多样性。数据类型繁多,不仅包括结构化数据,还包括非结构化数据和半结构化数据。其中,结构化数据即音频、图片、文本、视频、网络日志、地理位置信息等。传统的数据处理对象基本上都是结构化数据,而在现实中非结构化数据也是大量存在的,所以既要分析结构化数据又要分析非结构化数据才能满足人们对数据处理的要求。

  3. 高速性,即处理大数据的速度越来越快,处理时要求具有时效性,因为数据和信息更新速度非常快,信息价值存在的时间非常短, 必须要求在极短的时间下在海量规模的大数据中摒除无用的信息来搜集具有价值和能够利用的信息。所以随着大数据时代的到来,搜集和提取具有价值的数据和信息必须要求高效性和短时性。

  4. 价值性。从大数据的表面数据进行分析,进而得到大数据背后重要的有价值的信息,最后可以精确地理解数据背后所隐藏的现实意义。以视频为例, 一部1小时的视频,在连续不间断的监控中,有用数据可能仅有一两秒。

大数据时代的关键技术

大数据时代的关键技术一般包括大数据来集、大数据预处理、大数据存储及管理、大数据分析及挖掘、大数据可视化展现等。

  1. 大数据采集技术 大数据采集是指通过对社交网络交互数据、移动互联网数据以及传感器数据的收集,获得各种类型的结构化、半结构化及非结构化的海量数据。

  2. 大数据预处理技术 大数据预处理技术主要完成对己接收数据的抽取、清洗等操作。因获取的数据可能具有多种结构和类型, 数据抽取能帮助我们从各种异构的源数据源系统抽取到目的数据源系统需要的数据。大数据并不全是有价值的,有些数据并不是我们所关心的内容,而另一些数据则是完全错误的干扰项,因此要对数据进行过滤“去噪”,从而提取出有效数据。

  3. 大数据存储及管理技术 大数据存储与管理要用存储器把采集到的数据存储起来,井进行管理和调用。重点解决复杂结构化、半结构化和非结构化大数据存储管理技术。可靠的分布式文件系统( DFS , Distributed File System)是高效低成本的大数据存储技术。

  4. 大数据分析及挖掘技术 大数据挖掘就是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中提取隐含在其中的、人们事先不知道的但又是潜在有用的信息和知识的过程。大数据挖掘根据挖掘方法可粗略地分为机器学习方法、统计方法、神经网络方法和数据库的多维数据分析方法等,它能够将隐藏于海量数据中的信息和知识挖掘出来。

  5. 大数据可视化展现技术 大数据可视化无论对于普通用户或是数据分析专家都是最基本的功能。大数据可视化可以让数据自己说话,让用户直观地感受到结果,也可以让数据分析师根据图像化分析的结果做出一些前瞻性判断。

Hadoop 概述和介绍

1998年9月4日,Google公司在美国硅谷成立。正如大家所知,它是一家做搜索引擎起家的公司。无独有偶,一位名叫Doug Cutting的美国工程师,也迷上了搜索引擎。他做了一个用于文本搜索的函数库,命名为Lucene,Lucene是用JAVA写成的,目标是为各种中小型应用软件加入全文检索功能。因为好用而且开源,非常受程序员们的欢迎。2004年,Doug Cutting再接再励,在Lucene的基础上,和Apache开源伙伴合作,开发了一款可以代替当时的主流搜索的开源搜索引擎,命名为Nutch。Nutch是一个建立在Lucene核心之上的网页搜索应用程序,可以下载下来直接使用。它在Lucene的基础上加了网络爬虫和一些网页相关的功能,目的就是从一个简单的站内检索推广到全球网络的搜索上,就像Google一样

随着时间的推移,无论是Google还是Nutch,都面临搜索对象“体积”不断增大的问题。尤其是Google,作为互联网搜索引擎,**需要存储大量的网页,并不断优化自己的搜索算法,提升搜索效率**。在这个过程中,Google确实找到了不少好办法,并且无私地分享了出来。

  • 2003年,Google发表了一篇技术学术论文,公开介绍了自己的谷歌文件系统GFS(Google File System)。这是Google公司为了存储海量搜索数据而设计的专用文件系统。第二年,也就是2004年,Doug Cutting基于Google的GFS论文,实现了分布式文件存储系统,并将它命名为NDFS(Nutch Distributed File System)

  • 2004年,Google又发表了一篇技术学术论文,介绍自己的MapReduce编程模型。这个编程模型,用于大规模数据集(大于1TB)的并行分析运算。第二年(2005年),Doug Cutting又基于MapReduce,在Nutch搜索引擎实现了该功能。

  • 2006年,当时依然很厉害的Yahoo公司,招安了Doug Cutting。加盟Yahoo之后,Doug Cutting将NDFS和MapReduce进行了升级改造,并重新命名为Hadoop(NDFS也改名为HDFS,Hadoop Distributed File System)。这个,就是后来大名鼎鼎的大数据框架系统——Hadoop的由来。而Doug Cutting,则被人们称为Hadoop之父

4a8817caaa3d56cd6045b2b1a4414e5b.png

随后在2006年,Google又发论文了。这次,它们介绍了自己的BigTable。这是一种分布式数据存储系统,一种用来处理海量数据的非关系型数据库。Doug Cutting当然没有放过,在自己的Hadoop系统里面,引入了BigTable,并命名为HBase

2008年1月,Hadoop成功上位,正式成为Apache基金会的顶级项目。

同年2月Yahoo宣布建成了一个拥有1万个内核的Hadoop集群,并将自己的搜索引擎产品部署在上面。7月,Hadoop打破世界纪录,成为最快排序1TB数据的系统,用时209秒。此后,Hadoop便进入了高速发展期,直至现在。

Hadoop 改变了企业对数据的存储、处理和分析的过程,加速了大数据的发展,形成了自己非常火爆的技术生态圈,成为事实上的大数据处理标准

Hadoop的生态圈

Hadoop的核心,说白了,就是HDFS和MapReduce。HDFS为海量数据提供了存储,而MapReduce为海量数据提供了计算框架

早期的Hadoop主要由两个核心组件构成: HDFSMapReduce 。其中,HDFS为海量数据提供了存储,而MapReduce为海量数据提供了计算框架。还有一些围绕在Hadoop 周围的开源项目,为完善大数据处理的全生命周期提供了必要的配套和补充。

image-20200726113838808.png

2012 年5 月, Hadoop v2 .0 版本发布,其中重要的变化是在Hadoop 核心组件中增加了YARN,YARN 的出现是为了把计算框架与资源管理彻底分离,解决Hadoop v1.0 由此带来的扩展性差、单点故障和不能同时支持多种计算框架的问题,至此Hadoop 与Google 的大数据平台比肩。

2017年12月,Hadoop v3 .0 版本发布,最低要求的Java版本从Java 7增加到Java 8。

Hadoop 发行版

Hadoop 是一个开源项目,先后有许多公司在其框架基础上进行了增强并且发布了商业版本。Hadoop 商业发行版的提供者通过优化核心代码、增强易用性、提供技术支持和持续版本升级为Hadoop 平台实现了许多新功能。市场上受认可的Hadoop 商业发行版的提供者主要有Cloudera 、MapR 和Hortonworks ,这三家公司都把Hadoop核心框架打包到了他们的商业版本中;在这基础上,他们都提供了技术支持服务和定制化开发服务。

  • Cloudera和MapR的发行版是收费的,他们基于开源技术,提高稳定性,同时强化了一些功能,定制化程度较高,核心技术是不公开的,营收主要来自软件收入。这类公司,如果一直保持技术领先性,那么软件收入溢价空间很大。但一旦技术落后于开源社区,整个产品需要进行较大调整。

  • Hortonworks则走向另一条路,他们将核心技术完全公开,用于推动Hadoop社区的发展。这样做的好处是,如果开源技术有很大提升,他们受益最大,因为定制化程度较少,自身不会受到技术提升的冲击。

Cloudera — CDH

Cloudera 是Hadoop领域知名的公司和市场领导者,提供了市场上第一个Hadoop商业发行版本。它拥有350多个客户并且活跃于Hadoop生态系统开源社区。在多个创新工具的贡献着排行榜中,它都名列榜首。它的系统管控平台——Cloudera Manager,易于使用、界面清晰,拥有丰富的信息内容。Cloudera 专属的集群管控套件能自动化安装部署集群并且提供了许多有用的功能。同时,Cloudera 也提供咨询服务来解决各类机构关于在数据管理方案中如何使用Hadoop技术以及开源社区有哪些新内容等疑虑。** **

Hadoop 优缺点

  • Hadoop优点(4高) 1. 高可靠性:Hadoop底层维护多个数据副本,所以即使Hadoop某个计算元素或存储出现故障,也不会导致数据的丢失。 2. 高扩展性:能在廉价机器组成的集群间分配任务数据,可方便的扩展数以干计的节点。 3. 高效性:在MapReduce的思想下,Hadoop是并行工作的,以加快任务处理速度。 4. 高容错性:能够自动将失败的任务重新分配。

  • Hadoop的缺点 1. 不适合低延时数据访问,比如毫秒级的存储数据,是做不到的。 2. 无法高效的对大量小文件进行存储。 3.不支持并发写入、文件随机修改。

HDFS 分布式文件系统

为了解决海量数据存储问题, Google 开发了分布式文件系统GFS 。HDFS 是GFS 的开源实现,它是Hadoop 的核心组件之一。HDFS 提供了在通用硬件集群中进行分布式文件存储的能力,是一个高容错性和高吞吐量的海量数据存储解决方案

HDFS (Hadoop Distributed File system, Hadoop 分布式文件系统)以流式数据访问模式来存储超大文件,运行在由廉价普通机器组成的集群上,是管理网络中跨多台计算机存储的文件系统。它的基本原理是将文件切分成同等大小的数据块,存储到多台机器上,将数据切分、容错、负载均衡等功能透明化

HDFS 上的文件被划分为相同大小的多个block块,以块作为独立的存储单位。[ Hadoop 2.x 默认大小是128M,Hadoop 1.x 是 64M ]

  1. 大文件用一个节点是存不下来的,势必分成块。.

  2. 网络传输时万一岩掉,可以小部分重传。

  3. 简化了存储管理,同时元数据就不需要和块一存储了,用一个单独的系统就可以管理这些块的元数据。

所以block 块是HDFS 中最基本的存储单位。默认块大小是可以修改的,可以通过 dfs.block.size 设置。

除了将文件分块, 每个块文件也有副本,这是为了容错性。当一个机器挂了,想要恢复里面的文件,就可以去其他机器找文件的副本。默认是三个副本,也可通过 hdfs-site.xml 中的 replication 属性修改副本数量。

HDFS 体系结构

HDFS 采用主从( Master/Slave )架构模型,分为NameNode (名称节点)、SecondaryNameNode(第二名称节点)、DataNode (数据节点)这几个角色。

1595814462953.png

一个典型的HDFS 集群是由 NameNode 、SecondaryNameNode 和若干个DataNode (通常大于3 个)组成的,通常是一个节点一个机器,它来管理对应节点的存储。

  • NameNode:主要负责文件系统命名空间的管理、存储文件目录的Metadata 元数据信息,主要包括文件目录、block 块和文件对应关 系,以及block 块和DataNode 数据节点的对应关系。

  • DataNode:负责存储客户端( Client )发来的Block 数据块,执行数据块的读写操作。

  • Block:文件切分成块(默认大小128M),以块为单位,每个块有多个副本存储在不同的机器上,为了增加可靠性,每一个文件切片都会有3个副本。

  • SecondaryNameNode:用来监控 HDFS 状态的辅助后台程序,每隔一段时间获取HDFS数据的快照。用来减少NameNode 的工作量,定期与NameNode通信进行元数据更新。也可以在NameNode重启的时候,能够快速恢复启动。

NameNode元数据管理机制

HDFS 集群的命名空间是由NameNode 来存储的。NameNode 使用Fslmage 和EditLog 两个核心的数据结构,EditLog 事务日志文件记录每一个对文件系统元数据的改变,如在HDFS 中创建一个新的文件,名称节点将会在EditLog 中插入一条记录来记录这个改变。整个命名空间的信息包括文件块的映射表等都存放在Fslmage 文件中。

名称节点启动时,它将从磁盘中读取Fslmage 和EditLog ,将EditLog 中的所有事务应用到Fslmage,然后将新的Fslmage 刷新到本地磁盘中,因为事务己经被处理井已经持久化到Fslmage中,然后就可以截去旧的EditLog 。这个过程叫作检查点。

Fslmage 和Editlog 是HDFS 的重要数据结构,如果这些文件损坏,就会导致整个集群的失效。因此可以配置成复制多个Fslmage 和EditLog 的副本, 一般会在本地磁盘和网络文件系统NFS 中分别存放。

SecondaryNameNode 是HDFS 架构中的一个组成部分,它用来保存名称节点中对HDFS 元数据信息的备份,减小Editlog 文件大小,从而缩短名称节点重启的时间。它一般是单独运行在一台机器上。

image-20200726150324648.png

  1. SecondaryNameNode 会定期和NameNode 通信,请求其停止使用EditLog 文件,暂时将新的写操作写到一个新的文件edit.new 中,这个操作是瞬间完成的,上层写日志的函数完全感觉不到差别。

  2. SecondaryNameNode 通过HTTP 方式从NameNode 上获取到Fslmage 和EditLog 文件,井下载到本地的相应目录下。

  3. SecondaryNameNode 将下载下来的Fslmage 载入到内存,然后一条一条地执行EditLog文件中的各项更新操作,使内存中的Fslmage 保持最新。

  4. SecondaryNameNode 执行完 3 操作之后,会通过post 方式将新的Fslmage 文件发送到NameNode 节点上。

  5. NameNode 将从SecondaryNameNode 接收到的新的Fslmage 替换旧的Fslmage 文件,同时将Edit.new 替换EditLog 文件,从而减小EditLog 文件大小。

第二名称节点相当于为名称节点设置一个“检查点” ,周期性备份名称节点中的元数据信息,但第二名称节点在HDFS 设计中只是一个冷备份,并不能起到“热备份”的作用。HDFS 设计并不支持当名称节点故障时直接切换到第二名称节点。

Hadoop环境搭建

Hadoop 是 一个用 Java 语言实现的开源软件框架,Hadoop的核心就是HDFSMapReduceYARN。HDFS为海量数据提供了存储,MapReduce为海量数据提供了计算框架,YARN把计算框架与资源管理彻底分离,统一管理计算框架的资源调度

所需软件列表

软件类型名称
VMware虚拟机 VMware-workstation-full-14.0.0-6661328.exe
Linux 操作系统 CentOS-7-x86_64-DVD-1810.iso
MobaXterm 终端模拟器 MobaXterm_20.0汉化.rar
JDK Java 语言的软件开发工具包 jdk-8u251-linux-x64.tar.gz
Hadoop 分布式系统基础架构 hadoop-2.7.3.tar.gz

安装 MobaXterm 终端模拟器

直接在虚拟机上进行命令操作和文件修改比较麻烦,通过一个仿终端工具来操作,提高效率,使用也更加方便。当然使用 XShell6 也是可以的。MobaXterm 是免费的,不过它的界面是英文的,初次使用可能不会太方便,我们这里提供一个中文汉化版,直接解压到指定目录即可使用。

熟悉 MobaXterm 工具,并创建一个会话,连接上述 Liunx 系统。

环境准备

Hadoop2.7.3 环境搭建官方地址

安装虚拟机和Linux操作系统,配置IP地址、主机名、防火墙、地址映射等

# 修改 ens32 虚拟网卡的IP地址
[root@node01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens32  
IPADDR="192.168.242.101" # 把 IP 地址修改为 101 ,保存退出
# 重启网络
[root@node01 ~]# systemctl restart network
# 修改主机名,永久(静态)修改   hostnamectl set-hostname node01   |   echo node01 > /etc/hostname
[root@node01 ~]# vim /etc/hostname  
node01
# 添加主机访问虚拟机的地址映射,HDFS节点访问和外部Web接口访问HDFS都会用到 | echo 192.168.242.101 node01 >> /etc/hosts
[root@node01 ~]# vim /etc/hosts
192.168.242.101 node01
# 关闭防火墙,禁用开机启动,Web接口访问Hadoop相关接口不会被拦截
[root@node01 ~]# firewall-cmd --state         # 查看防火墙状态
[root@node01 ~]# systemctl stop firewalld     # 关闭防火墙
[root@node01 ~]# systemctl disable firewalld   # 禁用防火墙开机启动
# 关闭 SELinux 安全子系统
[root@node01 ~]# vim /etc/selinux/config
#把 SELINUX=enforcing 改为 SELINUX=disabled
[root@node01 ~]# reboot 重启系统   / poweroff 关机
#####################测试配置是否生效#################################
[root@node01 ~]# firewall-cmd --state   # 查看防火墙状态
not running
# 修改宿主机 hosts 映射,添加虚拟机访问映射名 node01
$ C:WindowsSystem32driversetchosts  
192.168.242.101 node01

安装 JDK 与 Hadoop

使用 MobaXterm 远程连接虚拟机,进入 /usr/local 目录,进行 JDKHadoop 安装。

# 解压jdk 1.8
[root@node01 local]# tar -zxvf jdk-8u251-linux-x64.tar.gz      

# 重命名解压文件夹为 jdk ,方便后续配置和访问
[root@node01 local]# mv jdk1.8.0_251/ jdk                    

# 解压hadoop 2.7.3
[root@node01 local]# tar -zxvf hadoop-2.7.3.tar.gz  

# 重命名解压文件夹为 hadoop ,方便后续配置和访问
[root@node01 local]# mv hadoop-2.7.3 hadoop                  

# 配置 JDK 和 Hadoop 环境变量
[root@node01 local]# vim /etc/profile                        
# JAVA_HOME
export JAVA_HOME=/usr/local/jdk/
export PATH=$PATH:$JAVA_HOME/bin
#HADOOP_HOME
export HADOOP_HOME=/usr/local/hadoop/
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

# 重新加载 环境变量配置文件
[root@node01 local]# source /etc/profile                      

# 使用命令测试 java 环境是否配置正确
[root@node01 local]# java -version                            
java version "1.8.0_251"

# 使用命令测试 hadoop 环境是否配置正确
[root@node01 local]# hadoop version                            
Hadoop 2.7.3

配置 Hadoop 伪分布式环境

使用 MobaXterm 工具进行 Hadoop 配置文件编辑,/usr/local/hadoop/etc/hadoop/

  • 修改 hadoop-env.sh 设置 Hadoop 环境对应的 JDK

export JAVA_HOME=/usr/local/jdk
  • 修改 core-site.xml 配置文件

<configuration>
<!--NameNode的访问URI,也可以写为IP,8020为默认端口-->
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://node01:8020</value>
</property>

<!--临时数据目录,用来存放数据,格式化时会自动生成-->
<property>
  <name>hadoop.tmp.dir</name>
  <value>/usr/local/hadoop/data/tmp</value>
</property>
</configuration>
  • 修改 hdfs-site.xml 配置文件

<configuration>
<!--Block的副本数,伪分布式要改为1-->
<property>
  <name>dfs.replication</name>
  <value>1</value>
</property>

<!--NameNode 元数据存放地址-->
<property>
  <name>dfs.name.dir</name>
  <value>/usr/local/hadoop/data/namenode</value>
</property>

<!--DataNode 副本存放地址-->
<property>
  <name>dfs.data.dir</name>
  <value>/usr/local/hadoop/data/datanode</value>
</property>

<!--HDFS 临时存放地址-->
<property>
  <name>dfs.tmp.dir</name>
  <value>/usr/local/hadoop/data/tmp</value>
</property>

<!--配置有secondarynamenode的主机-->
<property>
  <name>dfs.namenode.secondary.http-address</name>
  <value>node01:50090</value>
</property>
</configuration>
  • 修改 slaves 配置文件

# 替换 slaves 中的节点名称
[root@node01 local]# echo node01 > /usr/local/hadoop/etc/hadoop/slaves  
  • 格式化HDFS并启动

# 格式化 HDFS ,由于已经配置过 Hadoop 的 bin 环境变量,则该命令可以在任意目录下运行
[root@node01 local]# hdfs namenode -format  

# 启动 HDFS 分布式文件系统 - 启动 namenode 元数据节点,负责管理文件切片存储
sbin/hadoop-daemon.sh start namenode    

# 启动 datanode 副本节点,负责存储文件切片,定时发送心跳和块状态报告
sbin/hadoop-daemon.sh start datanode

# 启动 secondarynamenode 镜像备份节点,同步元数据和操作日志
sbin/hadoop-daemon.sh start secondarynamenode      

# 查看所有 java 进程,验证 HDFS 的节点是否启动成功
[root@node01 local]# jps  
12176 DataNode
12085 NameNode
12270 SecondaryNameNode
12318 Jps

HDFS 的Web 管理界面

HDFS 提供了Web 管理界面,可以很方便地查看HDFS 相关信息,在浏览器地址栏中输入HDFS 的NameNodeWeb 访问地址,端口号为默认端口是 50070 ,如图所示。

可以使用 IP 地址访问 HDFS Web ,也可使用之前在 window 系统中配置的 hosts 映射名称 node01

1595998497632.png

在浏览器地址栏中输入HDFS 的 SecondaryNameNode 的Web 访问地址,端口号为默认端口是 50090 ,如图所示。

1595998497632.png

HDFS 操作常用shell 命令

我们可以利用HDFS shell 命令对 Hadoop 进行操作,利用这些命令可以完成 HDFS 中文档的上传、下载、复制、查看文件信息、格式化名称节点等操作。在终端输入命令, 查看 hdfs dfs 总共支持哪些操作。image-20200726151354027.png

可以看出hdfs dfs 命令的统一格式类似“ hdfs dfs -ls ”这种形式,即在“ - ”后面跟上具体的操作,绝大部分功能与Linux命令相似。需要查看某个命令的作用时,可以使用 hdfs dfs -help ls 查看。

[root@node01 ~]# vim hello.txt    # 创建文件
[root@node01 ~]# hdfs dfs -mkdir /input # HDFS上创建文件夹 hadoop fs -mkdir /input
[root@node01 ~]# hdfs dfs -put ./hello.txt /input # 将文件上传到HDFS
[root@node01 ~]# hdfs dfs -ls /input # 查看
[root@node01 ~]# hdfs dfs -cat /input/hello.txt # 本地查看
[root@node01 ~]# hdfs dfs -rm /input/hello.txt # 删除
[root@node01 ~]# hdfs dfs -rm -r /input 递归删除
   
# 循环查看目录信息
[root@node01 ~]# hdfs dfs -ls -R /

也可以通过 WebUI界面查看

1595999133956.png

YARN与MapRedcue

Hadoop YARN(Yet Another Resource Negotiator的缩写)是Hadoop的资源管理器系统,YARN 从Hadoop 2 引入,设计YARN 的最初目的是改善 MapReduce 的实现。后来YARN演变为一种资源调度框架,具有通用性,可为上层应用提供统一的资源管理和调度,可以支持其他的分布式计算模型(如Spark)。它的引用为集群在利用率、资源统一管理和数据共享方面带来了巨大的好处

1595920929240.png

它的基本设计思想是将MapRrsource V1.0 中的 JobTracker 拆分成了两个独立的服务:一个全局的资源管理器 ResourceManager 和每个应用程序特有的 ApplicationMaster 。其中 ResourceManager 负责整个系统的资源管理和分配,而 ApplicationMaster 负责单个应用程序的管理。

YARN 架构概述

下图所示是YARN的架构图,它由 Container、ResourceManager、NodeManager、ApplicationMaster 几个主要部分组成。

1595921029162.png

  • ResourceManager:负责整个系统的资源分配和管理,是一个全局的资源管理器。

  • ApplicationMaser: 管理一个在 YARN 内运行的应用程序的每个实例,负责协调来自 ResourceManager 的资源,与NodeManager 通信监视容器的执行和资源使用(CPU、内存等的资源分配)。

  • NodeManager: NodeManager 管理一个 YARN 集群中的每个节点。它定时向 ResourceManager 汇报本节点上的资源使用情况和各个Container 的运行状态,接收并处理来自 ApplicationManager 的 Container 启动/停止等请求。

  • Container: 是 YARN 中的资源抽象,它封装了某个节点上的多维度资源。如内存、CPU、磁盘、网络等,当ApplicationManager 向 ResourceManager 申请资源时,ResourceManager 为ApplicationManager 返回的资源便是用Container表示。YARN会为每个任务分配一个Container,且该任务只能使用该Container中描述的资源。

MapReduce概述

MapReduce 是 Google 公司开源的一项重要技术,它是一个编程模型,用以进行大数据量的计算。MapReduce 是一种简化的并行计算编程模型,它使那些没有多少并行计算经验的开发人员也可以开发并行应用程序。

MapReduce 采用 “分而治之”思想,把对大规模数据集的操作,分发给一个主节点管理下的各个字节点共同完成,然后整合各个字节点的中间结果,得到最终的计算结果。简而言之,MapReduce 就是“分散任务,汇总结果”,“分而治之,聚而合之”。

MapReduce的特点

  1. 易于编程。用它的一些简单接口,就可以完成一个分布式程序,这个分布式程序可以分布到大量廉价的 PC 上运行。也就是说写一个分布式程序,跟写一个简单的串行程序是一样的。也是因为这个特点,使得 MapReduce 编程变得非常流行。

  2. 良好的扩展性。当计算资源不能得到满足的时候,可以通过简单地增加计算机来扩展它的计算能力。

  3. 高容错性。设计MapReduce 的初衷就是使程序能够部署在廉价的 PC 上,这就要求它具有很高的容错性。比如一台主机出问题了,它可以把上面的计算任务转移到另外一个节点上运行,不至于使这个任务运行失败,而且这个过程不需要人工干预,完全由MapReduce 在内部完成。

  4. 能对PB级以上海量数据进行离线处理。MapReduce 适合离线处理而不适合实时处理。比如毫秒级别地返回一个结果,MapReduce 很难

MapReduce 不擅长的场景

  1. 实时计算:MapReduce 无法像 MySQL 一样,在毫秒或秒级内返回结果。

  2. 流式计算:流式计算的输入数据式动态的,而 MapReduce 的输入数据集是静态的,不能动态变化。比如:实时计算 Web Server 产生的日志,这是 MapReduce 不擅长的。

  3. DAG(有向图)计算:多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapRedice 并不是不能做,而是使用 MapReduce 做完后,每个MapReduce作业的输出结果都会写入磁盘,会制作大量的磁盘 I/O,降低性能。

MapReduce 编程模型

从MapReduce 自身的命名特点可以看出,MapReduce 至少由两部分组成:Map 和 Reduce。Map理解为“映射”,Reduce理解为“化简”。用户只需要编写 map() 和 reduce() 两个方法,即可完成简单的分布式程序的设计。

1596008040226.png

MapReduce 执行过程简要说明如下

  1. 读取 HDFS 文件内容,把内容中的每一行解析成一个个的<key, value >键值对。key是每行行首相对于文件起始位置的字节偏移量,value 就是具体的值,一个文件切片对应一个 map task ,每读取一行就会调用一次 map

  2. 自定义 map 函数,编写自己的业务逻辑,对输入的<key, value>处理,转换成新的<key,value>输出作为中间结果,每一个 map task 都是相互独立的,互不干扰

  3. 为了让 reduce 可以并行处理 map 的结果,根据业务要求需要对 map 的输出进行一定的分区( Partition) 对不同分区上的数据,按照 key 进行排序分组,相同 key的value 放到一个集合中,把分组后的数据进行归约。每个 reduce 会接收各个map中相同分区中的数据,对多个 map任务的输出,按照不同的分区通过网络 copy 到不同 reduce 节点。这个过程称为 Shuffle洗牌 ,即Shuffle就是把我们 map 中的数据分发到 reduce 中去的一个过程。

  4. 自定义 reduce 函数,编写自己的业务逻辑,对输入的<key,value>键值对进行处理,转换成新的<key,value>输出,reduce 默认分区规则:key.hashcode() % reduce 数量 = 分区号,reduce task 数量我们可以设置的,默认是1 ,job.setNumReduceTasks(3);

  5. 把 reduce 的输出保存到新的文件中。

MapReduce 要求<key , value>的key 和value都要实现 Writable 接口,从而支持Hadoop的序列化和反序列化。

MapReduce 处理的数据都是HDFS的数据(或 HBase)。

配置YARN和MapReduce环境

通过设置一些参数并另外运行ResourceManager守护程序和NodeManager守护程序,以伪分布式模式在YARN上运行MapReduce作业。

  • yarn-env.sh、mapred-env.sh 添加 JAVA_HOME 配置

export JAVA_HOME=/usr/local/jdk
  • mapred-site.xml ,把 mapred-sit.xml.template 复制一份,修改为 mapred-site.xml 并添加如下信息。

<configuration>
<!---计算框架的运行平台配置 -->
<property>
  <name>mapreduce.framework.name</name>
  <value>yarn</value>
</property>
</configuration>
  • yarn-site.xml 添加相应配置

<configuration>
<!---YARN 的节点辅助服务配置 -->
<property>
  <name>yarn.nodemanager.aux-services</name>
  <value>mapreduce_shuffle</value>
</property>
<property>
  <name>yarn.resourcemanager.hostname</name>
  <!--默认是0.0.0.0 本地访问-->
  <value>node01</value>
</property>
</configuration>
  • slaves 配置 IP 地址或主机名,它指定了 DataNodeNodeManager所在的机器。DataNode一般和NodeManager在同一台机器上。

node01
  • 启动 yarn 中的 resourcemanagernodemanager

# 启动资全局源管理器
[root@node01 ~]# yarn-daemon.sh start resourcemanager  

# 启动节点资源管理器
[root@node01 ~]# yarn-daemon.sh start nodemanager      

# 查看启动的所有 Java 进程
[root@node01 ~]# jps        
16768 SecondaryNameNode
17601 ResourceManager
16579 DataNode
17875 Jps
17835 NodeManager
16477 NameNode
  • 访问 YARN 的Web UI界面,验证是否配置成功,默认端口号是 8088**``**

1596001083802.png

MapReduce 经典入门案例 - WordCount 程序

WordCount 案例是大数据并行计算的经典案例,它实现的主要功能是统计文本中每个单词出现的次数。

  1. 案例目录:/usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar

  2. 数据准备:在 ~ 目录下创建一个words.txt 文件,并录入要统计的单词信息,注意以空格分隔

  3. 把测试数据上传到 HDFS 上,因为 MapReduce 是读取不到本地数据的:hdfs dfs -put ./words.txt /input

  4. 使用 yarn 命令来运行 mapreduce 程序:mapreduce程序的结果输出目录不能提前存在,如果存在就报错 yarn jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount /input/words.txt /output

  5. 查看执行结果 : hdfs dfs -text /output/part-r-00000

    hdfs dfs ---->> hadoop fs

1596002690155.png

历史服务和日志聚合

历史服务:查看已经运行完成的MapReduce作业记录,比如本次作业用了多少Mapper、Reducer,还能看到作业提交时间、作业启动时间、作业完成时间等信息。

  • 配置日志服务器

  1. 修改 yarn-site.xml 文件

<!--启用日志聚合功能-->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>

<!--日志保留时间,单位秒-->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>86400</value>
</property>
  1. 修改 mapred-site.xml 文件

<!--JobHistory服务的IPC地址(IPC:Inter-Process Communication进程间通信)-->
<property>
  <name>mapreduce.jobhistory.address</name>
  <value>node01:10020</value>
</property>

<!--日志的web访问地址-->
<property>
  <name>mapreduce.jobhistory.webapp.address</name>
  <value>node01:19888</value>
</property>
  • 重启 YARN 服务

[root@node01 ~]# stop-yarn.sh   
[root@node01 ~]# start-yarn.sh
[root@node01 ~]# mr-jobhistory-daemon.sh start historyserver
  • 再次运行任务,必需改变输出目录

[root@node01 ~]# yarn jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount /input/words /output/words
[root@node01 ~]# hdfs dfs -text /output/words/part*

需要在(注意:是Windows目录,而不是Linux)C:WindowsSystem32driversetc里面的hosts文件里添加映射 192.168.242.131 node01

此时再点击 history,就能看到结果。

1596762825258.png

1596762857324.png

SSH 远程登录安全协议

SSH(Secure Shell)是建立在应用层和传输层基础上的安全协议。SSH是目前较可靠,专为远程登陆会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。

在Hadoop中,我们启动HDFS时,是 NameNodeDataNodeSecondaryNameNode 依次启动,关闭依然,那么可不可以一个命令搞定呢?答案是肯定的,使用 sbin/start-dfs.sh,但是每一个服务启动都需要输入一次密码,比较麻烦,我们就可以使用 SSH 远程登录安全协议配置免密登录

# 在/root/.ssh/目录下会生成 id_rsa(私钥)、id_rsa.pub(公钥)
[root@node01 ~]# ssh-keygen # 4个回车
# 拷贝公钥到其它机器上,用于免密访问
[root@node01 ~]# ssh-copy-id node01 # 每台机器都运行一次,则对应的公钥信息会存储在 /root/.ssh/authorized_keys 文件中
# 验证免密登录配置
[root@node01 ~]# ssh node01 # 使用 ssh 登录到 node01
[root@node01 ~]# exit       # 退出 node01 访问
# Hadoop 一个命名启动 或 停止 HDFS所有节点
[root@node01 ~]# start-dfs.sh

 

小石小石摩西摩西的学习笔记,欢迎提问,欢迎指正!!!
原文地址:https://www.cnblogs.com/shijingwen/p/13682007.html