文章目录

  • 前言
  • 1.大数据简介
    • (1)知识体系
    • (2)大数据定义及应用场景
    • (3)大数据发展趋势及从业人员发展路线
  • 2.Hadoop简介
  • 3.Hadoop的重要组成
  • 4.Apache Hadoop 完全分布式集群搭建
    • (1)虚拟机环境准备
    • (2)环境变量配置
    • (3)集群规划实施
    • (4)编写集群分发脚本
    • (5)集群启动
      • Ⅰ 单节点启动
      • Ⅱ 集群群起
      • Ⅲ 集群停止
    • (6)集群测试
    • (7)历史日志服务器配置
  • 总结

前言

本文主要介绍了Hadoop简介及Apache Hadoop完全分布式集群搭建,包括大数据简介、Hadoop简介、Hadoop的重要组成和Apache Hadoop 完全分布式集群搭建。

1.大数据简介

(1)知识体系

大数据技术解决的主要是海量数据的存储和计算

Hadoop的广义和狭义之分:

(1)狭义的Hadoop:

狭义的Hadoop指的是一个框架,Hadoop是由三部分组成:

  • HDFS

    分布式文件系统,用于存储。

  • MapReduce

    分布式离线计算框架,用于计算。

  • Yarn

    资源调度框架

(2)广义的Hadoop:

广义Hadoop不仅仅包含Hadoop框架,除了Hadoop框架之外还有一些辅助框架:

  • Flume

    日志数据采集。

  • Sqoop

    关系型数据库数据的采集。
    

  • Hive

    深度依赖Hadoop框架完成计算(SQL)。

  • Hbase

    大数据领域的数据库(MySQL)。

  • Sqoop

    数据的导出。

广义Hadoop指的是一个生态圈。

核心知识体系如下:

  • 大数据简介(定义,特点,应用场景,发展趋势,职业发展路线)

  • Hadoop简介(历史,发展路线-版本变更,发行版(CDH))

  • Hadoop的重要组成(hdfs,mapreduce,yarn)

  • Apache Hadoop完全分布式集群搭建

  • HDFS分布式文件系统(架构,原理,常用api,元数据管理,权限,日志采集的综合案例)

  • MapReduce分布式计算框架 (原理,常用的编程规范等,大量案例练习-分区,排序-快排-归并排序,压缩,自定义组件,综合案例)

  • Yarn资源调度框架(架构,原理,三种资源调度策略)

  • Apche Hadoop核心源码剖析(nn,dn启动流程源码分析,nn高并发的支撑原理,hadoop3.0新特性)

  • 调优及二次开发示例(hdfs,mr,yarn调优,nn常见GC问题,完成二次开发编译源码)

(2)大数据定义及应用场景

大数据的定义:

大数据是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

大数据的特点(5V):

  • 大量

    采集、存储和计算的数据量都非常大。

    随着科学技术的发展和互联网的普及,全球的数据量已经大到爆了,而传统的关系型数据库根本处理不了如此海量的数据。

  • 高速

    在大数据时代,数据的创建、存储、分析都要求被高速处理,比如电商网站的个性化推荐尽可能要求实时完成推荐,这也是大数据区别于传统数据挖掘的显著特征。

  • 多样

    数据形式和来源多样化,包括结构化、半结构化和非结构化数据,具体表现为网络日志、音频、视频、图片、地理位置信息等,多类型的数据对数据的处理能力提出了更高的要求。

  • 真实

    确保数据的真实性,才能保证数据分析的正确性。

  • 低价值

    数据价值密度相对较低,或者说是浪里淘沙却又弥足珍贵

    互联网发展催生了大量数据,信息海量,但价值密度较低,如何结合业务逻辑并通过强大的机器算法来挖掘数据价值,是大数据时代最需要解决的问题,也是一个有难度的课题。

随着大数据的发展,大数据技术已经广泛应用在众多行业,比如仓储物流、电商零售、汽车、电信、生物医学、人工智能、智慧城市等等领域,包括在疫情防控战中,大数据技术也发挥了重要的作用:

  • 仓储物流

    大数据技术驱动了仓储物流领域的智能化发展,以苏宁为例,苏宁物流可在全国的各级仓库间实现智能分仓、就近备货和预测式调拨,实现“客户需要的商品就在离客户最近的配送中心”。

  • 电商零售

    - 零售业“啤酒+纸尿裤”案例

    - 个性推荐

    - “双11购物节”实时销售额大屏

  • 汽车

    利用了大数据和物联网技术的无人驾驶汽车,在不远的未来将走入我们的日常生活。

  • 电信

    移动联通根据用户年龄、职业、消费情况,分析统计哪种套餐适合哪类人群,对市场人群精准定制。

  • 生物医学

    大数据可以帮助我们实现流行病预测、智慧医疗、健康管理,同时还可以帮助我们解读DNA,了解更多的生命奥秘。比如影像大数据支撑下的早期肺癌支撑平台,基于大量病例数据样本,制定早期肺癌高危人群预警指标。

  • 人工智能

    人工智能的基础上就是大数据,在大量数据训练的基础上得到“经验”。

    典型的例子是AlphaGo战胜人类棋手,因为AlphaGo已经经过了大量的下棋训练,训练得到了“下棋经验”。

  • 智慧城市

    大数据有效支撑智慧城市发展,成为城市的”数据大脑“。比如,在智慧城市建设上,杭州始终走在全国前列。如覆盖面广的移动支付、新颖的在线医疗模式、创新的物流运输模式,都受到较大关注。

大数据的价值,远远不止于此,大数据对各行各业的渗透,大大推动了社会生产和生活,未来必将产生重大而深远的影响。

(3)大数据发展趋势及从业人员发展路线

大数据行业发展趋势的两个层面:

(1)国家政策层面

  1. 2015年党的十八届五中全会提出“实施国家大数据战略”,国务院印发《促进大数据发展行动纲要》,大数据技术和应用处于创新突破期,国内市场需求处于爆发期,我国大数据产业面临重要的发展机遇。

  2. 2017年十九大报告明确 “推动互联网、大数据、人工智能和实体经济深度融合”。

  3. 2020年全国政协十三届三次会议新闻发布会上,更进一步强调:大数据、人工智能、5G是引领未来发展的战略性技术。

显然,发展大数据是我国的战略性决策,前景自然不言而喻。

(2)高校教育和就业层面

  1. 2017年北京大学、中国人民大学、北京邮电大学等25所高校成功申请开设大数据课程

  2. 大数据属于高新技术,大牛少,升职竞争小

  3. 2020年5月6日,人力资源和社会保障部发布《新职业—大数据工程技术人员就业景气现状分析报告》,报告显示:预计2020年中国大数据行业人才需求规模将达210万,2025年前大数据人才需求仍将保持30%~40%的增速,需求总量在2000万人左右。

  4. 在北京大数据开发工程师的平均薪水已经超越 1.5w 直逼2w,而且目前还保持强劲的发展势头。

大数据职业发展路线:

目前大数据高、中、低三个档次的人才都很缺。 现在我们谈大数据,就像当年谈电商一样,未来前景已经很明确,接下来就是优胜劣汰,竞争上岗。不想当架构师的程序员不是好程序员!

大数据发展到现阶段,涉及大数据相关的职业岗位也越来越精细。从职业发展来看,由大数据开发、挖掘、算法、到架构。从级别来看,从工程师、高级工程师,再到架构师,甚至到科学家。而且,契合不同的行业领域,又有专属于这些行业的岗位衍生,如涉及金融领域的数据分析师等。

大数据的相关工作岗位有很多,有数据分析师、数据挖掘工程师、大数据开发工程师、大数据产品经理、可视化工程师、爬虫工程师、大数据运营经理、大数据架构师、数据科学家等
等。

从事大数据岗位包括:

  • ETL工程师—数据清洗

  • 数据仓库工程师—数据仓库搭建

  • 实时流处理工程师

  • 用户画像工程师

  • 数据挖掘

  • 算法工程师

  • 推荐系统工程

2.Hadoop简介

Hadoop 是一个适合大数据的分布式存储和计算平台
前面已经提到,狭义上说Hadoop就是一个框架平台,广义上讲Hadoop代表大数据的一个技术生态圈,包括很多其他软件框架,如下:

Hadoop生态圈技术栈
Hadoop(HDFS + MapReduce + Yarn)
Hive 数据仓库工具
HBase 海量列式非关系型数据库
Flume 数据采集工具
Sqoop ETL工具
Kafka 高吞吐消息中间件
……

Hadoop 的发展历程如下:

Nutch —> Google论文(GFS、MapReduce)
—> Hadoop产生
—> 成为Apache顶级项目
—> Cloudera公司成立(Hadoop快速发展)

(1)Hadoop最早起源于Nutch,创始人是Doug Cutting

