物联网架构之Hadoop

**

物联网架构之Hadoop

**
技能目标
了解 Hadoop 体系结构
能够安装 Hadoop 运行环境
掌握 HDFS 体系结构
掌握 HDFS 命令行操作
理解 MapReduce 计算模型

**

一、案例分析

**

1、案例概述

在这里插入图片描述**

2、案例前置知识点

**
1.什么是大数据
在这里插入图片描述

数据量大是大数据的显著特点,归纳来说大数据特点如下:
(1)数据体量巨大。按目前的发展趋势看,大数据的体量已经达到 PB 甚至 EB级。
(2)大数据的数据类型多样,以非结构化数据为主。如:网络日志、音频、视频、图片、地理位置信息、交易数据、社交数据等。
(3)价值密度低。有价值的数据仅占到数据总量相当小的一部分。比如一段监控视频中真正有价值的画面可能只有几秒钟。由于价值密度低,所以迅速地完成数据的价值提纯是目前大数据汹涌背景下亟待解决的难题。
(4)产生和要求处理速度快。这是大数据区分于传统数据挖掘最显著的特征。

目前,有很多大数据处理系统可以处理大数据,如表所示。
在这里插入图片描述
下面开始学习 Hadoop。Hadoop 是开源软件,实现了一个分布式文件系统(Hadoop Distributed File System,HDFS),分布式系统是运行在多个主机上的软件系统。HDFS 有着高容错性的特点,能够自动保存数据的多个副本,并能自动将失败的任务重新分配。Hadoop 设计用来部署在低廉的通用硬件平台上组成集群,提供热插拔的方式加入新的节点来向集群中扩展,将计算任务动态分配到集群中各个节点并保证各节点的动态平衡。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
2. Hadoop 体系结构
Hadoop 源 自 于 Google 在 2003 到 2004 年 公 布 的 关 于 GFS ( Google FileSystem)、MapReduce 和 BigTable 三篇论文,创始是 Doug Cutting。Hadoop 现在是 Apache 基金会顶级项目,“Hadoop”是一个虚构的名字,由 Doug Cutting 的孩子为其黄色玩具大象所命名。
(1)Hadoop 的核心构成
在这里插入图片描述
(2)Hadoop 子项目
整个 Hadoop 生态圈已发展成为包含很多子项目的集合。除了两个核心内容外还包括 Hive、Pig、HBase、ZooKeeper 等。比较完整的项目结构如图所示。

下面分别对它们进行简单介绍。
HDFS:分布式文件系统,是整个 Hadoop 体系的基石。

MapReduce/YARN:并行编程模型。YARN 是下一代的 MapReduce 框架。从 Hadoop 0.23.01 版 本 后 , MapReduce 被 重 构 。 通 常 YARN 也 称 为MapReduceV2,老版本 MapReduce 称为 MapReduce V1。

Hive:建立在 Hadoop 上的数据仓库。提供类似 SQL 语言的查询方式查询Hadoop 中的数据。

Pig:一个对大型数据集进行分析、评估的平台。主要作用类似于数据库里的存储过程。

HBase:全称 Hadoop Database。Hadoop 分布式、面向列的数据库来源于Google 关于 BigTable 的论文,主要用于需要随机访问、实时读写的大数据,在后面还会详细介绍。

ZooKeeper:是一个为分布式应用所设计的协调服务。主要为用户提供同步、配置管理、分组和命名等服务,减轻分布式应用程序所承担的协调任务。

当然还有大量其它项目加入到 Hadoop 生态圈,如:
Sqoop:主要用于 Hadoop 与传统数据库(MySQL 等)间的数据传递。

Flume:日志采集系统。

Spark:前面提过,是一个相对独立于 Hadoop 的大数据处理系统,可单独进行分布式处理。在这里列出来是因为它可以和 HDFS 很好的结合。

Oozie:可以将多个 MapReduce 作业组合到一个逻辑工作单元中,进行工作计划的安排,类似于工作流管理引擎。

Ambari:支持 Hadoop 集群管理、监控的 Web 工具。

经过近十多年的发展,越来越多的项目加入到了 Hadoop 的生态圈。在本课程中着重介绍 3 个模块,分别是:HDFS、MapReduce、HBase。对于 Hadoop 应用开发人员来说,这也是最基本的模块。

Hadoop 发行版本
Hadoop 的版本比较混乱,在这里有必要帮助大家理清思路,也有助于大家在参考其它资料时注意区别版本间的差异。总的来说,Hadoop 分为两代,如表所示。在这里插入图片描述在这里插入图片描述由上表可以看出,通常所说的 Hadoop 1.0 指的是 0.20.x、0.21.x、0.22.x、1.0.x,
Hadoop 2.0 指的是 0.23.x 、2.x.x。在本课程中,将选择 Hadoop 2.6.0 进行示例讲解。

第二代 Hadoop 一个重大的变化就是重构了 MapReduce。在后面会看到新老 API同时存在的情况。Hadoop 的下载地址:http://hadoop.apache.org/releases.html。

为什么使用 MapReduce?对于大量数据的计算,通常采用的处理方法就是并行计算。这就要求能够将大型而复杂的计算问题分解为各个子任务,并分配到多个计算资源下同时进行计算,其显著特点是耗时小于单个计算资源下的计算。对多数开发人员来说,并行计算还是个陌生、复杂的东西,尤其是涉及到分布式的问题,将会更加
棘手。MapReduce 就是一种实现了并行计算的编程模型,它向用户提供接口,屏蔽了并行计算特别是分布式处理的诸多细节,让那些没有多少并行计算经验的开发人员也可以很方便的开发并行应用。
在这里插入图片描述3. MapReduce 概述
Hadoop 的 MapReduce 框架源自于 Google 的 MapReduce 论文。在 Google 发表论文时,MapReduce 最大成就是重写了 Google 的索引文件系统。现在,MapReduce被广泛地应用于日志分析、海量数据排序、在海量数据中查找特定模式等场景中。

Hadoop 中,并行应用程序的开发是基于 MapReduce 编程模型的,基于它可以将任务分发到由上千台商用机器组成的集群上,实现 Hadoop 的并行任务处理功能。前面提过,HDFS 和 MapReduce 二者相互作用,共同完成了 Hadoop 分布式集群的主要任务。

4. MapReduce 框架设计
与 HDFS 架构设计相似,Hadoop 中用于执行 MapReduce 作业的机器也有两个角色:JobTracker 和 TaskTracker。

JobTracker:是一个 Master 服务,用于作业(Job)的管理和调度工作。一个 Hadoop 集群中只有一台 JobTracker。一般情况下,应该把它部署在单独的机器上。JobTracker 负责创建、调度作业中的每一个子任务(MapTask或 ReduceTask)运行于 TaskTracker 上,并监控它们。如果发现有失败的任务就重新运行它。

TaskTracker : 是 运 行 于 多 个 节 点 上 的 Slave 服 务 , 用 于 执 行 任 务 ,TaskTracker 需要运行在 HDFS 的 DataNode 上。

基 于 JobTracker 和 TaskTracker 的 运 行 架 构 为 MapReduce V1 , 在 下 一 代MapReduce V2 中,V1 架构已被 YARN 替代。关于 YARN 在本章稍后会讲解。从学习的难易程度来看,应该先了解 MapReduce V1。不论是 V1 还是 V2,都不会影响编写 MapReduce 程序,好比同样是一个 Web 应用,运行在 Tomcat 与 Jetty 下的效果是相同的。由此可见,实际上运行 MapReduce 作业的过程对开发人员是透明的。

5. MapReduce 编程模型
那么 MapReduce 程序是如何运行的呢?当编写完成 MapReduce 程序,并配置为一个 MapReduce 作业(Job)。这里的“作业”可以理解为:为了进行一次分布式计算任务而编写 MapReduce 程序后,将该程序提交到 MapReduce 执行框架中并执行的全过程。当客户端提交 Job 到 JobTracker 后,数据流如图所示。在这里插入图片描述从图中可以看出,待处理数据从输入到最后输出经过如下五个阶段:
(1)input:由 JobTracker 创建该 Job,并根据 Job 的输入计算输入分片(InputSplit)。这里要求待处理的数据集必须可以分解成许多小的数据集,且每一个小的数据集都可以完全并行地进行处理。输入目录中文件的数量决定了分片的数量,如果对于单个文件超过 HDFS 默认块大小(64MB),将按块大小进行分割。

(2)split:作业调度器获取 Job 的输入分片信息,对输入分片中的记录按照一定规则解析成键值对,“键”(key)是每一行的起始位置,以字节为单位,“值”(value)是本行文本内容。最后每个分片创建一个 MapTask 并分配到某个 TaskTracker。

(3)map:TaskTracker 开始执行 MapTask,处理输入的每一个键值对。如何处理取决于在该阶段的程序代码,处理完成后产生新的键值对,保存在本地。

(4)shuffle:混洗。将 MapTask 的输出有效地作为 ReduceTask 的输入过程。从图中可以看出该过程会在各 TaskTracker Node 之间进行数据交换,按照 key 进行分组。

(5)reduce:读取 Shufflling 阶段的输出,开始执行 ReduceTask,处理输入的每一个键值对。同样,如何处理取决于该阶段的程序代码。最后输出最终结果。

在 Hadoop 中,每个 MapReduce 计算任务都会被初始化为一个 Job。其中主要有两个处理阶段:map 阶段和 reduce 阶段。两个阶段均以键值对<key,value>作为输入,然后产生同样为<key,value>形式的输出。两个阶段分别对应 map()和 reduce()方法,这便是开发人员需要实现的两个最重要的阶段和方法,而其它阶段大多可由系统自动处理。

每 个 map() 方 法 负 责 计 算 一 个 输 入 分 片 并 输 出 计 算 结 果 , 由org.apache.hadoop.mapreduce.Mapper 类提供。每个 MapTask 都会创建一个 Mapper 实例。

每 个 reduce() 方 法 负 责 将 多 个 map() 的 处 理 结 果 进 行 汇 总 , 由org.apache.hadoop.mapreduce.Reducer 类提供。每个 ReduceTask 都会创建一个 Reducer 实例。

由以上分析可以看出 MapReduce 编程模型利用一个输入键值对集合来产生一个输出的键值对集合。总体上,一个 MapReduce 作业在 MapReduce 框架中的工作原理如图所示。
在这里插入图片描述
从图中可看出,一个 MapReduce 作业的完整运行过程包括以下 10 个步骤。
(1)编写 MapReduce 程序。包括 Mapper 处理、Reducer 处理以及为执行这些处理而定义的作业,首先将所有这些程序打包后运行作业。
(2)获取作业 ID。
(3)复制作业资源。
(4)提交作业资源。
(5)初始化作业。
(6)获取输入分片。
(7)心跳通信。TaskTracker 运行一个简单的循环来定期发送“心跳”给 JobTracker,表明 TaskTracker 是否还存活,同时也充当两者之间的消息通道。
(8)获取作业资源。
(9)分配任务。
(10)运行任务 MapTask 或 ReduceTask,最后输出 MapReduce 任务处理结果。

除了第一步由开发人员编码实现,其它步骤全部由 Hadoop MapReduce 框架自动执行。换句话说,编写一个 MapReduce 程序,以下三个基本部分是需要重点关注的:
在这里插入图片描述
6. 下一代 MapReduce 框架 YARN
前面都是以旧的 MapReduce V1 框架进行讲解,比如 hadoop 1.2.1 版本,实际上之前的所有 MapReduce 作业均是运行在 YARN 框架上。由于在 MapReduce V1中对于超过 4000 个节点的大型集群,开始面临扩展性的瓶颈。主要表现在:
在这里插入图片描述(1)JobTracker 单点瓶颈。MapReduce 中的 JobTracker 负责作业的分发、管理和调度,同时还必须和集群中所有的节点保持“心跳”通信,跟踪机器的运行状态。随着集群的数量和提交 Job 的数量不断增加,导致 JobTracker 的任务量随之增加,最终成为集群的单点瓶颈。