Nutch 是一个开源 Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬虫,但随着抓取网页数量的增加,遇到了严重的可扩展性问题——如何解决数十亿网页的存储和索引问题。

(2)2003年、2004年谷歌发表的两篇论文为该问题提供了可行的解决方案:

GFS,可用于处理海量网页的存储;

MapReduce,可用于处理海量网页的索引计算问题。

其中,Google的三篇论文(三驾马车)分别是:

  • GFS:Google的分布式文件系统(Google File System)

  • MapReduce:Google的分布式计算框架

  • BigTable:大型分布式数据库

发展演变关系:

  • GFS —> HDFS

  • oogle MapReduce —> Hadoop MapReduce

  • BigTable —> HBase

随后,Google公布了部分GFS和MapReduce思想的细节,Doug Cutting等人用2年的业余时间实现了DFS和MapReduce机制,使Nutch性能飙升。

(3)2005年,Hadoop 作为Lucene的子项目Nutch的一部分引入Apache。

(4)2006年,Hadoop从Nutch剥离出来独立。

(5)2008年,Hadoop成为Apache的顶级项目。

Hadoop名字来源于Hadoop之父Doug Cutting儿子的毛绒玩具象:

Hadoop的特点如下:

Hadoop的发行版本指不同的分支:

目前Hadoop发行版非常多,有Cloudera发行版(CDH)、Hortonworks发行版、华为发行版、Intel发行版等,所有这些发行版均是基于Apache Hadoop衍生出来的,之所以有这么多的版本,是由Apache Hadoop的开源协议决定的(任何人可以对其进行修改,并作为开源或商业产品发布/销售)。

企业中主要用到的三个版本分别是:Apache Hadoop版本(最原始的,所有发行版均基于这个版本进行改进)、Cloudera版本(Cloudera’s Distribution Including Apache Hadoop,简称“CDH”)、Hortonworks版本(Hortonworks Data Platform,简称“HDP”)。

分别如下:

  • Apache Hadoop

    原始版本,学习环境使用。
    官网地址:http://hadoop.apache.org/。

    优点:拥有全世界的开源贡献,代码更新版本比较快,学习非常方便;

    缺点:版本的升级,版本的维护,以及版本之间的兼容性
    

    Apache所有软件的下载地址(包括各种历史版本):

    http://archive.apache.org/dist/。

  • 软件收费版本ClouderaManager

    CDH版本,生产环境使用。

    官网地址:https://www.cloudera.com/

    Cloudera主要是美国一家大数据公司,在Apache开源Hadoop的版本上,通过自己公司内部的各种补丁,实现版本之间的稳定运行,大数据生态圈的各个版本的软件都提供了对应的版本,解决了版本的升级困难,版本兼容性等各种问题,生产环境强烈推荐使用。

  • 免费开源版本HortonWorks

    HDP版本,生产环境使用。

    官网地址:https://hortonworks.com/

    hortonworks主要是雅虎主导Hadoop开发的副总裁,带领二十几个核心成员成立Hortonworks,核心产品软件HDP(ambari),HDF免费开源,并且提供一整套的web管理界面,供我们可以通过web界面管理我们的集群状态。

    web管理界面软件HDF网址:http://ambari.apache.org/。

    因为HortonWorks已经被Cloudera收购,所以HDP的使用也可能会逐渐减少,商用以CDH为主。

目前使用Apache Hadoop,其版本更迭如下:

  1. 0.x 系列版本:Hadoop当中最早的一个开源版本,在此基础上演变而来的1.x以及2.x的版本;

  2. 1.x 版本系列:Hadoop版本当中的第二代开源版本,主要修复0.x版本的一些bug等;

  3. 2.x 版本系列:架构产生重大变化,引入了yarn平台等许多新特性;

  4. 3.x 版本系列:EC技术、Yarn的时间轴服务等新特性。

3.Hadoop的重要组成

狭义的Hadoop由四部分组成:

  • HDFS(分布式文件系统)

  • MapReduce(分布式计算框架)

  • Yarn(资源协调框架)

  • Common模块

(1)HDFS(Hadoop Distribute File System )——高可靠、高吞吐量的分布式文件系统

HDFS的思想是分而治之,主要功能如下:

  • 数据切割

    将海量数据进行拆分,以保证可以在单台机器上进行保存。

    例如100T数据拆分为10G一个数据块由一个电脑节点存储这个数据块。

  • 制作副本

    由于电脑可能出现宕机的情况,所以需要制作副本,让另外的电脑也保存相同的数据。

  • 分散储存

    将数据切割后,分散存储在不同的机器上,同时在另外的机器上有相同数据的副本。

图示如下:

HDFS属于Master/Slave(主从架构):

  • NameNode(nn)

    属于Master节点,主要负责管理和维护元数据:

    存储文件的元数据,元数据记录了文件名、文件目录结构、文件属性(生成时间、副本数、文件权限),以及每个文件的块列表和块所在的DataNode节点信息等。
    

  • SecondaryNameNode(2nn)

    辅助NameNode管理和维护元数据,用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据快照。

  • DataNode(dn)

    属于Slave节点,负责存储文件数据块:

    在本地文件系统存储文件块数据,以及块数据的校验
    

其中,NN、2NN、DN既是角色名称、进程名称,也代指电脑节点名称。

HDFS存入过程:

对于大数据进行拆分(切割)得到数据块,可能得到多个数据块,由多个DataNode进行存储。

HDFS获取文件过程:

向NameNode请求获取到之前存入文件的块以及块所在的DataNode的信息,分别下载并最终合并,就得到之前的文件。

(2)Hadoop MapReduce——一个分布式的离线并行计算框架

MapReduce的思想也是分而治之,主要功能如下:

  • 拆解任务

    将数据进行切分,得到切片。

  • 分散处理

  • 汇整结果

图示如下:

MapReduce计算=Map阶段+Reduce阶段MapReduce计算 = Map阶段 + Reduce阶段MapReduce计算=Map阶段+Reduce阶段:

  • Map阶段就是“分”的阶段

    将数据切分到多个节点后,多个节点并行处理 输入数据,即每个节点负责一份数据的计算,并得到部分结果。

  • Reduce阶段就是“合”的阶段

    对Map阶段的输出结果进行汇总,得到全局的结果。

(3)Hadoop Yarn——作业调度与集群资源管理的框架

Yarn负责集群中计算资源的分配和作业任务的调度:

Yarn架构也是主从架构主要角色如下:

  • ResourceManager(rm)

    是Master,处理客户端请求、启动/监控ApplicationMaster、监控NodeManager、资源分配与调度。

  • NodeManager(nm)

    是Slave,单个节点上的资源管理、处理来自ResourceManager的命令、处理来自ApplicationMaster的命令。

  • ApplicationMaster(am)

    是计算任务专员,数据切分、为应用程序(任务)申请资源,并分配给内部任务、任务监控与容错。

  • Container

    对任务运行环境的抽象,一个Container负责一个Task,封装了CPU、内存等多维资源以及环境变量、启动命令等任务运行相关的信息,可以理解为虚拟资源集合或小型计算机。

(4)Hadoop Common——支持其他模块的工具模块

包括以下几部分:

  • Configuration

    公共的配置,包括集群节点、节点资源、IP、主机名、参数等配置项

  • RPC

    远程过程调用,是分布式框架中多个节点之间进行网络通讯的首选方式,高效、稳定、安全,Hadoop中实现了Hadoop RPC框架。

  • 序列化机制

  • 日志操作

4.Apache Hadoop 完全分布式集群搭建

(1)虚拟机环境准备

Hadoop框架是采用Java语言编写的,所以需要Java环境(JVM)才能运行,即虚拟机中必须安装JDK,同时必须使用JDK8版本,而不能使用更高的版本,因为在编写Hadoop时使用的就不是JDK8以上的版本。

之前在虚拟机上安装的就是jdk-8u231-linux-x64。

Hadoop搭建的方式包括3种:

  • 单机模式

    单节点、不是集群,生产不会使用这种模式。

  • 单机伪分布式模式

    单节点、多线程模拟集群的效果,因为发挥的也只是一台电脑的性能,因此生产中不会使用。

  • 完全分布式模式

    多台节点,真正的分布式Hadoop集群的搭建,生产环境建议使用这种方式。

完全分布式集群需要多台电脑,目前可以使用VMWare软件虚拟三台Linux节点,同时建议系统选择CentOS 7,之前已经准备好了,同时已经完成静态IP配置、关闭防火墙、修改主机名、配置免密登录和集群时间同步等操作。

之前已经在虚拟机中安装好了JDK和Tomcat,并且是将它们安装在/opt/software目录下的,将Hadoop安装到相同的目录。

在安装之前需要下载Hadoop的安装包,可以到https://hadoop.apache.org/releases.html下载最新版,也可以在https://archive.apache.org/dist/hadoop/common/中选择合适的版本进行下载,这里选择2.9.2版本。

可以先点击https://archive.apache.org/dist/hadoop/common/hadoop-2.9.2/hadoop-2.9.2.tar.gz下载到本地,再使用工具上传到虚拟机的/opt/software目录下,也可以直接在虚拟机的/opt/software目录下执行wget https://archive.apache.org/dist/hadoop/common/hadoop-2.9.2/hadoop-2.9.2.tar.gz进行下载,可以根据需要选择。

在使用时,可以参考Hadoop官方文档https://hadoop.apache.org/docs/r2.9.2/。

(2)环境变量配置

现在进行集群规划,对3台虚拟机的角色分布如下:

框架 node01 node02 node03
HDFS NameNode、DataNode DataNode SecondaryNameNode、DataNode
Yarn NodeManager NodeManager NodeManager、ResourceManager

以node01为NameNode,所以也只需要在这一台机器下载安装Hadoop。

现在在node01上安装Hadoop:

(1)解压文件

进入software目录cd /opt/software,解压之前上传的Hadoop安装包tar -xzvf hadoop-2.9.2.tar.gz,再将安装包移动到package目录mv hadoop-2.9.2.tar.gz ../packages/,查看software目录:

[root@node01 software]$ ll -ht
总用量 0
drwxr-xr-x. 3 root root     69 8月  20 14:22 tomcat
drwxr-xr-x. 3 root root     26 8月  20 14:09 java
drwxr-xr-x  9  501 dialout 149 11月 13 2018 hadoop-2.9.2

hadoop-2.9.2就是安装的目录。

(2)配置环境变量

编辑profile文件vim /etc/profile,添加Hadoop到环境变量,在末尾添加如下内容即可:

# HADOOP_HOME
export HADOOP_HOME=/opt/software/hadoop-2.9.2
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

其中,安装路径/opt/software/hadoop-2.9.2可以根据自己的需要进行修改;

保存退出后,再执行source /etc/profile使环境变量生效。

可以使用hadoop version命令验证Hadoop是否安装成功,如输出类似如下,则说明安装成功:

[root@node01 software]$ hadoop version
Hadoop 2.9.2
Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r 826afbeae31ca687bc2f8471dc841b66ed2c6704
Compiled by ajisaka on 2018-11-13T12:42Z
Compiled with protoc 2.5.0
From source with checksum 3a9939967262218aa556c684d107985
This command was run using /opt/software/hadoop-2.9.2/share/hadoop/common/hadoop-common-2.9.2.jar

在安装成功之后,可以查看Hadoop的安装目录,如下:

[root@node01 software]$ cd hadoop-2.9.2/
[root@node01 hadoop-2.9.2]$ ll -ht
总用量 128K
drwxr-xr-x 2 501 dialout  106 11月 13 2018 include
drwxr-xr-x 2 501 dialout  194 11月 13 2018 bin
drwxr-xr-x 2 501 dialout  239 11月 13 2018 libexec
drwxr-xr-x 3 501 dialout 4.0K 11月 13 2018 sbin
drwxr-xr-x 3 501 dialout   20 11月 13 2018 etc
drwxr-xr-x 3 501 dialout   20 11月 13 2018 lib
-rw-r--r-- 1 501 dialout 104K 11月 13 2018 LICENSE.txt
-rw-r--r-- 1 501 dialout  16K 11月 13 2018 NOTICE.txt
-rw-r--r-- 1 501 dialout 1.4K 11月 13 2018 README.txt
drwxr-xr-x 4 501 dialout   31 11月 13 2018 share

可以看到,此时各个目录的属主和属组是501和dialout,而之后都是使用root用户来进行Hadoop集群的相关操作,同时需要分发到其他节点,为了保证属主和属组都正常、避免出现信息混乱,因此这里需要修改Hadoop安装目录所属用户和用户组,执行命令chown -R root:root /opt/software/hadoop-2.9.2/,执行后再查看,如下:

[root@node01 hadoop-2.9.2]$ ll .. -ht
总用量 0
drwxr-xr-x. 3 root root  69 8月  20 14:22 tomcat
drwxr-xr-x. 3 root root  26 8月  20 14:09 java
drwxr-xr-x  9 root root 149 11月 13 2018 hadoop-2.9.2
[root@node01 hadoop-2.9.2]$ ll -ht
总用量 128K
drwxr-xr-x 2 root root  106 11月 13 2018 include
drwxr-xr-x 2 root root  194 11月 13 2018 bin
drwxr-xr-x 2 root root  239 11月 13 2018 libexec
drwxr-xr-x 3 root root 4.0K 11月 13 2018 sbin
drwxr-xr-x 3 root root   20 11月 13 2018 etc
drwxr-xr-x 3 root root   20 11月 13 2018 lib
-rw-r--r-- 1 root root 104K 11月 13 2018 LICENSE.txt
-rw-r--r-- 1 root root  16K 11月 13 2018 NOTICE.txt
-rw-r--r-- 1 root root 1.4K 11月 13 2018 README.txt
drwxr-xr-x 4 root root   31 11月 13 2018 share

可以看到,此时Hadoop安装目录的各个子目录的属主和数组已经修改。

安装目录中各个部分的含义如下:

  • bin目录

    对Hadoop进行操作的相关命令,如hadoop、hdfs等,如下:

./bin/
├── container-executor
├── hadoop
├── hadoop.cmd
├── hdfs
├── hdfs.cmd
├── mapred
├── mapred.cmd
├── rcc
├── test-container-executor
├── yarn
└── yarn.cmd

    其中,以.cmd结尾的是在Windows上使用的,其他是在Linux上使用的,包含了hadoop、hdfs和yarn,因为之前将该目录配置到了环境变量,所以可以执行hadoop version命令。

  • etc目录

    Hadoop的配置文件目录,如hdfs-site.xml、core-site.xml等。

  • lib目录

    Hadoop本地库(解压缩的依赖)。

  • libexec目录

    针对本地操作系统的依赖库。

  • include目录

    包含了jar包。

  • sbin目录

    存放的是Hadoop集群启动和停止的相关脚本、命令,如下:

./sbin/
├── distribute-exclude.sh
├── FederationStateStore
│   ├── MySQL
│   │   ├── dropDatabase.sql
│   │   ├── dropStoreProcedures.sql
│   │   ├── dropTables.sql
│   │   ├── dropUser.sql
│   │   ├── FederationStateStoreDatabase.sql
│   │   ├── FederationStateStoreStoredProcs.sql
│   │   ├── FederationStateStoreTables.sql
│   │   └── FederationStateStoreUser.sql
│   └── SQLServer
│       ├── FederationStateStoreStoreProcs.sql
│       └── FederationStateStoreTables.sql
├── hadoop-daemon.sh
├── hadoop-daemons.sh
├── hdfs-config.cmd
├── hdfs-config.sh
├── httpfs.sh
├── kms.sh
├── mr-jobhistory-daemon.sh
├── refresh-namenodes.sh
├── slaves.sh
├── start-all.cmd
├── start-all.sh
├── start-balancer.sh
├── start-dfs.cmd
├── start-dfs.sh
├── start-secure-dns.sh
├── start-yarn.cmd
├── start-yarn.sh
├── stop-all.cmd
├── stop-all.sh
├── stop-balancer.sh
├── stop-dfs.cmd
├── stop-dfs.sh
├── stop-secure-dns.sh
├── stop-yarn.cmd
├── stop-yarn.sh
├── yarn-daemon.sh
└── yarn-daemons.sh

    包含了sh和cmd文件。

  • share目录

    Hadoop的一些依赖jar、公开文档和官方案例等。

(3)集群规划实施

这里选择先在node01节点把所有配置项配置完成后,再将配置分发给其他节点,来保证所有结点的配置是统一的。

Hadoop集群配置包括三部分:

  • HDFS集群配置

  • MapReduce集群配置

  • Yarn集群配置

先在node01节点进行HDFS集群配置,步骤如下:

(1)将JDK路径明确配置给HDFS——修改hadoop-env.sh

在Hadoop安装目录进入Hadoop配置文件目录cd etc/hadoop/,可以看到配置文件:

.
├── capacity-scheduler.xml
├── configuration.xsl
├── container-executor.cfg
├── core-site.xml
├── hadoop-env.cmd
├── hadoop-env.sh
├── hadoop-metrics2.properties
├── hadoop-metrics.properties
├── hadoop-policy.xml
├── hdfs-site.xml
├── httpfs-env.sh
├── httpfs-log4j.properties
├── httpfs-signature.secret
├── httpfs-site.xml
├── kms-acls.xml
├── kms-env.sh
├── kms-log4j.properties
├── kms-site.xml
├── log4j.properties
├── mapred-env.cmd
├── mapred-env.sh
├── mapred-queues.xml.template
├── mapred-site.xml.template
├── slaves
├── ssl-client.xml.example
├── ssl-server.xml.example
├── yarn-env.cmd
├── yarn-env.sh
└── yarn-site.xml