(2)TaskTracker 端。由于作业分配信息过于简单,有可能将多个资源消耗多或运行时间长的 Task 分配到同一个 Node 上,这样会造成作业的等待时间过长。

(3)作业延迟高。在 MapReduce 运行作业之前,需要TaskTracker 汇报自己的资源运行情况,JobTracker 根据获取的信息分配任务,TaskTracker 获取任务之后再开始运行。这样的结果导致小作业启动时间过长。

(4)编程框架不够灵活。虽然 MapReduce V1 框架允许用户自定义各阶段的对象和处理方法,但 MapReduce V1 还是限制了编程的模式及资源的分配。

基 于 以 上 问 题 , 下 一 代 MapReduce 框 架 YARN ( Yet Another ResourceNegotiator 另一种资源协调者,也称 MapReduce V2)应运而生。
在这里插入图片描述7. YARN(分布式资源管理系统) 架构
YARN 将 JobTracker 的职能进行了拆分,从而改善了 MapReduce V1 面临的扩展性瓶颈问题。将 JobTracker 承担的两大块任务:集群资源管理和作业管理进行分离,分别为管理集群上资源使用的资源管理器(ResourceManager)和管理集群上运行 任 务 (MapReduce 作 业 ) 生 命 周 期 的 应 用 主 体 (ApplicationMaster ), 然 后TaskTracker 演化成节点管理器(NodeManager),如图所示。
在这里插入图片描述YARN 仍 然 是 Master/Slave 结 构 , 全 局 的 ResourceManager 和 局 部 的NodeManager 组成了数据计算框架,ApplicationMaster 负责与 ResourceManager通信获取资源并与 NodeManager 配合完成节点的 Task 任务。下面列出了各实体角色的职责:
在这里插入图片描述在这里插入图片描述
8. YARN 配置文件
前面提过,基于 MapReduce V1 编写的程序无需修改也可以运行在 YARN 中。启动 YARN 需要单独配置,共涉及到如下文件:
在这里插入图片描述
在这里插入图片描述另外,YARN 需要单独启动 sbin/start-yarn.sh。在 NameNode 上,使用“jps”命令查看到“ResourceManager”进程表示已成功运行,相应地在 DataNode 上会出现“NodeManager”进程。

9. YARN 作业执行流程
作业在 YARN 中执行流程如图所示。
在这里插入图片描述(1)MapReduce 框架接收用户提交的作业,并为其分配一个新的应用 ID,并将应用的定义打包上传到 HDFS 上用户的应用缓存目录中,然后提交此应用给应用管理器。
(2)应用管理器同调度器协商获取运行应用主体所需的第一个资源容器。
(3)应用管理器在获取的资源容器上执行应用主体。
(4)应用主体计算应用所需资源,并发送资源请求到调度器。
(5)调度器根据自身统计的可用资源状态和应用主体的资源请求,分配合适的资源容器给应用主体。
(6)应用主体与所分配容器的节点管理器通信,提交作业情况和资源使用说明。
(7)节点管理器启用容器并运行任务。
(8)应用主体监控容器上任务的执行情况。
(9)应用主体反馈作业的执行状态信息和完成状态。

10. YARN 优势
YARN 优势具备的优势有:
在这里插入图片描述**

3、案例环境

1. 本案例实验环境
本章案例以 CentOS 7.3(64 位)环境进行实验。注意实验前关闭 firewalld 和禁用 SELinux。
Hadoop 有单机模式、伪分布式和完全分布式三种运行方式:

单机模式:无须配置,Hadoop 被视为一个非分布式模式运行的独立 Java进程。

伪分布式:只有一个节点的集群,这个节点既是 Master(主节点、主服务器)也是 Slave(从节点、从服务器),可在此单节点上以不同的 Java 进程模拟分布式中的各类节点。

完全分布式:对于 Hadoop,不同的系统会有不同的节点划分方式。在 HDFS看来分为 NameNode(管理者)和 DataNode(工作者),其中 NameNode只有一个,DataNode 可有多个;在 MapReduce 看来节点又分为 JobTracker(作业调度者)和 TaskTracker(任务执行者),其中 JobTracker 只有一个,TaskTracker 可以有多个。NameNode 和 JobTracker 可以部署在不同的机器上,也可以部署在同一机器上。部署 NameNode 和 JobTracker 的机器是Master,其余的机器都是 Slave。

单机模式和伪分布式均不能体现云计算的优势,通常用于程序测试与调试。本案例以 3 台主机介绍 Hadoop 完全分布式模式的安装,具体环境如表在这里插入图片描述
本案例拓扑图如图所示。
在这里插入图片描述2. 案例需求
下面是本案例的需求:
(1)搭建 Hadoop 环境。
(2)Hadoop 环境的管理与维护。
(3)使用 HDFS 分布式存储数据。
(4)使用自带的程序进行计算。

3. 案例实现思路
本案例的实现思路如下:
(1)安装 Hadoop 运行环境。
(2)Hadoop 完全分布式安装。
(3)运行 Hadoop 的 WordCount 程序。
(4)HDFS 体系结构。

**

二、案例实施

案例之前的初始化配置,每台主机实验前关闭 firewalld 和禁用 SELinux,/etc/hosts 文件都加入如下内容,还要安装时间同步服务器,每台主机修改对应的主机名:
所有节点上的操作
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# vim /etc/sysconfig/selinux
//永久关闭内核安全机制
在这里插入图片描述[root@localhost ~]# vim /etc/hosts
末尾添加
192.168.10.101 node1
192.168.10.102 node2
192.168.10.103 node3

[root@localhost ~]# yum -y install chrony
[root@localhost ~]# systemctl start chronyd
[root@localhost ~]# systemctl enable chronyd

[root@localhost ~]# chronyc sources -v
// 查看确认时间同步

每个节点都查看一下时间发现时间都同步了
[root@localhost ~]# date
2021年 04月 09日 星期五 09:48:20 CST

在每个节点修改主机名,其他节点和节点1是相同操作只是主机名不一样:
[root@localhost ~]# hostname node1
[root@localhost ~]# bash
[root@node1 ~]#

**

1、安装 Hadoop 运行环境

1. 创建用户
首先在三台服务上新建用户 hduser,然后设置权限。
所有节点上操作
(1)创建 hadoop 用户组,输入命令:
[root@node1 ~]# groupadd hadoop

(2)创建 hduser 用户,输入命令:
[root@node1 ~]# useradd -g hadoop hduser

(3)设置 hduser 的密码,输入命令:
[root@node1 ~]# passwd hduser
更改用户 hduser 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

[root@node1 ~]# vim /etc/sudoers
// 为 hduser 用户添加 sudo 权限

找到root ALL=(ALL) ALL这行,在这一行下添加
在这里插入图片描述
2. 安装 JDK
三台服务器上都要进行 JDK 的安装。
(1)下载 jdk-8u171-linux-x64.rpm 上传到服务器上。
三台服务器上都要进行 JDK 的安装。
(2)运行安装命令:
[root@node1 ~]# ls
anaconda-ks.cfg hadoop-2.6.5.tar.gz jdk-8u171-linux-x64.rpm

[root@node1 ~]# rpm -ivh jdk-8u171-linux-x64.rpm

(3)配置环境变量,输入命令:
[root@node1 ~]# vim /etc/profile
打开 profile 文件,在文件最下面加入如下内容:
在这里插入图片描述

[root@node1 ~]# source /etc/profile
//输入命令使配置生效。

在node1上执行即可 配置免密登录
这一步一路回车键
在这里插入图片描述在这里插入图片描述这里让输入的密码是我们每个节点的上用户的登录密码,这里我的用户是管理员用户的账号密码,如果是其他用户就输入相对应的密码就行了
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
从 node1 主机上测试 ssh 登录所有主机不需要密码说明正常,这对于 Hadoop来说就足够了。因为后面将 node1 作为 Master 节点(主节点,管理者角色),其余主机为 Slave 节点(从节点)。
[root@node1 ~]# ssh root@192.168.10.102
Last login: Fri Apr 9 15:39:04 2021 from 192.168.10.1
[root@node2 ~]#

[root@node1 ~]# ssh root@192.168.10.103
Last login: Fri Apr 9 15:39:08 2021 from 192.168.10.1
[root@node3 ~]#

//验证了远程登录节点2、3不需要密码

**

2、Hadoop 完全分布式安装

1. 安装 Hadoop,所有节点都要操作
通过官网下载获取 Hadoop 压缩包 hadoop-2.6.5.tar.gz,上传到 服务器上将压缩包解压到/home/hduser 目录下
[root@node1 ~]# tar zxvf hadoop-2.6.5.tar.gz -C /home/hduser

[root@node1 ~]# cd /home/hduser/
[root@node1 hduser]# ls
hadoop-2.6.5
[root@node1 hduser]# mv hadoop-2.6.5 hadoop
[root@node1 hduser]# ls
hadoop
//解压后重命名为 hadoop

进入“hadoop”目录,其目录结构如下:
bin:执行文件目录。包含 hadoop、hdfs、yarn 等命令,所有用户均可执行。

etc:Hadoop 配置文件都在此目录。

include:包含 C 语言接口开发所需头文件。

lib:包含 C 语言接口开发所需链接库文件。

libexec:运行 sbin 目录中的脚本会调用该目录下的脚本。

logs:日志目录,在运行过 Hadoop 后会生成该目录。

sbin:仅超级用户能够执行的脚本,包括启动和停止 dfs、yarn 等。

share:包括 doc 和 hadoop 两个目录,其中 doc 目录包含大量的 Hadoop帮助文档;hadoop 目录包含了运行 Hadoop 所需的所有 jar 文件,在开发中用到的 jar 文件也可在该目录找到。

配置 hadoop 环境变量
在这里插入图片描述
上图中的命令一定要按照这个方式写,因为里面有转义字符,而且他们还是一个整体
[root@node1 ~]# source /etc/profile
//输入命令使配置生效。

如果是按照下面这样的方式写入,可能会导致环境变量丢失,会使你用的远程工具能连接上虚拟机,但所有命令都用不了
[root@node1 ~]# vim /etc/profile
末尾添加
export HADOOP_HOME=/home/hduser/hadoop
export PATH=$HADOOP_HOME/bin:$PATH
[root@node1 ~]# source /etc/profile

如果不心用了上面的方法改了并且让配置生效了,解决办法是用虚拟机的字符终端输入vim /etc/profile 进入到配置文件中将你之前写入的两个变量删除,之后保存退出重启虚拟机之后环境变量会重新生成,这时候你的远程终端也就能正常使用了。

2. 配置 Hadoop在节点1操作
先进入 node1 进行配置,随后将配置文件复制到 node2、node3。配置 Hadoop主要涉及的配置文件有 7 个,都在 hadoop/etc/hadoop 文件夹下,包括:hadoop-env.sh、yarn-env.sh、slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml。具体配置如下。
(1)编辑/home/hduser/hadoop/etc/hadoop/hadoop-env.sh 文件

[root@node1 ~]# vim /home/hduser/hadoop/etc/hadoop/hadoop-env.sh

开头部分添加此内容
export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64

[root@node1 ~]# vim /home/hduser/hadoop/etc/hadoop/slaves
// 打开并清空原内容,然后输入如下内容
node2
node3

[root@node1 ~]# vim /home/hduser/hadoop/etc/hadoop/core-site.xml
//该文件是 Hadoop 全局配置。打开并在元素中增加配置属性如下在这里插入图片描述
[root@node1 ~]# vim /home/hduser//hadoop/etc/hadoop/hdfs-site.xml
//该文件是 HDFS 的配置。打开并在元素中增加配置属性如下
在这里插入图片描述
在这里插入图片描述
//该文件是 MapReduce 的配置,它有一份模板文件,可从模板文件 mapred-site.xml.template 复制。打开并在元素中增加配置属性如下
在这里插入图片描述
[root@node1 ~]# vim /home/hduser/hadoop/etc/hadoop/yarn-site.xml
//如果在 mapred-site.xml 配置了使用 YARN 框架,那么 YARN 框架使用此文件中的配置。打开并在元素中增加配置属性如下
在这里插入图片描述
将这 7 个文件复制到 node2、node3 的同目录下
[root@node1 ~]# scp -r /home/hduser/hadoop/ node2:/home/hduser
[root@node1 ~]# scp -r /home/hduser/hadoop/ node3:/home/hduser