修改hadoop-env.shvim hadoop-env.sh指定JDK安装路径,如下:

# The java implementation to use.
# export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/opt/software/java/jdk1.8.0_231

其中,JDK安装路径可以通过echo $JAVA_HOME命令获取;

保存退出。

(2)指定NameNode节点以及数据存储目录——修改core-site.xml

修改core-site.xmlvim core-site.xml,如下:

<configuration>
<!-- 指定HDFS中NameNode的地址 -->
<property><name>fs.defaultFS</name><value>hdfs://node01:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property><name>hadoop.tmp.dir</name><value>/opt/software/hadoop-2.9.2/data/tmp</value>
</property>
</configuration>

其中,配置项需要放到core-site.xml文件中的configuration标签中,配置才会生效;

Hadoop对于XML配置文件都有默认配置,配置项的含义可以从文档https://hadoop.apache.org/docs/r2.9.2/hadoop-project-dist/hadoop-common/core-default.xml中进行查询:例如fs.defaultFS配置项是配置文件系统的名称,配置值是一个 URI,用于确定文件系统的主机、端口等;hadoop.tmp.dir配置项是其他临时目录的基础。

保存后退出。

(3)指定SecondaryNameNode节点——修改hdfs-site.xml

编辑hdfs-site.xmlvim hdfs-site.xml,如下:

<configuration>
<!-- 指定Hadoop辅助名称节点主机配置 -->
<property><name>dfs.namenode.secondary.http-address</name><value>node03:50090</value>
</property>
<!--副本数量 -->
<property><name>dfs.replication</name><value>3</value>
</property>
</configuration>

其中,指定了副本数量后,每个数据块有3个副本;

也可以在https://hadoop.apache.org/docs/r2.9.2/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml中查看默认配置;

保存后退出。

(4)指定DataNode从节点——修改etc/hadoop/slaves文件,每个节点配置信息占一行)

编辑slavesvim slaves,如下:

node01
node02
node03

需要确保本文件中每一行结尾不允许有空格、只有节点主机名,同时文件中不允许有空行,否则读取配置时无法识别。

再进行MapReduce集群配置:

(1)将JDK路径明确配置给MapReduce——修改mapred-env.sh

编辑mapred-env.shvim mapred-env.sh如下:

# export JAVA_HOME=/home/y/libexec/jdk1.6.0/
export JAVA_HOME=/opt/software/java/jdk1.8.0_231

保存退出。

(2)指定MapReduce计算框架运行Yarn资源调度框架——修改mapred-site.xml

修改mapred-site.xml配置文件名cp mapred-site.xml.template mapred-site.xml,再编辑mapred-site.xmlvim mapred-site.xml,如下:

<configuration>
<!-- 指定MR运行在Yarn上 -->
<property><name>mapreduce.framework.name</name><value>yarn</value>
</property>
</configuration>

mapred-site.xml默认配置可参考https://hadoop.apache.org/docs/r2.9.2/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml;

保存退出。

最后进行Yarn集群配置:

(1)将JDK路径明确配置给Yarn——修改yarn-env.sh

修改yarn-env.shvim yarn-env.sh,如下:

# export JAVA_HOME=/home/y/libexec/jdk1.6.0/
export JAVA_HOME=/opt/software/java/jdk1.8.0_231

保存退出。

(2)指定ResourceManager老大节点所在计算机节点——修改yarn-site.xml

编辑yarn-site.xmlvim yarn-site.xml,如下:

<configuration><!-- Site specific YARN configuration properties -->
<!-- 指定YARN的ResourceManager的地址 -->
<property><name>yarn.resourcemanager.hostname</name><value>node03</value>
</property>
<!-- Reducer获取数据的方式 -->
<property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value>
</property>
</configuration>

其中,默认配置可查看https://hadoop.apache.org/docs/r2.9.2/hadoop-yarn/hadoop-yarn-common/yarn-default.xml;

保存退出。

(3)指定NodeManager节点——通过slaves文件内容确定

一个DataNode就对应一个NodeManager,所以前面已经配置过slaves文件,所以这里可以省略。

(4)编写集群分发脚本

现在需要进行集群分发,即将Hadoop安装目录(包括已经配置好的配置文件)可以使用scp,这里选择使用rsync。

rsync远程同步工具主要用于备份和镜像,具有速度快、避免复制相同内容和支持符号链接的优点。

rsync和scp区别如下:

用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新

scp是把所有文件都复制过去,所以效率较低。

(1)3台虚拟机安装

# 命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
rsync  -rvl   $pdir/$fname     $user@$host:$pdir/$fname

其中,各选项含义如下:

选项 功能
-r 递归
-v 显示复制过程
-l 拷贝符号连接

先使用rsync实现拷贝目录:

(1)3台虚拟机安装rsync

在连接工具中同时连接3台虚拟机,再选择发送到全部会话 执行yum install -y rsync,即可一次性在3台虚拟机安装rsync。

(2)测试rsync,把node01节点的/opt/packages目录同步到node02节点的root用户下的/opt/目录下

# 虚拟机node01执行rsync命令
[root@node01 ~]$ rsync -ivl /opt/packages/ root@node02:/opt/packages
skipping directory .sent 16 bytes  received 12 bytes  18.67 bytes/sec
total size is 0  speedup is 0.00
[root@node01 ~]$ rsync -rvl /opt/packages/ root@node02:/opt/packages
sending incremental file list
created directory /opt/packages
./
apache-tomcat-7.0.57.tar.gz
hadoop-2.9.2.tar.gz
jdk-8u231-linux-x64.tar.gzsent 569,638,685 bytes  received 112 bytes  30,791,286.32 bytes/sec
total size is 569,499,359  speedup is 1.00
# 虚拟机node02查看
[root@node02 opt]$ ls /opt/
packages  software
[root@node02 opt]$ ll /opt/packages/
总用量 556156
-rw-r--r-- 1 root root   8900571 8月  25 10:28 apache-tomcat-7.0.57.tar.gz
-rw-r--r-- 1 root root 366447449 8月  25 10:28 hadoop-2.9.2.tar.gz
-rwxr-xr-x 1 root root 194151339 8月  25 10:28 jdk-8u231-linux-x64.tar.gz

可以看到,已经将packages目录及其内部的文件拷贝到node02节点。

节点比较少的时候,直接执行命令进行拷贝是可以的,但是如果节点很多,一一执行命令效率就很低了,此时就可以编写集群分发脚本来实现循环复制文件到集群所有节点的相同目录下。

期望的目标是直接执行脚本 要同步的文件名称命令就能实现高效分发,同时将脚本放在/usr/local/bin目录下,方便root用户在系统任何地方直接执行。

node01节点脚本实现的步骤如下:

(1)切换目录并编辑文件

切换到/usr/local/bin目录cd /usr/local/bin/,编辑脚本文件vim rsync-script,如下:

#!/bin/bash# 1.获取传入脚本的参数,包括参数个数和参数值
paramnum=$#if ((paramnum==0)); thenecho "no args"exit;
fi# 2.获取文件名称
p1=$1filename=`basename $p1`echo filename=${filename}# 3.获取文件的绝对路径,即获取到文件的目录信息dir_name=`cd -P $(dirname $p1);pwd`echo dirname=${dir_name}# 4.获取到当前用户信息
user=`whoami`# 5.循环执行rsync命令,把文件发送到集群中的所有其他节点
for((host=1; host<4; host++)); doecho --------------target hostname=node0$host--------------rsync -rvl ${dir_name}/${filename} ${user}@node0$host:${dir_name}
done

保存退出。

(2)修改脚本权限

给rsync-script脚本文件添加执行权限:

[root@node01 bin]$ chmod 777 rsync-script
[root@node01 bin]$ ll
总用量 4
-rwxrwxrwx 1 root root 638 8月  25 10:53 rsync-script

(3)执行脚本进行测试

调用脚本的语法格式为rsync-script 文件名称,现在以分发rsync-script脚本文件自己为例进行测试:

# node01
[root@node01 bin]$ rsync-script rsync-script
filename=rsync-script
dirname=/usr/local/bin
--------------target hostname=node01--------------
sending incremental file listsent 68 bytes  received 12 bytes  160.00 bytes/sec
total size is 652  speedup is 8.15
--------------target hostname=node02--------------
sending incremental file list
rsync-scriptsent 767 bytes  received 35 bytes  1,604.00 bytes/sec
total size is 652  speedup is 0.81
--------------target hostname=node03--------------
sending incremental file list
rsync-scriptsent 767 bytes  received 35 bytes  1,604.00 bytes/sec
total size is 652  speedup is 0.81
# node02
[root@node02 opt]$ ll /usr/local/bin/
总用量 4
-rwxr-xr-x 1 root root 652 8月  25 11:10 rsync-script
# node03
[root@node03 ~]$ ll /usr/local/bin/
总用量 4
-rwxr-xr-x 1 root root 652 8月  25 11:10 rsync-script