//以上两条命令分别表示将 node1 的 Hadoop 配置文件夹复制到 node2、node3。

3. 验证安装配置
下面验证 Hadoop 配置是否正确。
(1)在 Master 主机(node1)上格式化 NameNode
[root@node1 ~]# cd /home/hduser/hadoop/
[root@node1 hadoop]# bin/hdfs namenode -format
在这里插入图片描述
(2)查看 Java 进程
在这里插入图片描述
(3)启动 YARN,也可以使用 start-all.sh 同时启动 HDFS 和 YARN
在这里插入图片描述

(4)查看集群状态
在这里插入图片描述在这里插入图片描述
至此 Hadoop 完全分布式安装完毕。可以使用浏览器查看 HDFS 运行状态:http://192.168.10.101:50070,如图所示。
在这里插入图片描述
输入下面命令停止 Hadoop。
[root@node1 hadoop]#sbin/stop-all.sh

**

3、运行 Hadoop 的 WordCount 程序

WordCount 程序是 Hadoop 本身提供的使用 MapReduce 框架编写的入门程序,类似于刚学习 Java 语言时编写的 Hello World 程序。WordCount 实现了对文本中的单词计数的功能,并要求输出结果并按单词首字母排序。比如,输入一个文件,其内容如下:
hello world
hello hadoop
hello mapreduce
输出结果为:
hadoop 1
hello 3
mapreduce 1
world 1

这里暂不介绍如何编写 MapReduce,仅是运行该 MapReduce 程序来测试Hadoop 的运行情况。首先,要找出 WordCount 程序,然后,还需要提供被计数的文本文件。Hadoop 的示例程序位于下面的文件中:

share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jar

这个文件中包含了 WordCount 程序。接下来创建 2 个文本文件并保存到 HadoopHDFS 中,

本小节以下部分涉及到的命令在后续章节还会详细介绍,在此可先简单了解Hadoop 相关的 shell 操作。

(1)在操作系统/home/hduser/file 目录下创建 file1.txt、file2.txt
file1.txt 输入内容:Hello World hi HADOOP
file2.txt 输入内容:Hello hadoop hi CHINA
在这里插入图片描述
(2)启动 HDFS 后创建 HDFS 目录/input2
[root@node1 ~]# cd /home/hduser/hadoop/
[root@node1 hadoop]# sbin/start-all.sh
[root@node1 hadoop]# bin/hadoop fs -mkdir /input2

(3)将 file1.txt、file2.txt 保存到 HDFS 中
[root@node1 hadoop]# bin/hadoop fs -put /home/hduser/file/file* /input2

(4)查看 HDFS 上是否已经存在 file1.txt、file2.txt
在这里插入图片描述
(5)执行 WordCount 程序
有了示例程序及文本文件,就可以通过运行包命令“hadoop jar xxx.jar”来执行WordCount 程序。进入 node1 主机上的 Hadoop 安装目录,输入如下命令。

[root@node1 hadoop]# bin/hadoop jar /home/hduser/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jar wordcount /input2/ /output2/wordcount1

//“wordcount”为示例 jar 包提供的参数选项,wordcount 仅是其提供功能之一;“/input2/”表示文本文件输入目录(HDFS);“/output2/wordcount1”表示提供的输出目录(HDFS)参数。可以发现,在数据量小的时候,使用 Hadoop 运行并没有优势,花费在通信同步上的开销比实际单词统计处理开销还要多,所以说 Hadoop 主要用于大数据的处理。当执行完成后,使用如下命令来查看输出目录中所有果,如下所示。

[root@node1 hadoop]# bin/hadoop fs -cat /output2/wordcount1/*
CHINA 1
HADOOP 1
Hello 2
World 1
hadoop 1
hi 2

//以上输出结果表示已经成功安装了 Hadoop

**

HDFS 体系结构

在这里插入图片描述在这里插入图片描述在这里插入图片描述
(1)数据块(Block)
HDFS 中的文件被分成块进行存储,如图中 DataNode 中数字编号的方块。它是文件存储处理的最小逻辑单元,默认块大小为 64MB,使用文件块的好处是:

文件的所有块并不需要存储在同一个磁盘上,可以利用集群上的任意一个磁盘进行存储。

对分布式系统来说,由于块的大小是固定的,因此计算单个磁盘能存储多少个块就相对容易,可简化存储管理。

在数据冗余备份时,将每个块复制到少数几台独立的机器上(默认为 3 台),可以确保在块、磁盘或机器发生故障后数据不会丢失。如果发现一个块不可用,系统会从其它地方读取另一个副本,这个过程对用户是透明的。

使用 fsck 命令可以显示块信息:
语法:
hdfs fsck / -files -blocks

fsck 命令将列出文件系统中根目录“/”下各个文件由哪些块构成。fsck 命令只是从NameNode 获取信息,并不与任何 DataNode 交互,因此并不真正获取数据。

(2)NameNode 和 DataNode 节点
NameNode 和 DataNode 属于 HDFS 集群的两类节点。
在这里插入图片描述
NameNode 负责管理文件系统的命名空间,属于管理者角色。它维护文件系统树内所有文件和目录,记录每个文件在各个 DataNode 上的位置和副本信息,并协调客户端对文件的访问。这些信息以两种形式存在:命名空间镜像文件(fsimage_)和编辑日志文件(edits_),用于存储跟数据相关的数据,称为元数据,位于 NameNode 节点 node1 的 hadoop/dfs/name/current 目录(由 hdfs-site.xml 中的 dfs.namenode.name.dir 属性指定)可看出除了元数据,还包括“VERSION”和“seen_txid”两个文件。
在这里插入图片描述
VERSION:版本信息,包含了文件系统的唯一标识符。
seen_txid:该文件用于事务管理,里面保存一个整数,表示 edits_*的尾数。

在这里插入图片描述DataNode 根据需要存储并检索数据块,并定期向 NameNode 发送所存储的块列表,属于工作者角色。负责所在物理节点的存储管理,按照一次写入,多次读取的原则。存储文件由数据块组成,典型的块大小是 64MB,尽量将各数据块分布到各个不同的 DataNode 节点上。上图中某个文件被分成 4 块,在多个 DataNode中存储,并且每块复制 2 个拷贝,存储在其它 DataNode 上。DataNode 节点的数据 存 储 目 录 为 /home/hduser/hadoop/dfs/data ( 由 hdfs-site.xml 中 的
dfs.datanode.data.dir 属性指定)。以 node2 中部分数据块的某一目录为例,如“/home/hduser/hadoop/dfs/data/current/BP-1273011878-192.168.10.101-1618022864422/current/finalized/subdir0/subdir0”,该目录下文件内容如下图所示。
主要包括两类文件:

blk_:HDFS 的数据块,保存具体的二进制数据。

blk_.meta:数据块的属性信息,包括版本信息、类型信息等。
在这里插入图片描述DataNode 负责处理文件系统客户端的文件读写请求,并在 NameNode 的统一调度下进行数据块的创建、删除和复制工作。如果在 NameNode 上的数据损坏,HDFS中 所 有 的 文 件 都 不 能 被 访 问 , 由 此 可 见 NameNode 节 点 的 重 要 性 。 为 了 保 证NameNode 的 高 可 用 性 , Hadoop 对 NameNode 进 行 了 补 充 , 即 SecondaryNameNode 节点。

(3)SecondaryNameNode 节点
系统中会同步运行一个 Secondary NameNode,也称二级 NameNode。相当于NameNode 的快照,能够周期性的备份 NameNode,记录 NameNode 中的元数据等,可以用来恢复 NameNode,但 Secondary NameNode 中的备份会滞后于 NameNode,所以会带来一定的数据损失。为了防止宕机,通常是将 Secondary NameNode 和NameNode 设 置 为 不 同 的 主 机 。 使 用 hdfs-site.xml 中 配 置 的dfs.namenode.secondary.http-address 属 性 值 可 以 通 过 浏 览 器 查 看 SecondaryNameNode 运行状态,如下图所示。
在这里插入图片描述
2. HDFS 集群(Master/Slave 架构)
一 个 HDFS 集 群 是 由 一 个 NameNode 和 多 个 DataNode 组 成 , 属 于 典 型 的Master/Slave 模式。如下图所示其读写流程如下:
在这里插入图片描述
在这里插入图片描述
了解了 HDFS 节点之间的结构关系后,下面介绍 HDFS 常用的节点管理操作。

(1)节点添加
可扩展性是 HDFS 的一个重要特性,向 HDFS 集群中添加节点很容易实现。添加一个新的 DataNode 节点步骤如下。

①对新节点进行系统配置,包括 hostname、hosts 文件、JDK 环境、防火墙等;

②在新加节点上安装好 Hadoop,要和 NameNode 使用相同的配置,可以直接从NameNode 复制;

③在 NameNode 上修改$HADOOP_HOME/conf/slaves 文件,加入新加节点主机名;

④运行启动 hdfs 命令:bin/start-all.sh。

(2)负载均衡
HDFS 的数据在各个 DataNode 中的分布可能很不均匀,尤其是在 DataNode 节点出现故障或新增 DataNode 节点时。使用如下命令可重新平衡 DataNode 上的数据块的分布:sbin/start-balancer.sh

(3)安全机制
Master/Slave 架构通过 NameNode 来统一调度,没有 NameNode,文件系统将无法使用。Hadoop 采用两种机制来确保 NameNode 的安全。

第一种是将 NameNode 上存储的元数据文件转移到其它文件系统中。

第二种就是使用 Secondary NameNode 同步备份。

  1. HDFS 的 Web 界面
    通过 http://NameNodeIP:50070 可以访问 HDFS 的 Web 界面,该界面提供了NameNode 基本信息与所有 DataNode 信息,如图1和图2所示。在后续章节中 ,“NameNodeIP”不作特别说明情况下,其表示 NameNode 节点的 IP 或 hostname,请自行替换。

                    图1 DataNode 基本信息
    

在这里插入图片描述

             图2 此外还提供浏览文件系统、日志功能等。

在这里插入图片描述
4. HDFS 的命令行操作
调用 Hadoop 的文件系统 Shell(FileSystem Shell)命令格式为:

语法:
hadoop fs

其 中 “hadoop”命 令 位 于 $HADOOP_HOME/bin 目 录 下 , “fs”为 其 参 数 表 示 FSShell,“”是 fs 的子命令,格式类似于 Linux Shell 命令,并且功能也类似。如:
[root@node1 bin]#hadoop fs -ls file:///home/hduser
该命令使用了 fs 子命令-ls,最后一个参数表示本地系统文件路径。运行命令后会列出该目录下所有文件。可以看出 Hadoop fs 子命令-ls 与 Linux 中的 ls 命令的作用及语法均是相似的。但应该注意到,在 HDFS 中访问本地系统文件加上了前缀“file://”,那么是否可以省略呢?

Hadoop 的文件系统可以支持多种文件系统的访问,比如 Local(本地文件系统)和 HDFS。访问时均使用 URI 路径作为参数,URI 格式为:scheme://authority/path,如“file://path”和“hdfs://NameNodeIP:NameNodePort/path”分别表示访问本地文件系
统和 HDFS。其中 scheme 和 authority 为可选,如果未指定,则使用 Hadoop 配置(core-site.xml 属性 fs.defaultFS)中指定的文件系统,默认情况下 fs.defaultFS 的值为“file:///”,由于在前面配置时将其指定为“hdfs://node1:9000”,所以在上面的命令中要访问本地文件系统就必须加上“file://”前缀。

所以,如果将上面命令修改为:
[root@node1 bin]#hadoop fs -ls home/hduser

则表示查看 HDFS 文件系统下的“/home/hduser”目录,如果这个目录在 HDFS 中
不存在就会失败。在后续讲解中,不作特别说明会省略 URI 前缀,请注意在环境中fs.defaultFS 属性的配置。