可以看到,成功将script文件拷贝到了其他两个节点。

(4)调用脚本分发Hadoop安装目录到其他节点

节点1执行命令rsync-script /opt/software/hadoop-2.9.2/,等待执行完毕,查看其他两个节点:

# node02
[root@node02 opt]$ ll /opt/software/
总用量 0
drwxr-xr-x  9 root root 149 8月  25 11:17 hadoop-2.9.2
drwxr-xr-x. 3 root root  26 8月  20 14:09 java
drwxr-xr-x. 3 root root  69 8月  20 14:22 tomcat
# node03
[root@node03 ~]$ ll /opt/software/
总用量 0
drwxr-xr-x  9 root root 149 8月  25 11:17 hadoop-2.9.2
drwxr-xr-x. 3 root root  26 8月  20 14:09 java
drwxr-xr-x. 3 root root  69 8月  20 14:22 tomcat

可以看到,已经将Hadoop安装目录拷贝到了其他两个节点。

(5)集群启动

需要注意:

如果集群是第一次启动,需要在Namenode所在节点格式化NameNode,非第一次不用执行格式化Namenode操作

集群启动有两种方式,分别为单节点启动和集群群起两种方式。

Ⅰ 单节点启动

先使用单节点启动 方式实现启动集群:

先启动HDFS:

(0)格式化NameNode

格式化NameNode需要在NameNode所在的节点执行,命令为hadoop namenode -format,如下:

[root@node01 ~]$ hadoop namenode -format
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.21/08/25 11:36:54 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = node01/192.168.31.155
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 2.9.2
...
21/08/25 11:36:55 INFO common.Storage: Storage directory /opt/software/hadoop-2.9.2/data/tmp/dfs/name has been successfully formatted.
21/08/25 11:36:55 INFO namenode.FSImageFormatProtobuf: Saving image file /opt/software/hadoop-2.9.2/data/tmp/dfs/name/current/fsimage.ckpt_0000000000000000000 using no compression
21/08/25 11:36:55 INFO namenode.FSImageFormatProtobuf: Image file /opt/software/hadoop-2.9.2/data/tmp/dfs/name/current/fsimage.ckpt_0000000000000000000 of size 323 bytes saved in 0 seconds .
21/08/25 11:36:56 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
21/08/25 11:36:56 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at node01/192.168.31.155
************************************************************/

如果出现has been successfully formatted.的日志信息,则说明NameNode格式化成功;

可以看到,格式化后创建了文件/opt/software/hadoop-2.9.2/data/tmp/dfs/name/current/fsimage.ckpt_0000000000000000000,查看如下:

[root@node01 ~]$ cd /opt/software/hadoop-2.9.2/data/tmp/dfs/name/current
[root@node01 current]$ ll
总用量 16
-rw-r--r-- 1 root root 323 8月  25 11:36 fsimage_0000000000000000000
-rw-r--r-- 1 root root  62 8月  25 11:36 fsimage_0000000000000000000.md5
-rw-r--r-- 1 root root   2 8月  25 11:36 seen_txid
-rw-r--r-- 1 root root 219 8月  25 11:36 VERSION

其中,fsimage_0000000000000000000是生成的Image文件、即元数据文件,fsimage_0000000000000000000.md5用于校验,seen_txid用于记录id编号,VERSION用于版本信息。

需要注意,只是在第一次启动集群时,需要执行,之后启动都不需要再进行NameNode格式化。

(1)在node01节点上启动NameNode

启动NameNode的脚本文件位于sbin目录下。

在node01上启动NameNode,如下:

[root@node01 current]$ hadoop-daemon.sh start namenode
starting namenode, logging to /opt/software/hadoop-2.9.2/logs/hadoop-root-namenode-node01.out
[root@node01 current]$ jps
21218 Jps
20694 NameNode

可以看到,启动namenode的日志保存到/opt/software/hadoop-2.9.2/logs/hadoop-root-namenode-node01.out中,如果出现异常需要排查可以查看该日志;

jps命令是查看用于查看Linux中的Java进程,因为Hadoop是用Java编写、同时依赖于JVM运行的,所以可以通过查看Java进程来查看是否启动成功;

可以看到,此时NameNode启动成功。

(2)在3个节点上分别启动DataNode

先在node01上启动DataNode,如下:

[root@node01 current]$ hadoop-daemon.sh start datanode
starting datanode, logging to /opt/software/hadoop-2.9.2/logs/hadoop-root-datanode-node01.out
[root@node01 current]$ jps
22212 Jps
20694 NameNode
21935 DataNode

其中,DataNode的日志保存到/opt/software/hadoop-2.9.2/logs/hadoop-root-datanode-node01.out课用于查看;

node01节点成功启动了DataNode。

为了方便在node02和node03执行启动命令,需要将Hadoop的安装目录添加到环境变量,和node01类似,先编辑profile文件vim /etc/profile,在后面添加以下内容:

# HADOOP_HOME
export HADOOP_HOME=/opt/software/hadoop-2.9.2
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

再执行source /etc/profile使环境变量生效。

然后再执行命令启动DataNode:

# node02
[root@node02 opt]$ hadoop-daemon.sh start datanode
starting datanode, logging to /opt/software/hadoop-2.9.2/logs/hadoop-root-datanode-node02.out
[root@node02 opt]$ jps
42818 DataNode
43154 Jps
# node03
[root@node03 ~]$ hadoop-daemon.sh start datanode
starting datanode, logging to /opt/software/hadoop-2.9.2/logs/hadoop-root-datanode-node03.out
[root@node03 ~]$ jps
43232 Jps
42587 DataNode

可以看到,成功启动了node02和node03上的DataNode。

(3)进行网页验证

除了使用jps在节点上进行验证,还可以访问http://NameNode节点主机名:50070来进行查看,这里即http://node01:50070,如下:

如果出现此页面即说明启动HDFS成功;

可以看到该集群的概览信息,同时可以看到HDFS配置的可用存储容量、可用的DataNode节点数等信息。

需要注意,如果不能通过http://NameNode节点主机名:50070的方式访问,有两种方式进行解决:

(1)可以通过IP来访问,例如http://192.168.31.155:50070;

(2)可能是因为Windows下没有配置hosts文件进行IP与主机名的映射,需要修改位于C:\Windows\System32\drivers\etc下的hosts文件,如下:

可以选择记事本或者Notepad++进行修改,因为该文件为只读不可修改,所以在编辑时需要以管理员身份打开记事本或Notepad++软件,再在软件在打开hosts文件进行编辑,在文件最后增加3台虚拟机的IP映射即可:

192.168.31.155    node01
192.168.31.156    node02
192.168.31.157    node03

可以根据自己的情况修改IP和主机名,最后保存退出,就能访问到http://node01:50070了。

还可以浏览文件系统,访问http://192.168.31.155:50070/explorer.html#/,如下:

可以看到,和Linux类似,根目录也是/

目前还没有任何内容,后面可以在根目录下创建和添加文件。

再启动Yarn,如下:

(1)启动ResourceManager

因为Yarn框架的ResourceManager位于node03,所以在node03启动ResourceManager,执行yarn-daemon.sh start resourcemanager,如下:

[root@node03 ~]$ yarn-daemon.sh start resourcemanager
starting resourcemanager, logging to /opt/software/hadoop-2.9.2/logs/yarn-root-resourcemanager-node03.out
[root@node03 ~]$ jps
75809 ResourceManager
75890 Jps
42587 DataNode

可以看到,成功启动ResourceManager。

(2)启动NodeManager

在3个节点上执行yarn-daemon.sh start nodemanager启动NodeManager,如下:

# node01
[root@node01 ~]$ yarn-daemon.sh start nodemanager
starting nodemanager, logging to /opt/software/hadoop-2.9.2/logs/yarn-root-nodemanager-node01.out
[root@node01 ~]$ jps
20694 NameNode
72441 Jps
72331 NodeManager
21935 DataNode
# node02
[root@node02 ~]$ yarn-daemon.sh start nodemanager
starting nodemanager, logging to /opt/software/hadoop-2.9.2/logs/yarn-root-nodemanager-node02.out
[root@node02 ~]$ jps
42818 DataNode
78247 Jps
78041 NodeManager
# node03
[root@node03 ~]$ yarn-daemon.sh start nodemanager
starting nodemanager, logging to /opt/software/hadoop-2.9.2/logs/yarn-root-nodemanager-node03.out
[root@node03 ~]$ jps
105237 ResourceManager
78161 Jps
77881 NodeManager
42587 DataNode

可以看到,3个节点上都成功启动了NodeManager。

Ⅱ 集群群起