了解基本的语法后,再具体来看 fs 操作常用子命令。

(1)创建目录:mkdir
语法:
hadoop fs -mkdir
接受路径指定的 URI 作为参数,创建这些目录。

[root@node1 bin]#hadoop fs -mkdir /user
#在 HDFS 中创建“/user”目录

[root@node1 bin]# hadoop fs -mkdir /user/hadoop
#在 HDFS 中创建“/user/hadoop”目录

[root@node1 bin]# hadoop fs -mkdir /user/hadoop/dir1 /user/hadoop/dir2
#同时创建多个目录

(2)列表文件:ls
语法:
hadoop fs -ls
文件或目录的返回如下所示。
[root@node1 bin]# hadoop fs -ls /input2/file1.txt
-rw-r–r-- 2 root supergroup 22 2020-04-05 16:40 /input2/file1.txt

[root@node1 bin]# hadoop fs -ls /input2/
Found 2 items
-rw-r–r-- 2 root supergroup 22 2020-04-05 16:40 /input2/file1.txt
-rw-r–r-- 2 root supergroup 22 2020-04-05 16:40 /input2/file2.txt

(3)查看文件:cat
语法:
hadoop fs –cat URI [URI…]
输出路径指定文件的内容。

[root@node1 bin]# hadoop fs -cat /input2/file1.txt /input2/file2.txt
Hello World hi HADOOP
Hello hadoop hi CHINA

(4)转移文件:put、get、mv、cp
① put 命令
语法:
hadoop fs –put …

从本地文件系统中复制单个或多个文件到 HDFS。也支持从标准输入中读取输入写入目标文件系统。其中 localsrc 只能是本地文件,dst 只能为 HDFS 文件,且不受fs.defaultFS 属性影响。

[root@node1 bin]#hadoop fs -put /home/hduser/file/file1.txt /input2
#将本地文件复制到 HDFS 目录“/input2”

[root@node1 bin]#hadoop fs -put /home/hduser/file/file1.txt /home/hduser/file/file2.txt /input2
#将多个本地文件复制到 HDFS 目录“/input2”

② get 命令
语法:
hadoop fs -get

复制 HDFS 文件到本地文件系统,put 命令的逆操作。其中 src 只能为 HDFS 文件,localdst 只能是本地文件,且同样不受 fs.defaultFS 属性影响。

[root@node1 bin]#hadoop fs -get /input2/file1.txt $HOME/file.txt
在这里插入图片描述
③ mv 命令
语法:
hadoop fs -mv URI[URI…]

将文件从源路径移动到目标路径,允许多个源路径,目标路径必须是一个目录。不允许在不同的文件系统间移动文件,也就是说所有路径都必须是同一文件系统 URI格式。

[root@node1 bin]#hadoop fs -mv /input2/file1.txt /input2/file2.txt /user/hadoop/dir1
#将 HDFS 上的 file1.txt、file2.txt 移动到 dir1 中

④ cp 命令
语法:
hadoop fs -cp URI [URI…]
将文件从源路径复制到目标路径,允许多个源路径,目标路径必须是一个目录。不允许在不同的文件系统间复制文件。

[root@node1 bin]#hadoop fs -cp /input2/file1.txt /input2/file2.txt /user/hadoop/dir1
#在 HDFS 中复制多个文件到“/user/hadoop/dir1”

[root@node1 bin]#hadoopfs -cp file:///file1.txt file:///file2.txt file:///tmp
#在本地文件系统中复制多个文件到目录“file:///tmp”

(5)删除文件:rm、rmr
① rm 命令
语法:
hadoop fs -rm URI [URI…]
删除指定的文件。只删除非空目录和文件。

[root@node1 bin]# hadoop fs -rm /input2/file3.txt
rm: `/input2/file3.txt’: No such file or directory

[root@node1 bin]# hadoop fs -rm /input2/file1.txt
Deleted /input2/file1.txt

② rmr 命令
语法:
hadoop fs -rmr URI [URI…]
rm 的递归版本。整个文件夹及子文件夹将全部删除。

[root@node1 bin]# hadoop fs -rmr /input2
#现在推荐使用 hadoop fs -rm -r /input2 命令
Deleted /input2

[root@node1 bin]# hadoop fs -ls /input2
ls: `/input2’: No such file or directory

进行后续的测试之前,先恢复 file1.txt 和 file2.txt 文件。

(6)管理命令:test、du、expunge

① test 命令
语法:
hadoop fs -test -[选项] URI

选项:
-e:检查文件是否存在。如果存在则返回 0。
-z:检查文件是否 0 字节。如果是则返回 0。
-d:检查路径是否为目录,如果是则返回 0,否则返回 1。

[root@node1 bin]#hadoop fs -test -e /input2/file3.txt
[root@node1 bin]# echo $?
1
[root@node1 bin]# hadoop fs -test -z /input2/file1.txt
[root@node1 bin]# echo $?
1
[root@node1 bin]# hadoop fs -test -d /input2
[root@node1 bin]# echo $?
0

② du 命令
语法:
hadoop fs -du URI [URI …]
显示目录中所有文件的大小。

[root@node1 bin]# hadoop fs -du /input2
#显示文件的大小,如果是目录则列出所有文件及其大小
22 /input2/file1.txt
22 /input2/file2.txt

[root@node1 bin]# hadoop fs -du -s /input2
44 /input2

[root@node1 bin]# hadoop fs -du -s /input2/file1.txt
#显示文件的大小,如果是目录则统计总大小
22 /input2/file1.txt

③ expunge 命令
语法:
hadoop fs -expunge
清空回收站。
以上介绍了部分常用命令,更多命令可自行查阅 Hadoop 帮助文档,获取位置:
$HADOOP_HOME/share/doc/hadoop/hadoop-project-dist/hadoop-common/FileSystemShell.html。

热门文章

暂无图片
编程学习 ·

exe4j详细使用教程(附下载安装链接)

一、exe4j介绍 ​ exe4j是一个帮助你集成Java应用程序到Windows操作环境的java可执行文件生成工具&#xff0c;无论这些应用是用于服务器&#xff0c;还是图形用户界面&#xff08;GUI&#xff09;或命令行的应用程序。如果你想在任务管理器中及Windows XP分组的用户友好任务栏…
暂无图片
编程学习 ·

AUTOSAR从入门到精通100讲(126)-浅谈车载充电系统通信方案

01 引言 本文深入研究车载充电系统策略,设计出一套基于电动汽车电池管理系统与车载充电机的CAN通信协议,可供电动汽车设计人员参考借鉴。 02 电动汽车充电系统通讯网络 电动汽车整车控制系统中采用的是CAN总线通信方式,由一个整车内部高速CAN网络、内部低速CAN网络和一个充电…
暂无图片
编程学习 ·

CMake(九):生成器表达式

当运行CMake时&#xff0c;开发人员倾向于认为它是一个简单的步骤&#xff0c;需要读取项目的CMakeLists.txt文件&#xff0c;并生成相关的特定于生成器的项目文件集(例如Visual Studio解决方案和项目文件&#xff0c;Xcode项目&#xff0c;Unix Makefiles或Ninja输入文件)。然…
暂无图片
编程学习 ·

47.第十章 网络协议和管理配置 -- 网络配置(八)

4.3.3 route 命令 路由表管理命令 路由表主要构成: Destination: 目标网络ID,表示可以到达的目标网络ID,0.0.0.0/0 表示所有未知网络,又称为默认路由,优先级最低Genmask:目标网络对应的netmaskIface: 到达对应网络,应该从当前主机哪个网卡发送出来Gateway: 到达非直连的网络,…
暂无图片
编程学习 ·

元宇宙技术基础

请看图&#xff1a; 1、通过AR、VR等交互技术提升游戏的沉浸感 回顾游戏的发展历程&#xff0c;沉浸感的提升一直是技术突破的主要方向。从《愤怒的小鸟》到CSGO,游戏建模方式从2D到3D的提升使游戏中的物体呈现立体感。玩家在游戏中可以只有切换视角&#xff0c;进而提升沉浸…
暂无图片
编程学习 ·

flink的伪分布式搭建

一 flink的伪分布式搭建 1.1 执行架构图 1.Flink程序需要提交给 Job Client2.Job Client将作业提交给 Job Manager3.Job Manager负责协调资源分配和作业执行。 资源分配完成后&#xff0c;任务将提交给相应的 Task Manage。4.Task Manager启动一个线程以开始执行。Task Manage…
暂无图片
编程学习 ·

十进制正整数与二进制字符串的转换(C++)

Function one&#xff1a; //十进制数字转成二进制字符串 string Binary(int x) {string s "";while(x){if(x % 2 0) s 0 s;else s 1 s;x / 2;}return s; } Function two&#xff1a; //二进制字符串变为十进制数字 int Decimal(string s) {int num 0, …
暂无图片
编程学习 ·

[含lw+源码等]微信小程序校园辩论管理平台+后台管理系统[包运行成功]Java毕业设计计算机毕设

项目功能简介: 《微信小程序校园辩论管理平台后台管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序做的辩论管理前台和Java做的后台管理系统&#xff1a; 微信小程序——辩论管理前台涉及技术&#xff1a;WXML 和 WXS…
暂无图片
编程学习 ·

树莓派驱动DHT11温湿度传感器

1&#xff0c;直接使用python库 代码如下 import RPi.GPIO as GPIO import dht11 import time import datetimeGPIO.setwarnings(True) GPIO.setmode(GPIO.BCM)instance dht11.DHT11(pin14)try:while True:result instance.read()if result.is_valid():print(ok)print(&quo…
暂无图片
编程学习 ·

ELK简介

ELK简介 ELK是三个开源软件的缩写&#xff0c;Elasticsearch、Logstash、Kibana。它们都是开源软件。不过现在还新增了一个 Beats&#xff0c;它是一个轻量级的日志收集处理工具(Agent)&#xff0c;Beats 占用资源少&#xff0c;适合于在各个服务器上搜集日志后传输给 Logstas…
暂无图片
编程学习 ·

Linux 基础

通常大数据框架都部署在 Linux 服务器上&#xff0c;所以需要具备一定的 Linux 知识。Linux 书籍当中比较著名的是 《鸟哥私房菜》系列&#xff0c;这个系列很全面也很经典。但如果你希望能够快速地入门&#xff0c;这里推荐《Linux 就该这么学》&#xff0c;其网站上有免费的电…
暂无图片
编程学习 ·

Windows2022 无线网卡装不上驱动

想来 Windows2022 和 windows10/11 的驱动应该差不多通用的&#xff0c;但是死活装不上呢&#xff1f; 搜一下&#xff0c;有人提到 “默认安装时‘无线LAN服务’是关闭的&#xff0c;如果需要开启&#xff0c;只需要在“添加角色和功能”中&#xff0c;选择开启“无线LAN服务…
暂无图片
编程学习 ·

【嵌入式面试宝典】版本控制工具Git常用命令总结

目录 创建仓库 查看信息 版本回退 版本检出 远程库 Git 创建仓库 git initgit add <file> 可反复多次使用&#xff0c;添加多个文件git commit -m <message> 查看信息 git status 仓库当前的状态git diff 差异对比git log 历史记录&#xff0c;提交日志--pret…
暂无图片
编程学习 ·

用Postman生成测试报告

newman newman是一款基于nodejs开发的可以运行postman脚本的工具&#xff0c;使用Newman&#xff0c;可以直接从命令运行和测试postman集合。 安装nodejs 下载地址&#xff1a;https://nodejs.org/en/download/ 选择自己系统相对应的版本内容进行下载&#xff0c;然后傻瓜式安…
暂无图片
编程学习 ·

Java面向对象之多态、向上转型和向下转型

文章目录前言一、多态二、引用类型之间的转换Ⅰ.向上转型Ⅱ.向下转型总结前言 今天继续Java面向对象的学习&#xff0c;学习面向对象的第三大特征&#xff1a;多态&#xff0c;了解多态的意义&#xff0c;以及两种引用类型之间的转换&#xff1a;向上转型、向下转型。  希望能…