前面的单节点启动方式是在每一个节点机器分别执行启动命令启动对应的服务,在节点较少时具有一定的可行性,但是节点数很多、达到成千上万个时,可能就不太现实了。

此时就需要用到集群群起的方式来启动集群服务。

因为前面已经通过单节点启动的方式启动了部分服务,因此需要先停掉已经开启的服务:

# node01
[root@node01 ~]$ hadoop-daemon.sh stop namenode
stopping namenode
[root@node01 ~]$ hadoop-daemon.sh stop datanode
stopping datanode
[root@node01 ~]$ yarn-daemon.sh stop nodemanager
stopping nodemanager
nodemanager did not stop gracefully after 5 seconds: killing with kill -9
[root@node01 ~]$ jps
84312 Jps
# node02
[root@node02 ~]$ hadoop-daemon.sh stop datanode
stopping datanode
[root@node02 ~]$ yarn-daemon.sh stop nodemanager
stopping nodemanager
nodemanager did not stop gracefully after 5 seconds: killing with kill -9
[root@node02 ~]$ jps
106580 Jps
# node03
[root@node03 ~]$ hadoop-daemon.sh stop datanode
stopping datanode
[root@node03 ~]$ yarn-daemon.sh stop resourcemanager
stopping resourcemanager
[root@node03 ~]$ jps
118737 Jps

因为单节点启动时NameNode已经进行过格式化,所以一定不需要再进行格式化 ,否则DateNode和NameNode版本号不一致,就不能启动HDFS成功。

现在进行群起:

(1)启动HDFS

在HDFS主节点node01上执行start-dfs.sh启动所有HDFS进程,如下:

# node01
[root@node01 ~]$ start-dfs.sh
Starting namenodes on [node01]
node01: starting namenode, logging to /opt/software/hadoop-2.9.2/logs/hadoop-root-namenode-node01.out
node02: starting datanode, logging to /opt/software/hadoop-2.9.2/logs/hadoop-root-datanode-node02.out
node03: starting datanode, logging to /opt/software/hadoop-2.9.2/logs/hadoop-root-datanode-node03.out
node01: starting datanode, logging to /opt/software/hadoop-2.9.2/logs/hadoop-root-datanode-node01.out
Starting secondary namenodes [node03]
node03: starting secondarynamenode, logging to /opt/software/hadoop-2.9.2/logs/hadoop-root-secondarynamenode-node03.out
[root@node01 ~]$ jps
122227 DataNode
122026 NameNode
122877 Jps
# node02
[root@node02 ~]$ jps
127489 DataNode
128151 Jps
# node03
[root@node03 ~]$ jps
129040 Jps
128531 SecondaryNameNode
128252 DataNode

可以看到,已经在3个 节点上启动了所有的HDFS进程;

此时查看http://node01:50070/dfshealth.html#tab-overview也能看到zhe你刚才的数据。

(2)启动Yarn

在Yarn主节点node03上执行start-yarn.sh来启动所有Yarn进程,如下:

# node03
[root@node03 ~]$ start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /opt/software/hadoop-2.9.2/logs/yarn-root-resourcemanager-node03.out
node02: starting nodemanager, logging to /opt/software/hadoop-2.9.2/logs/yarn-root-nodemanager-node02.out
node01: starting nodemanager, logging to /opt/software/hadoop-2.9.2/logs/yarn-root-nodemanager-node01.out
node03: starting nodemanager, logging to /opt/software/hadoop-2.9.2/logs/yarn-root-nodemanager-node03.out
[root@node03 ~]$ jps
128531 SecondaryNameNode
9244 ResourceManager
128252 DataNode
9406 NodeManager
9839 Jps
# node01
[root@node01 ~]$ jps
122227 DataNode
2969 NodeManager
122026 NameNode
3820 Jps
# node02
[root@node02 ~]$ jps
127489 DataNode
8912 Jps
8181 NodeManager

可以看到,所有的Yarn进程启动成功;

显然,相比于单节点启动,群起方式要方便很多;

需要注意,NameNode和ResourceManger不是在同一台机器,不能在NameNode上启动 YARN,应该在ResouceManager所在的机器上启动Yarn。

Ⅲ 集群停止

停止集群服务也分为两种方式:

(1)各个服务组件逐一启动和停止

启动和停止HDFS组件的命令如下:

hadoop-daemon.sh  start / stop namenode / datanode / secondarynamenode

启动和停止Yarn组件的命令如下:

yarn-daemon.sh  start / stop resourcemanager / nodemanager

(2)各个模块整体启动和停止

整体启动和停止HDFS的命令如下:

start-dfs.sh / stop-dfs.sh

整体启动和停止Yarn的命令如下:

start-yarn.sh / stop-yarn.sh

显然,整体启动和停止集群的方式更加方便快捷,也更常用。

(6)集群测试

在前面已经启动了HDFS和Yarn,现在可以分别进行测试。

1.HDFS 分布式存储初体验

即从节点本地文件系统上传下载文件验证HDFS集群工作正常,可以任选一个节点进行操作,这里选择node01,步骤如下:

(1)节点本地创建1个测试文件并写入内容

节点本地执行vim test.txt编辑文件,如下:

hello, hdfs

(2)HDFS文件系统创建目录

执行hdfs dfs -mkdir -p /test/input命令在HDFS文件系统中创建测试目录。

(3)HDFS上传测试文件到文件系统中

执行hdfs dfs -put /root/test.txt /test/input将刚刚创建的文件上传到文件系统中创建的目录下。

(4)HDFS下载上传的文件

如下:

[root@node01 ~]$ rm -f test.txt
[root@node01 ~]$ ll
总用量 8
-rw-------. 1 root root 1259 8月  19 03:28 anaconda-ks.cfg
drwxr-xr-x. 3 root root 4096 8月  24 21:07 lxDemo
[root@node01 ~]$ hdfs dfs -get /test/input/test.txt
[root@node01 ~]$ ll
总用量 12
-rw-------. 1 root root 1259 8月  19 03:28 anaconda-ks.cfg
drwxr-xr-x. 3 root root 4096 8月  24 21:07 lxDemo
-rw-r--r--  1 root root   12 8月  25 20:26 test.txt
[root@node01 ~]$ cat test.txt
hello, hdfs

可以看到,从HDFS文件系统中下载了之前上传的文件,同时文件内容相同。

除了在节点中下载,还可以在本地浏览器下载,如下:

2.MapReduce 分布式计算初体验

从节点中给MapReduce分配任务验证Yarn集群工作正常,也可以任选一个节点进行操作,步骤如下:

(1)节点本地创建测试文件

node01节点创建测试文本文件vim wc.txt,如下:

Apache Hadoop 2.9.2 is a point release in the 2.x.y release line, building upon the previous stable release 2.9.1.Here is a short overview of the major features and improvements.CommonAliyun OSS Support. See the user documentation for more details.
HADOOP Resource Estimator. See the user documentation for more details.
HDFSHDFS Router based federation. See the user documentation for more details.
YARNYARN Timeline Service v.2. See the user documentation for more details.
YARN Federation. See the user documentation for more details.
Opportunistic Containers. See the user documentation for more details.
YARN Web UI v.2. See the user documentation for more details.
Changing queue configuration via API (supported only on the Capacity Scheduler). See the user documentation for more details.
Update Resources and Execution Type of an allocated/running container. (supported only on the Capacity Scheduler). See the user documentation for more details.

保存退出。

(2)HDFS文件系统中创建目录

执行hdfs dfs -mkdir /wcinput在HDFS文件系统中创建wcinput目录。

(3)上传文件到文件系统中的指定目录

执行hdfs dfs -put wc.txt /wcinput将创建的文件上传到刚刚创建好的wcinput目录下。

(4)执行命令提交任务给MapReduce

执行命令将计算任务提交给MapReduce进行计算,任务会由Yarn进行调度分配,命令如下:

# hadoop jar 示例jar包 示例名称 输入目录 输出目录
hadoop jar /opt/software/hadoop-2.9.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount /wcinput /wcoutput

这里使用的是Hadoop官方提供的wordcount统计案例;

输出目录不能手动创建,应该由MapReduce程序运行时自动创建。

执行如下:

[root@node01 ~]$ hadoop jar /opt/software/hadoop-2.9.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount /wcinput /wcoutput
21/08/25 22:36:30 INFO client.RMProxy: Connecting to ResourceManager at node03/192.168.31.157:8032
21/08/25 22:36:32 INFO input.FileInputFormat: Total input files to process : 1
21/08/25 22:36:33 INFO mapreduce.JobSubmitter: number of splits:1
21/08/25 22:36:33 INFO Configuration.deprecation: yarn.resourcemanager.system-metrics-publisher.enabled is deprecated. Instead, use yarn.system-metrics-publisher.enabled
21/08/25 22:36:33 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1629895298908_0001
21/08/25 22:36:34 INFO impl.YarnClientImpl: Submitted application application_1629895298908_0001
21/08/25 22:36:34 INFO mapreduce.Job: The url to track the job: http://node03:8088/proxy/application_1629895298908_0001/
21/08/25 22:36:34 INFO mapreduce.Job: Running job: job_1629895298908_0001
21/08/25 22:36:53 INFO mapreduce.Job: Job job_1629895298908_0001 running in uber mode : false
21/08/25 22:36:53 INFO mapreduce.Job:  map 0% reduce 0%
21/08/25 22:37:11 INFO mapreduce.Job:  map 100% reduce 0%
21/08/25 22:37:20 INFO mapreduce.Job:  map 100% reduce 100%
21/08/25 22:37:21 INFO mapreduce.Job: Job job_1629895298908_0001 completed successfully
21/08/25 22:37:21 INFO mapreduce.Job: Counters: 49File System CountersFILE: Number of bytes read=897FILE: Number of bytes written=398591FILE: Number of read operations=0FILE: Number of large read operations=0FILE: Number of write operations=0HDFS: Number of bytes read=1065HDFS: Number of bytes written=624HDFS: Number of read operations=6HDFS: Number of large read operations=0HDFS: Number of write operations=2Job Counters Launched map tasks=1Launched reduce tasks=1Data-local map tasks=1Total time spent by all maps in occupied slots (ms)=14530Total time spent by all reduces in occupied slots (ms)=7187Total time spent by all map tasks (ms)=14530Total time spent by all reduce tasks (ms)=7187Total vcore-milliseconds taken by all map tasks=14530Total vcore-milliseconds taken by all reduce tasks=7187Total megabyte-milliseconds taken by all map tasks=14878720Total megabyte-milliseconds taken by all reduce tasks=7359488Map-Reduce FrameworkMap input records=19Map output records=144Map output bytes=1538Map output materialized bytes=897Input split bytes=98Combine input records=144Combine output records=67Reduce input groups=67Reduce shuffle bytes=897Reduce input records=67Reduce output records=67Spilled Records=134Shuffled Maps =1Failed Shuffles=0Merged Map outputs=1GC time elapsed (ms)=223CPU time spent (ms)=1350Physical memory (bytes) snapshot=340258816Virtual memory (bytes) snapshot=4164100096Total committed heap usage (bytes)=139587584Shuffle ErrorsBAD_ID=0CONNECTION=0IO_ERROR=0WRONG_LENGTH=0WRONG_MAP=0WRONG_REDUCE=0File Input Format Counters Bytes Read=967File Output Format Counters Bytes Written=624

可以看到,执行任务钱前线连接Yarn架构的ResourceManager ,然后再执行任务,同时可以输出粗略的进度,最后给出了执行的过程数据和结果概览。

(5)查看结果

先查看HDFS浏览器目录,如下:

可以看到,之前上传的wc.txt文件已经同步,同时将执行的结果放到了程序创建的wcoutput目录,其中的part-r-00000文件就保存了词频的统计结果,可以进行查看,如下:

[root@node01 ~]$ hdfs dfs -cat /wcoutput/part-r-00000
(supported      2
2.9.1.  1
2.9.2   1
2.x.y   1
API     1
Aliyun  1
Apache  1
Capacity        2
Changing        1
Common  1
Containers.     1
Estimator.      1
Execution       1
Federation.     1
HADOOP  1
HDFS    2
Hadoop  1
Here    1
OSS     1
Opportunistic   1
Resource        1
Resources       1
Router  1
Scheduler).     2
See     9
Service 1
Support.        1
Timeline        1
Type    1
UI      1
Update  1
Web     1
YARN    4
a       2
allocated/running       1
an      1
and     2
based   1
building        1
configuration   1
container.      1
details.        9
documentation   9
features        1
federation.     1
for     9
improvements.   1
in      1
is      2
line,   1
major   1
more    9
of      2
on      2
only    2
overview        1
point   1
previous        1
queue   1
release 3
short   1
stable  1
the     14
upon    1
user    9
v.2.    2
via     1

可以看到,统计到了测试文本中的次品,所以也印证了Yarn集群启动成功。

还可以查看更加详细的数据,包括报错日志等信息,此时需要访问Yarn集群的Web管理页面来查看,地址为http://Yarn集群主节点主机名:8088,例如http://node03:8088,访问如下:

可以看到,此时页面中显示了任务执行的详细信息,包括任务ID、执行时间、执行状态等,同时还能查看执行历史详细信息,但是因为还没有配置历史日志服务器,所以暂时还不能访问查看。

(7)历史日志服务器配置

之前在Yarn中运行的任务产生的日志数据不能查看,为了查看程序的历史运行情况,需要配置历史日志服务器。

步骤如下:

(1)配置mapred-site.xml

在node01上切换到配置文件目录/opt/software/hadoop-2.9.2/etc/hadoop并编辑mapred-site.xmlvim mapred-site.xml,在configuration标签中添加内容,如下:

<configuration>
<!-- 指定MR运行在Yarn上 -->
<property><name>mapreduce.framework.name</name><value>yarn</value>
</property><!-- 历史服务器端地址 -->
<property><name>mapreduce.jobhistory.address</name><value>node01:10020</value>
</property><!-- 历史服务器web端地址 -->
<property><name>mapreduce.jobhistory.webapp.address</name><value>node01:19888</value>
</property>
</configuration>

保存退出。

(2)分发mapred-site.xml到其他节点

如下:

# node01
[root@node01 hadoop]$ rsync-script mapred-site.xml
filename=mapred-site.xml
dirname=/opt/software/hadoop-2.9.2/etc/hadoop
--------------target hostname=node01--------------
sending incremental file listsent 52 bytes  received 12 bytes  42.67 bytes/sec
total size is 1,144  speedup is 17.88
--------------target hostname=node02--------------
sending incremental file list
mapred-site.xmlsent 103 bytes  received 47 bytes  300.00 bytes/sec
total size is 1,144  speedup is 7.63
--------------target hostname=node03--------------
sending incremental file list
mapred-site.xmlsent 103 bytes  received 47 bytes  300.00 bytes/sec
total size is 1,144  speedup is 7.63
# node02
[root@node02 ~]$ tail -n 20 /opt/software/hadoop-2.9.2/etc/hadoop/mapred-site.xml<configuration>
<!-- 指定MR运行在Yarn上 -->
<property><name>mapreduce.framework.name</name><value>yarn</value>
</property><!-- 历史服务器端地址 -->
<property><name>mapreduce.jobhistory.address</name><value>node01:10020</value>
</property><!-- 历史服务器web端地址 -->
<property><name>mapreduce.jobhistory.webapp.address</name><value>node01:19888</value>
</property>
</configuration>
# node03类似

可以看到,已经将修改后的配置文件同步到其他节点。

(3)启动历史服务器

因为日志服务是配置在node01节点的,所以启动也应该在node01节点,执行mr-jobhistory-daemon.sh start historyserver,如下:

[root@node01 hadoop]$ mr-jobhistory-daemon.sh start historyserver
starting historyserver, logging to /opt/software/hadoop-2.9.2/logs/mapred-root-historyserver-node01.out
[root@node01 hadoop]$ jps
38050 NodeManager
37716 NameNode
37878 DataNode
47689 Jps
47611 JobHistoryServer

可以看到,成功启动了历史服务器。

(4)访问网页查看历史执行情况

访问http://日志服务器节点主机名:配置IP,例如http://node01:19888,如下:

可以看到,在访问日志目录后,并没有显示对应的日志,而是提示未启用聚合 ,这是因为Yarn集群调度MapReduce任务时,MapTask可能有多个,所以MapTask具体运行在哪个节点是不确定的,MR任务的日志也可能存在于多个节点上,Aggregation 就是将执行某个MR任务的所有NodeManager上产生的数据汇总到一起,方便查看。

日志聚集:

应用(Job)运行完成以后,将应用运行日志信息从各个Task汇总上传到HDFS系统上。

日志聚集的好处:

可以方便的查看到程序运行详情,方便开发调试。

所以现在需要开启日志聚集功能,具体步骤如下:

(1)配置yarn-site.xml

在node01编辑yarn-site.xmlvim yarn-site.xml,如下:

<configuration><!-- Site specific YARN configuration properties -->
<!-- 指定YARN的ResourceManager的地址 -->
<property><name>yarn.resourcemanager.hostname</name><value>node03</value>
</property>
<!-- Reducer获取数据的方式 -->
<property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value>
</property><!-- 日志聚合功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间设置7天 -->
<property><name>yarn.log-aggregation.retain-seconds</name><value>604800</value>
</property>
<property><name>yarn.log.server.url</name><value>http://node01:19888/jobhistory/logs</value>
</property>
</configuration>

保存退出。

(2)分发yarn-site.xml到集群其他节点

执行rsync-script yarn-site.xml命令分发刚修改过的yarn-site.xml文件到其他节点,如下:

[root@node01 hadoop]$ rsync-script yarn-site.xml
filename=yarn-site.xml
dirname=/opt/software/hadoop-2.9.2/etc/hadoop
--------------target hostname=node01--------------
sending incremental file listsent 50 bytes  received 12 bytes  124.00 bytes/sec
total size is 1,327  speedup is 21.40
--------------target hostname=node02--------------
sending incremental file list
yarn-site.xmlsent 728 bytes  received 47 bytes  1,550.00 bytes/sec
total size is 1,327  speedup is 1.71
--------------target hostname=node03--------------
sending incremental file list
yarn-site.xmlsent 728 bytes  received 47 bytes  1,550.00 bytes/sec
total size is 1,327  speedup is 1.71

(3)重启Yarn集群和历史服务器

开启日志聚集功能,修改了配置文件,所以需要重新启动NodeManager 、ResourceManager和HistoryManager才能让配置文件生效。

node02节点重启Yarn集群:

[root@node03 ~]$ stop-yarn.sh
stopping yarn daemons
stopping resourcemanager
node01: stopping nodemanager
node03: stopping nodemanager
node02: stopping nodemanager
node01: nodemanager did not stop gracefully after 5 seconds: killing with kill -9
node03: nodemanager did not stop gracefully after 5 seconds: killing with kill -9
node02: nodemanager did not stop gracefully after 5 seconds: killing with kill -9
no proxyserver to stop
[root@node03 ~]$ start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /opt/software/hadoop-2.9.2/logs/yarn-root-resourcemanager-node03.out
node01: starting nodemanager, logging to /opt/software/hadoop-2.9.2/logs/yarn-root-nodemanager-node01.out
node02: starting nodemanager, logging to /opt/software/hadoop-2.9.2/logs/yarn-root-nodemanager-node02.out
node03: starting nodemanager, logging to /opt/software/hadoop-2.9.2/logs/yarn-root-nodemanager-node03.out
[root@node03 ~]$ jps
82353 NodeManager
83013 Jps
44108 DataNode
82221 ResourceManager
44542 SecondaryNameNode

node01节点重启历史服务器:

[root@node01 hadoop]$ mr-jobhistory-daemon.sh stop historyserver
stopping historyserver
[root@node01 hadoop]$ mr-jobhistory-daemon.sh start historyserver
starting historyserver, logging to /opt/software/hadoop-2.9.2/logs/mapred-root-historyserver-node01.out
[root@node01 hadoop]$ jps
37716 NameNode
75813 Jps
37878 DataNode
75355 NodeManager
75611 JobHistoryServer

(4)删除HDFS上已经存在的输出文件

此时需要重新执行任务,以生成日志进行查看,因为输出目录不能存在所以需要先删除,执行命令hdfs dfs -rm -R /wcoutput即可。

(5)重新执行wordcount测试任务

执行hadoop jar /opt/software/hadoop-2.9.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount /wcinput /wcoutput命令重新执行词频统计任务。

(6)网页中查看日志信息

此时就可以在网页中查看详细的日志信息了,可以在http://node03:8088和http://node01:19888查看,如下:

如果出现错误,则可以根据日志进行排查。

总结

在当下,数据有着极大的价值,而大数据就是处理海量数据获取价值的重要手段;Hadoop是大数据中的基础框架,有着广泛的应用,也是其他大数据框架的基础。

大数据开发基础入门与项目实战(三)Hadoop核心及生态圈技术栈之1.Hadoop简介及Apache Hadoop完全分布式集群搭建相关推荐

  1. 大数据开发基础入门与项目实战(三)Hadoop核心及生态圈技术栈之5.即席查询Impala介绍及入门使用

    文章目录 前言 1.Impala概述 (1)Impala的概念和优势 (2)Impala的缺点及适用场景 2.Impala的安装与入门 (1)准备工作 (2)制作本地yum源 (3)安装Impala ...

  2. 大数据开发基础入门与项目实战(一)Java SE之1.初识计算机和Java语言

    文章目录 前言 1.计算机的体系结构 (1)计算机的基本概念 (2)常见的主要硬件 (3)主要硬件的详解 Ⅰ CPU Ⅱ 内存 Ⅲ 硬盘 Ⅳ 输入输出设备 (4)常见的主要软件 (5)计算机的体系结构 ...

  3. 大数据开发基础入门与项目实战(三)Hadoop核心及生态圈技术栈之2.HDFS分布式文件系统

    文章目录 前言 1.HDFS特点 2.命令行和API操作HDFS (1)Shell命令行客户端 (2)API客户端连接HDFS的两种方式 (3)API客户端上传下载文件 (4)API客户端文件详情及文 ...

  4. 大数据开发基础入门与项目实战(三)Hadoop核心及生态圈技术栈之3.数据仓库工具Hive基础

    文章目录 1.Hive概述 (1)数仓工具Hive的产生背景 (2)数仓工具Hive与RDBMS对比 (3)数仓工具Hive的优缺点 (4)数仓工具Hive的架构原理 2.Hive安装与配置 (1)安 ...

  5. 大数据开发基础入门与项目实战(二)Java Web数据可视化之3.Linux概述、安装和结构

    文章目录 前言 1.Linux概述 (1)Linux简介 (2)Linux的应用领域及版本介绍 2.安装Linux (1)VMWare的安装 (2)使用VMWare构建虚拟机器 (3)安装CentOS ...

  6. 视频教程-20年Nodejs教程零基础入门到项目实战前端视频教程-Node.js

    20年Nodejs教程零基础入门到项目实战前端视频教程 7年的开发架构经验,曾就职于国内一线互联网公司,开发工程师,现在是某创业公司技术负责人, 擅长语言有node/java/python,专注于服务 ...

  7. 视频教程-全新大数据企业电商数据仓库项目实战教程-大数据

    全新大数据企业电商数据仓库项目实战教程 张长志技术全才.擅长领域:区块链.大数据.Java等.10余年软件研发及企业培训经验,曾为多家大型企业提供企业内训如中石化,中国联通,中国移动等知名企业.拥有丰 ...

  8. 2018年最新Vue从基础入门到项目实战视频教程网盘学习地址

    2018年最新Vue从基础入门到项目实战视频教程网盘学习地址: https://pan.baidu.com/s/15D6GiHnSgA5Eo0n9G5Ws1A 若网盘地址失效,可访问此地址(下单有网盘 ...

  9. react从零基础入门到项目实战视频教程

    React 起源于 Facebook 的内部项目,用来架设 Instagram 的网站, 并于 2013年 5 月开源.React 拥有较高的性能,代码逻辑非常简单,越来越多的人已开始关注和使用它.这 ...

  10. 大数据开发·关于虚拟机Hadoop完全分布式集群搭建教程

    hadoop完全分布式集群搭建 一.搭建准备 1.安装VMware虚拟机 2.Xshell 7 远程客户端及Xftp 7安装 3.搭建模板虚拟机hadoop100 配置虚拟机网络 为虚拟机普通用户配置 ...

最新文章

  1. 常用String方法
  2. 一般来说,神经网络的架构可以分为哪三类?
  3. GO语言初识(为go开发android做准备)
  4. 改变静态文本notify 属性_CocosCreator脚本属性个性化定制——下拉列表属性、滑动条属性...
  5. 思科 IPSec ***配置2:
  6. 如何为SAP Cloud for Customer Lead页面配置自定义的Source字段
  7. Composer 常用命令总结(三)
  8. oracle数据库创建回滚,如何重建Oracle数据库的回滚段?
  9. ubuntu下JNI之HelloWorld相互传String值
  10. MybatisCodeHelperPro的使用
  11. sklearn股票预测
  12. Navicat 中文显示乱码解决之道 ,亲测可行
  13. 1、学习笔记-谁说rookie不会数分(入门篇)
  14. 分享:个人是怎么学习新知识的--周立
  15. 你了解HTTP2协议吗?(二)
  16. 什么是RPN,ROIAlign?
  17. 盛夏之梦A Dream of Summer 汉化发布[PC+PSP版]
  18. PHP7安装redis扩展 Star.Hou
  19. 贾俊平-第八章:假设检验
  20. 使用MuMu模拟器自带adb抓取apk日志文件

热门文章

  1. 安装基于Ubuntu的微信小程序开发工具
  2. Java调用第三方http接口的方式
  3. 最新VMware虚拟机安装kali Linux详细教程
  4. MySQL 批量插入申请自增 ID
  5. STM8S003F3使用总结——定时器
  6. 华为交换机初始化_华为S5700交换机初始化配置举例
  7. 【Java · 类加载】类加载器
  8. linux ext4 磁盘修复,修复损坏的 ext4 大分区数据
  9. python双向链表以及双向循环链表
  10. 浅谈HTTP中GET和POST请求方式的区别