大数据技术之Hadoop(入门)

第 1 章 Hadoop 概述

1.1 Hadoop 是什么

  • Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
  • 主要解决,海量数据的存储和海量数据的分析计算问题。
  • 广义上来说,Hadoop通常是指一个更广泛的概念——Hadoop生态圈。

image-20220125223024299

1.2 Hadoop 发展历史(了解)

  • Hadoop创始人Doug Cutting,为 了实 现与Google类似的全文搜索功能,他在Lucene框架基础上进行优 化升级,查询引擎和索引引擎。

  • 2001年年底Lucene成为Apache基金会的一个子项目。

  • 对于海量数据的场景,Lucene框 架面 对与Google同样的困难,存 储海量数据困难,检 索海 量速度慢。

  • 学习和模仿Google解决这些问题的办法 :微型版Nutch。

  • 可以说Google是Hadoop的思想之源(Google在大数据方面的三篇论文)

    • GFS —>HDFS Map-Reduce —>MR BigTable —>HBase
  • 2003-2004年,Google公开了部分GFS和MapReduce思想的细节,以此为基础Doug Cutting等人用 了2年业余时间实现了DFS和MapReduce机制,使Nutch性能飙升。

  • 2005 年Hadoop 作为 Lucene的子项目 Nutch的一部分正式引入Apache基金会。

  • 2006 年 3 月份,Map-Reduce和Nutch Distributed File System (NDFS)分别被纳入到 Hadoop 项目 中,Hadoop就此正式诞生,标志着大数据时代来临。

  • 名字来源于Doug Cutting儿子的玩具大象

1.3 Hadoop 三大发行版本(了解)

Hadoop 三大发行版本:Apache、Cloudera、Hortonworks。

  • Apache 版本最原始(最基础)的版本,对于入门学习最好。2006
  • Cloudera 内部集成了很多大数据框架,对应产品 CDH。2008
  • Hortonworks 文档较好,对应产品 HDP。2011
  • Hortonworks 现在已经被 Cloudera 公司收购,推出新的品牌 CDP。

1)Apache Hadoop

2)Cloudera Hadoop

  • 官网地址:https://www.cloudera.com/downloads/cdh

  • 下载地址:https://docs.cloudera.com/documentation/enterprise/6/releasenotes/topics/rg_cdh_6_download.html

    • 2008 年成立的 Cloudera 是最早将 Hadoop 商用的公司,为合作伙伴提供 Hadoop 的 商用解决方案,主要是包括支持、咨询服务、培训。

    • 2009 年 Hadoop 的创始人 Doug Cutting 也加盟 Cloudera 公司。Cloudera 产品主 要为 CDH,Cloudera Manager,Cloudera Support

    • CDH 是 Cloudera 的 Hadoop 发行版,完全开源,比 Apache Hadoop 在兼容性,安 全性,稳定性上有所增强。Cloudera 的标价为每年每个节点 10000 美元。

    • Cloudera Manager 是集群的软件分发及管理监控平台,可以在几个小时内部署好一 个 Hadoop 集群,并对集群的节点及服务进行实时监控。 3)Hortonworks Hadoop

3)Hortonworks Hadoop

  • 官网地址:https://hortonworks.com/products/data-center/hdp/
  • 下载地址:https://hortonworks.com/downloads/#data-platform
    • 2011 年成立的 Hortonworks 是雅虎与硅谷风投公司 Benchmark Capital 合资组建。
    • 公司成立之初就吸纳了大约 25 名至 30 名专门研究 Hadoop 的雅虎工程师,上述 工程师均在 2005 年开始协助雅虎开发 Hadoop,贡献了 Hadoop80%的代码。
    • Hortonworks 的主打产品是 Hortonworks Data Platform(HDP),也同样是 100%开 源的产品,HDP 除常见的项目外还包括了 Ambari,一款开源的安装和管理系统。
    • 2018 年 Hortonworks 目前已经被 Cloudera 公司收购

1.4 Hadoop 优势(4 高)

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

1.5 Hadoop 组成(面试重点)

  • 在 Hadoop1.x 时 代 , Hadoop中 的MapReduce同 时处理业务逻辑运算和资 源的调度,耦合性较大。

  • 在Hadoop2.x时 代,增 加 了Yarn。Yarn只负责 资 源 的 调 度 , MapReduce 只负责运算。 Hadoop3.x在组成上没 有变化。

image-20220125223656184

1.5.1 HDFS 架构概述

Hadoop Distributed File System,简称 HDFS,是一个分布式文件系统。

  • NameNode(nn):存储文件的元数据,如文件名文件目录结构文件属性(生成时间、副本数、 文件权限),以及每个文件的块列表块所在的DataNode等。
  • DataNode(dn):在本地文件系统存储文件块数据,以及块数据的校验和
  • Secondary NameNode(2nn):每隔一段时间对NameNode元数据备份

1.5.2 YARN 架构概述

Yet Another Resource Negotiator 简称 YARN ,另一种资源协调者,是 Hadoop 的资源管理器。

  • 1)ResourceManager(RM):整个集群资源(内存、CPU等)的老大
  • 2)NodeManager(N M):单个节点服务器资源老大
  • 3)ApplicationMaster(AM):单个任务运行的老大
  • 4)Container:容器,相当一台独立的服务器,里面封装了 任务运行所需要的资源,如内存、CPU、磁盘、网络等。

image-20220125224113477

1.5.3 MapReduce 架构概述

MapReduce 将计算过程分为两个阶段:Map 和 Reduce

  1. Map 阶段并行处理输入数据

  2. Reduce 阶段对 Map 结果进行汇总

image-20220125224209286

1.5.4 HDFS、YARN、MapReduce 三者关系

image-20220125224237088

1.6 大数据技术生态体系

image-20220125224300699

图中涉及的技术名词解释如下:

1)Sqoop:Sqoop 是一款开源的工具,主要用于在 Hadoop、Hive 与传统的数据库(MySQL) 间进行数据的传递,可以将一个关系型数据库(例如 :MySQL,Oracle 等)中的数据导进 到 Hadoop 的 HDFS 中,也可以将 HDFS 的数据导进到关系型数据库中。

2)Flume:Flume 是一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统, Flume 支持在日志系统中定制各类数据发送方,用于收集数据;

3)Kafka:Kafka 是一种高吞吐量的分布式发布订阅消息系统.

4)Spark:Spark 是当前最流行的开源大数据内存计算框架。可以基于 Hadoop 上存储的大数 据进行计算。

5)Flink:Flink 是当前最流行的开源大数据内存计算框架。用于实时计算的场景较多。

6)Oozie:Oozie 是一个管理 Hadoop 作业(job)的工作流程调度管理系统。

7)Hbase:HBase 是一个分布式的、面向列的开源数据库。HBase 不同于一般的关系数据库, 它是一个适合于非结构化数据存储的数据库。

8)Hive:Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张 数据库表,并提供简单的 SQL 查询功能,可以将 SQL 语句转换为 MapReduce 任务进行运 行。其优点是学习成本低,可以通过类 SQL 语句快速实现简单的 MapReduce 统计,不必开 发专门的 MapReduce 应用,十分适合数据仓库的统计分析。

9)ZooKeeper:它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、 名字服务、分布式同步、组服务等。

1.7 推荐系统框架图

image-20220125224409106

2. Hadoop 运行环境搭建(开发重点)

2.1 模板虚拟机环境准备

本课程虚拟机统一采用CentOS7。

2.1.1 本地模式、伪分布式模式

名称 ip地址 安装的软件
VM-8-5-centos 10.0.8.5 jdk hadoop-3.1.3

2.1.2 完全分布式模式

名称 ip地址 安装的软件
hadoop102 192.168.9.102
hadoop103 192.168.9.103
hadoop104 192.168.9.104

3. Hadoop 运行模式

1)Hadoop 官方网站:http://hadoop.apache.org/

2)Hadoop 运行模式包括:本地模式、伪分布式模式以及完全分布式模式。

  • 本地模式:单机运行,只是用来演示一下官方案例。生产环境不用。
  • 伪分布式模式:也是单机运行,但是具备 Hadoop 集群的所有功能,一台服务器模拟一个分布式的环境。个别缺钱的公司用来测试,生产环境不用。
  • 完全分布式模式:多台服务器组成分布式环境。生产环境使用。

前置:配置hadoop环境变量

vi /etc/profile

1
2
3
4
5
6
7
8
9
export JAVA_HOME=/opt/software/jdk1.8.0_141
export JRE_HOME=${JAVA_HOME}/jre
export PATH=${JAVA_HOME}/bin:$PATH
export MAVEN_HOME=/opt/softWare/maven/maven3.8
export PATH=${MAVEN_HOME}/bin:$PATH
# hadoop追加配置:
export HADOOP_HOME=/opt/software/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

执行:source /etc/profile 使得配置生效

3.1 本地运行模式

3.1.1 官方WordCount案例

  1. 创建在**hadoop-3.1.3**文件下面创建一个wcinput文件夹
    

[root@VM-8-5-centos hadoop-3.1.3]# mkdir wcinput

  1. 在wcinput文件下创建一个wc.input文件
    

[root@VM-8-5-centos hadoop-3.1.3]$ cd wcinput

[root@VM-8-5-centos wcinput]$ touch wc.input

  1. 编辑wc.input文件
    

[root@VM-8-5-centos wcinput]$ vi wc.input

在文件中输入如下内容

1
2
3
4
5
6
7
hadoop yarn

hadoop mapreduce

atguigu

atguigu

保存退出::wq

  1. 回到Hadoop目录/opt/software/hadoop-3.1.3
    
  2. 执行程序
    

[root@VM-8-5-centos hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount wcinput wcoutput

image-20220127111248122

  1. 查看结果
    

[root@VM-8-5-centos hadoop-3.1.3]$ cat wcoutput/part-r-00000

image-20220127111504902

3.2 伪分布式运行模式

3.2.1 启动HDFS并运行MapReduce程序

  • 配置集群(/opt/software/hadoop-3.1.3/etc/hadoop下)
  • 启动、测试集群增、删、查
  • 执行WordCount案例
执行步骤

(1)配置集群

  • 配置:hadoop-env.sh

获取Linux系统中获取JDK的安装路径:

echo $JAVA_HOME

/opt/software/jdk1.8.0_141

修改hadoop-env.sh中 JAVA_HOME 路径:

export JAVA_HOME=/opt/software/jdk1.8.0_144

1
2
3
4
5
6
7
8
9
10
11
# 查看原来的配置
sed -n '/JAVA_HOME/p' hadoop-env.sh
# 将原来的注释去掉
sed -i '/export JAVA_HOME/s/#//g' hadoop-env.sh
# 查看修改后配置
sed -n '/export JAVA_HOME/p' hadoop-env.sh
# 配置jdk
sed -i '/export JAVA_HOME=/s#JAVA_HOME=#JAVA_HOME=/opt/software/jdk1.8.0_141#g' hadoop-env.sh

# 查看
sed -n '/export JAVA_HOME/p' hadoop-env.sh

image-20220127114124802

  • 配置:core-site.xml

2.x NameNode的地址 通常为9000 或者8020 这是 2.3x和3.x区别之一

1
2
3
4
5
6
7
8
9
10
11
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://instance-17ydqnbs:9820</value>
</property>

<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/software/hadoop-3.1.3/data/tmp</value>
</property>

image-20220127114256763

  • 配置:hdfs-site.xml
1
2
3
4
5
<!-- 指定HDFS副本的数量 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>

image-20220127115648144

(2)启动集群

  • 格式化NameNode(第一次启动时格式化,以后就不要总格式化)

[root@VM-8-5-centos hadoop-3.1.3]$ bin/hdfs namenode -format

  • 启动NameNode

[atguigu@hadoop1ls01 hadoop-3.1.3]$ sbin/hadoop-daemon.sh start namenode
hadoop3.0以后系统会告警,建议采用:hdfs –daemon start namenode

  • 启动DataNode

[root@VM-8-5-centos hadoop-3.1.3]$ sbin/hadoop-daemon.sh start datanode

hadoop3.0以后系统会告警,建议采用:hdfs –daemon start datanode

(3)查看集群

  • 查看是否启动成功
1
2
3
4
[root@VM-8-5-centos hadoop-3.1.3]$ jps
13586 NameNode
1366 DataNode
13786 Jps

注意:jps是JDK中的命令,不是Linux命令。不安装JDK不能使用jps

  • web端查看HDFS文件系统(2.x中web端口号为50070)

http://192.168.200.138:9870

image-20220127135846021

注意:如果不能查看,看如下帖子处理

http://www.cnblogs.com/zlslch/p/6604189.html

  • 查看产生的Log日志

说明:在企业中遇到Bug时,经常根据日志提示信息去分析问题、解决Bug。

当前目录:/opt/software/hadoop-3.1.3/logs

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@VM-8-5-centos logs]$ ls

hadoop-atguigu-datanode-hadoop.atguigu.com.log

hadoop-atguigu-datanode-hadoop.atguigu.com.out

hadoop-atguigu-namenode-hadoop.atguigu.com.log

hadoop-atguigu-namenode-hadoop.atguigu.com.out

SecurityAuth-root.audit

[root@VM-8-5-centos logs]# cat hadoop-atguigu-datanode-hadoop101.log

(d)思考:为什么不能一直格式化NameNode,格式化NameNode,要注意什么?

1
2
3
4
5
6
7
8
9
[root@VM-8-5-centos hadoop-3.1.3]$ cd data/tmp/dfs/name/current/

[root@VM-8-5-centos current]$ cat VERSION

clusterID=CID-f0330a58-36fa-4a2a-a65f-2688269b5837

[root@VM-8-5-centos hadoop-3.1.3]$ cd data/tmp/dfs/data/current/

clusterID=CID-f0330a58-36fa-4a2a-a65f-2688269b5837

注意:格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据。所以,格式NameNode时,一定要先删除data数据和log日志,然后再格式化NameNode。

(4)操作集群

  • 在HDFS文件系统上创建一个input文件夹

[root@VM-8-5-centos hadoop-3.1.3]$ bin/hdfs dfs -mkdir -p /user/atguigu/input

image-20220127140249799

  • 将之前测试文件内容上传到文件系统上

[root@VM-8-5-centos hadoop-3.1.3]$ bin/hdfs dfs -put wcinput/wc.input /user/atguigu/input/

image-20220127140530606

​ (c)查看上传的文件是否正确

[root@VM-8-5-centos hadoop-3.1.3]$ bin/hdfs dfs -ls /user/atguigu/input/

[root@VM-8-5-centos hadoop-3.1.3]$ bin/hdfs dfs -cat /user/atguigu/ input/wc.input

image-20220127140658699

  • 运行MapReduce程序

[root@VM-8-5-centos hadoop-3.1.3]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /user/atguigu/input/ /user/atguigu/output

  • 查看输出结果

命令行查看:

[root@VM-8-5-centos hadoop-3.1.3]$ bin/hdfs dfs -cat /user/atguigu/output/*

image-20220127140812563

浏览器查看,如图所示

image-20220127140846292

图2-34 查看output文件

  • 将测试文件内容下载到本地

[root@VM-8-5-centos hadoop-3.1.3]$ hdfs dfs -get /user/atguigu/output/part-r-00000 ./wcoutput/

  • 删除输出结果

[root@VM-8-5-centos hadoop-3.1.3]$ hdfs dfs -rm -r /user/atguigu/output

3.2.2启动YARN并运行MapReduce程序

  • 配置集群在YARN上运行MR

  • 启动、测试集群增、删、查

  • 在YARN上执行WordCount案例

执行步骤

(1)配置集群

  • 配置yarn-env.sh (3.x无需该配置直接读取 hadoop-env.sh )

配置一下JAVA_HOME

export JAVA_HOME=/opt/software/jdk1.8.0_144

  • 配置yarn-site.xml
1
2
3
4
5
6
7
8
9
10
11
<!-- Reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>instance-17ydqnbs</value>
</property>

image-20220127141650909

  • 配置:mapred-env.sh

配置一下JAVA_HOME

export JAVA_HOME=/opt/software/jdk1.8.0_144

  • 配置: (对mapred-site.xml.template重新命名为) mapred-site.xml
1
2
3
4
5
6
7
8
[root@VM-8-5-centos hadoop]$ mv mapred-site.xml.template mapred-site.xml
[root@VM-8-5-centos hadoop]$ vi mapred-site.xml

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

image-20220127205605055

(2)启动集群

  • 启动前必须保证NameNode和DataNode已经启动

  • 启动ResourceManager

[root@VM-8-5-centos hadoop-3.1.3]$ sbin/yarn-daemon.sh start resourcemanager

系统会告警,建议采用:yarn –daemon start resourcemanager

  • 启动NodeManager

[root@VM-8-5-centos hadoop-3.1.3]$ sbin/yarn-daemon.sh start nodemanager

系统会告警,建议采用:yarn –daemon start nodemanager

查看运行的java进程

1
2
3
4
5
6531 DataNode
6440 NameNode
7658 ResourceManager
7898 NodeManager
7997 Jps

image-20220127141907613

(3)集群操作

  • YARN的浏览器页面查看,如图2-35所示

http://192.168.200.138:8088/cluster

image-20200906130059471

  • 删除文件系统上的output文件

[root@VM-8-5-centos hadoop-3.1.3]$ bin/hdfs dfs -rm -R /user/atguigu/output

1
2
 [root@localhost hadoop-3.1.3]# bin/hdfs dfs -rm -R /user/atguigu/output
Deleted /user/atguigu/output
  • 执行MapReduce程序
1
[root@VM-8-5-centos hadoop-3.1.3]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /user/atguigu/input  /user/atguigu/output
  • 查看运行结果,如图所示

执行前

image-20200906140652110

执行后

image-20200906143945404

可能出现的异常
  • hadoop yarn web无法访问

hadoop集群正常启动后,hdfs的web可以访问,但是yarn的web页面无法访问,查看yarn的日志,也是正常启动,没有异常日志,后来以为端口的问题,查看端口的时候,发现了不同:

8088对应的local Address是docker本身的ip,和50070对应的是不一样,然后在yarn-site.xml添加配置:

1
2
3
4
5
<!--yarn总管理器的web http通讯地址-->
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>0.0.0.0:8088</value>
</property>

再重新启动就可以访问了;

  • Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster

image-20220127210301257

根据报错提示
找到hadoop安装目录下$HADOOP_HOME/etc/hadoop/mapred-site.xml,增加以下代码

1
2
3
4
5
6
7
8
9
10
11
12
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>

image-20220127210744098

3.2.3配置历史服务器

为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下:

1. 配置mapred-site.xml

[root@VM-8-5-centos hadoop]$ vi mapred-site.xml

在该文件里面增加如下配置。

1
2
3
4
5
6
7
8
9
10
11
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>192.168.16.4:10020</value>
</property>

<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>192.168.16.4:19888</value>
</property>

image-20220127211109122

2. 启动历史服务器

[root@VM-8-5-centos hadoop-3.1.3]$ sbin/mr-jobhistory-daemon.sh start historyserver

系统会告警,建议采用: mapred –daemon start historyserver

3. 查看历史服务器是否启动

[root@VM-8-5-centos hadoop-3.1.3]$ jps

1
2
3
4
5
6
7
[root@localhost hadoop-3.1.3]# jps
6531 DataNode
9939 JobHistoryServer
6440 NameNode
7658 ResourceManager
7898 NodeManager
10014 Jps
4. 查看JobHistory

直接点击上面History或者直接输入网址

http://192.168.200.138:19888/jobhistory

image-20200906145642452

image-20200906145655872

3.2.4配置日志的聚集

日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。

日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。

注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryManager。

开启日志聚集功能具体步骤如下:

1. 配置yarn-site.xml

[root@VM-8-5-centos hadoop]$ vi yarn-site.xml

在该文件里面增加如下配置。

1
2
3
4
5
6
7
8
9
10
11
<!-- 日志聚集功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>

<!-- 日志保留时间设置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
2. 关闭NodeManager 、ResourceManager和HistoryManager
1
2
3
4
5
6
7
8
[root@VM-8-5-centos hadoop-3.1.3]$ sbin/yarn-daemon.sh stop resourcemanager
yarn --daemon stop resourcemanager

[root@VM-8-5-centos hadoop-3.1.3]$ sbin/yarn-daemon.sh stop nodemanager
yarn --daemon stop nodemanager

[root@VM-8-5-centos hadoop-3.1.3]$ sbin/mr-jobhistory-daemon.sh stop historyserver
mapred --daemon stop historyserver
3. 启动NodeManager 、ResourceManager和HistoryManager
1
2
3
4
5
6
7
8
[root@VM-8-5-centos hadoop-3.1.3]$ sbin/yarn-daemon.sh start resourcemanager
yarn --daemon start resourcemanager

[root@VM-8-5-centos hadoop-3.1.3]$ sbin/yarn-daemon.sh start nodemanager
yarn --daemon start nodemanager

[root@VM-8-5-centos hadoop-3.1.3]$ sbin/mr-jobhistory-daemon.sh start historyserver
mapred --daemon start historyserver
4. 删除HDFS上已经存在的输出文件

[root@VM-8-5-centos hadoop-3.1.3]$ bin/hdfs dfs -rm -R /user/atguigu/output

5. 执行WordCount程序

[root@VM-8-5-centos hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /user/atguigu/input /user/atguigu/output

image-20200906151337712

6. 查看日志,如图2-37,2-38,2-39所示

http://hadoop101:19888/jobhistory

image-20220127212102389

image-20220127212019612

3.2.5配置文件说明

Hadoop配置文件分两类:默认配置文件和自定义配置文件,只有用户想修改某一默认配置值时,才需要修改自定义配置文件,更改相应属性值。

  • 默认配置文件:
要获取的默认文件 文件存放在Hadoop的jar包中的位置
[core-default.xml] hadoop-common-3.1.3.jar/ core-default.xml
[hdfs-default.xml] hadoop-hdfs-3.1.3.jar/ hdfs-default.xml
[yarn-default.xml] hadoop-yarn-common-3.1.3.jar/ yarn-default.xml
[mapred-default.xml] hadoop-mapreduce-client-core-3.1.3.jar/ mapred-default.xml
  • 自定义配置文件:

core-site.xmlhdfs-site.xmlyarn-site.xmlmapred-site.xml,四个配置文件存放在$HADOOP_HOME/etc/hadoop这个路径上,用户可以根据项目需求重新进行修改配置。

3.3 完全分布式运行模式(开发重点)

  • 准备 3 台客户机(关闭防火墙、静态 IP、主机名称)
  • 安装 JDK
  • 配置环境变量
  • 安装 Hadoop
  • 配置环境变量
  • 配置集群
  • 单点启动
  • 配置 ssh
  • 群起并测试集群

集群准备

名称 ip地址 安装的软件
hadoop102 192.168.9.102
hadoop103 192.168.9.103
hadoop104 192.168.9.104
rsync 远程同步工具
  • rsync 主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
  • rsync 和 scp 区别:用 rsync 做文件的复制要比 scp 的速度快,rsync 只对差异文件做更 新。scp 是把所有文件都复制过去。
1
2
rsync     -av      $pdir/$fname         $user@$host:$pdir/$fname 
命令 选项参数 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
选项 功能
-a 归档拷贝
-v 显示复制过程
  • 同步 hadoop102 中的/opt/software/hadoop-3.1.3 到 hadoop103
1
rsync -av hadoop-3.1.3/ root@hadoop103:/opt/software/hadoop-3.1.3/

编写集群分发脚本 xsync

  • 需求:循环复制文件到所有节点的相同目录下

  • 期望脚本在任何路径都能使用(脚本放在声明了全局环境变量的路径)

在/usr/local/bin 目录下创建 xsync 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
vim xsync

#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop102 hadoop103 hadoop104
do
echo ==================== $host ====================
#3. 遍历所有目录,挨个发送
for file in $@
do
#4. 判断文件是否存在
if [ -e $file ]
then
#5. 获取父目录
pdir=$(cd -P $(dirname $file); pwd)
#6. 获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
SSH 无密登录配置

免密登录原理

image-20220128083220515

  • 生成公钥和私钥

    • 切换到当前用户的.ssh目录
    • ssh-keygen -t rsa
  • 将公钥拷贝到要免密登录的目标机器上

    • ssh-copy-id hadoop102

    • ssh-copy-id hadoop103

    • ssh-copy-id hadoop104

  • 注意: 还需要在 hadoop103 上采用 root账号配置一下无密登录到 hadoop102、hadoop103、 hadoop104 服务器上。 还需要在 hadoop104 上采用 root账号配置一下无密登录到 hadoop102、hadoop103、 hadoop104 服务器上。(我这里没配置使用其他用户安装hadoop,全局使用root,如果是其他用户还需配置其他用户ssh登录)

.ssh 文件夹下(~/.ssh)的文件功能解释

文件名 功能
known_hosts 记录 ssh 访问过计算机的公钥(public key)
id_rsa 生成的私钥
id_rsa.pub 生成的公钥
authorized_keys 存放授权过的无密登录服务器公钥

3.3.1集群部署规划

注意:

  • NameNode 和 SecondaryNameNode 不要安装在同一台服务器
  • ResourceManager 也很消耗内存,不要和 NameNode、SecondaryNameNode 配置在 同一台机器上。
文件名 hadoop102 hadoop103 hadoop104
HDFS NameNode DataNode DataNode SecondaryNameNode DataNode
YARN NodeManager ResourceManager NodeManager NodeManager

3.3.2配置集群

核心配置文件
  • cd $HADOOP_HOME/etc/hadoop
  • 配置 core-site.xml
  • vi core-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</property><?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定 NameNode 的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:8020</value>
</property>
<!-- 指定 hadoop 数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!-- 配置 HDFS 网页登录使用的静态用户为 atguigu -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>atguigu</value>
</property>
</configuration>

image-20220128085111779

HDFS 配置文件
    1. 配置hdfs-site.xml

[root@hadoop102 hadoop]$ vi hdfs-site.xml

在该文件里面增加如下配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- nn web 端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop102:9870</value>
</property>
<!-- 2nn web 端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
</configuration>

image-20220128085641983

YARN 配置文件
    1. 配置yarn-site.xml

[root@hadoop102 hadoop]$ vi yarn-site.xml

在该文件里面增加如下配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定 MR 走 shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定 ResourceManager 的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
<!-- 环境变量的继承 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration>

image-20220128085744031

MapReduce 配置文件
    1. 配置mapred-site.xml

[root@hadoop102 hadoop]$ vi mapred-site.xml

在该文件里面增加如下配置。

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定 MapReduce 程序运行在 Yarn 上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

image-20220128085829558

分发配置好的配置文件

@hadoop102 hadoop]$ xsync /opt/module/hadoop-3.1.3/etc/hadoop

3.3.3 群起集群

配置 workers

vim /opt/module/hadoop-3.1.3/etc/hadoop/workers

在该文件中增加如下内容

1
2
3
hadoop102
hadoop103
hadoop104
  • 注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。

同步所有节点配置文件

[atguigu@hadoop102 hadoop]$ xsync /opt/software/hadoop-3.1.3/etc

启动集群
  • 如果集群是第一次启动,需要在 hadoop102 节点格式化 NameNode(注意:格式 化 NameNode,会产生新的集群 id,导致 NameNode 和 DataNode 的集群 id 不一致,集群找 不到已往数据。如果集群在运行过程中报错,需要重新格式化 NameNode 的话,一定要先停 止 namenode 和 datanode 进程,并且要删除所有机器的 data 和 logs 目录,然后再进行格式 化。)
    • hdfs namenode -format
  • 启动 HDFS
    • sbin/start-dfs.sh
  • 配置了 ResourceManager 的节点(hadoop103)启动 YARN
    • [root@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh
    • 查看三台机器的jps进程(jpsall是3.2.6中的脚本 提前用一下)

image-20220128095533389

  • Web 端查看 HDFS 的 NameNode

image-20220128095329986

  • Web 端查看 YARN 的 ResourceManager

image-20220128095639238

集群基本测试
  • 上传小文件

[root@hadoop102 ~]$ hadoop fs -mkdir /input

[root@hadoop102 ~]$ hadoop fs -put $HADOOP_HOME/wcinput/word.txt /input

查看 HDFS 文件存储路径

[root@hadoop102 subdir0]$ pwd

/opt/module/hadoop-3.1.3/data/dfs/data/current/BP-1436128598- 192.168.10.102-1610603650062/current/finalized/subdir0/subdir0

查看 HDFS 在磁盘存储文件内容

[root@hadoop102 subdir0]$ cat blk_1073741825

hadoop yarn

hadoop mapreduce

atguigu

atguigu

执行 wordcount 程序

[root@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output

  • 上传大文件

[root@hadoop102 ~]$ hadoop fs -put /opt/software/jdk-8u212- linux-x64.tar.gz /

拼接

image-20220128101006675

[root@hadoop102 subdir0]$ cat blk_1073741836>>tmp.tar.gz

[root@hadoop102 subdir0]$ cat blk_1073741837>>tmp.tar.gz

[root@hadoop102 subdir0]$ tar -zxvf tmp.tar.gz

下载

[root@hadoop104 software]$ hadoop fs -get /jdk-8u212-linuxx64.tar.gz ./

3.2.4 配置历史服务器

  • 为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下
1. 配置mapred-site.xml

[root@hadoop102 hadoop]$ vi mapred-site.xml

在该文件里面增加如下配置。

1
2
3
4
5
6
7
8
9
10
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<!-- 历史服务器 web 端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
</property>
2. 分发配置

[root@hadoop102 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml

3. 在 hadoop102 启动历史服务器

[root@hadoop102 hadoop]$ mapred –daemon start historyserver

4. 查看历史服务器是否启动

[root@hadoop102 hadoop]$ jps

5. 查看 JobHistory

http://hadoop102:19888/jobhistory

3.2.5 配置日志的聚集

  • 日志聚集概念:应用运行完成以后,将程序运行日志信息上传到 HDFS 系统上。

image-20220128094831874

日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。

  • 注意:开启日志聚集功能,需要重新启动 NodeManager 、ResourceManager 和 HistoryServer。
1. 配置 yarn-site.xml

[root@hadoop102 hadoop]$ vim yarn-site.xml

在该文件里面增加如下配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop102:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为 7 天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
2. 分发配置

[root@hadoop102 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml

3. 关闭 NodeManager 、ResourceManager 和 HistoryServer

[root@hadoop103 hadoop-3.1.3]$ sbin/stop-yarn.sh

[root@hadoop102 hadoop-3.1.3]$ mapred –daemon stop historyserver

4. 启动 NodeManager 、ResourceManage 和 HistoryServer

[root@hadoop103 ~]$ sbin/start-yarn.sh

[root@hadoop102 ~]$ mapred –daemon start historyserver

5. 删除 HDFS 上已经存在的输出文件

[root@hadoop102 ~]$ hadoop fs -rm -r /output

6 执行 WordCount 程序

[root@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output

  • (1)历史服务器地址

http://hadoop102:19888/jobhistory

  • (2)历史任务列表

image-20220128102006108

  • (3)查看任务运行日志

image-20220128102048401

  • (4)运行日志详情

image-20220128102059302

3.2.6 集群启动/停止方式总结

  • 各个模块分开启动/停止(配置 ssh 是前提)常用
    • 整体启动/停止 HDFS start-dfs.sh/stop-dfs.sh
    • 整体启动/停止 YARN start-yarn.sh/stop-yarn.sh
  • 各个服务组件逐一启动/停止
    • 分别启动/停止 HDFS 组件 hdfs –daemon start/stop namenode/datanode/secondarynamenode
    • 启动/停止 YARN yarn –daemon start/stop resourcemanager/nodemanager
可能出现的异常
  • 整体启动/停止 YARN时 start-yarn.sh/stop-yarn.sh

image-20220128103409596

ERROR: Attempting to operate on yarn resourcemanager as root
ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Aborting operation.
出现以上报错信息需要到 sbin 目录下 更改 start-yarn.sh 和 stop-yarn.sh 信息,在两个配置文件的第一行添加:

1
2
3
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

image-20220128103540542

最后再 输入命令 /sbin/start-yarn.sh 启动 yarn即可

3.2.7 编写 Hadoop 集群常用脚本

Hadoop 集群启停脚本
  • (包含 HDFS,Yarn,Historyserver):myhadoop.sh

[root@hadoop102 ~]$ cd /usr/local/bin

[root@hadoop102 bin]$ vim myhadoop.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " =================== 启动 hadoop 集群 ==================="
echo " --------------- 启动 hdfs ---------------"
ssh hadoop102 "/opt/software/hadoop-3.1.3/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh hadoop103 "/opt/software/hadoop-3.1.3/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh hadoop102 "/opt/software/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop 集群 ==================="
echo " --------------- 关闭 historyserver ---------------"
ssh hadoop102 "/opt/software/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh hadoop103 "/opt/software/hadoop-3.1.3/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh hadoop102 "/opt/software/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac

  • 保存后退出,然后赋予脚本执行权限

chmod +x myhadoop.sh

查看三台服务器 Java 进程脚本:jpsall

[root@hadoop102 ~]$ cd /usr/local/bin

[root@hadoop102 bin]$ vim jpsall

1
2
3
4
5
6
7
#!/bin/bash

for host in hadoop102 hadoop103 hadoop104
do
echo =============== $host ===============
ssh $host jps
done
  • 保存后退出,然后赋予脚本执行权限

chmod +x jpsall

分发 /usr/local/bin 目录,
  • 保证自定义脚本在三台机器上都可以使用

[root@hadoop102 ~]$ xsync /usr/local/bin

3.2.8 常用端口号说明

端口名称 Hadoop2.x Hadoop3.x
HNameNode 内部通信端口 8020 / 9000 8020 / 9000/9820
NameNode HTTP UI 50070 9870
MapReduce查看执行任务端口 8088 8088
历史服务器通信端口 19888 19888

集群时间同步

  • 如果服务器在公网环境(能连接外网),可以不采用集群时间同步,因为服务器会定期 和公网时间进行校准;
  • 如果服务器在内网环境,必须要配置集群时间同步,否则时间久了,会产生时间偏差, 导致集群执行任务时间不同步。

找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,生产环境 根据任务对时间的准确程度要求周期同步。测试环境为了尽快看到效果,采用 1 分钟同步一 次。

image-20220128104607969

时间服务器配置

查看所有节点 ntpd 服务状态和开机自启动状态

[root@hadoop102 ~]$ sudo yum -y install ntp

[root@hadoop102 ~]$ sudo systemctl status ntpd

[root@hadoop102 ~]$ sudo systemctl start ntpd

[root@hadoop102 ~]$ sudo systemctl is-enabled ntpd

修改 hadoop102 的 ntp.conf 配置文件

sudo vim /etc/ntp.conf

  • 修改 1(授权 192.168.10.0-192.168.10.255 网段上的所有机器可以从这台机器上查 询和同步时间)

#restrict 192.168.9.0 mask 255.255.255.0 nomodify notrap

修改为

restrict 192.168.9.0 mask 255.255.255.0 nomodify notrap

  • 修改 2(集群在局域网中,不使用其他互联网上的时间)

server 0.centos.pool.ntp.org iburst

server 1.centos.pool.ntp.org iburst

server 2.centos.pool.ntp.org iburst

server 3.centos.pool.ntp.org iburst

修改为

#server 0.centos.pool.ntp.org iburst

#server 1.centos.pool.ntp.org iburst

#server 2.centos.pool.ntp.org iburst

#server 3.centos.pool.ntp.org iburst

  • 添加 3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中 的其他节点提供时间同步)

server 127.127.1.0

fudge 127.127.1.0 stratum 10

image-20220128110424279

  • 修改 hadoop102 的/etc/sysconfig/ntpd 文件

[root@hadoop102 ~]$ sudo vim /etc/sysconfig/ntpd

增加内容如下(让硬件时间与系统时间一起同步)

SYNC_HWCLOCK=yes

  • 重新启动 ntpd 服务

[root@hadoop102 ~]$ sudo systemctl start ntpd

  • 设置 ntpd 服务开机启动

[root@hadoop102 ~]$ sudo systemctl enable ntpd

其他机器配置(必须 root 用户)
  • 关闭所有节点上 ntp 服务和自启动

[root@hadoop103 ~]$ sudo systemctl stop ntpd

[root@hadoop103 ~]$ sudo systemctl disable ntpd

[root@hadoop104 ~]$ sudo systemctl stop ntpd

[root@hadoop104 ~]$ sudo systemctl disable ntpd

  • 在其他机器配置 1 分钟与时间服务器同步一次

[root@hadoop103 ~]$ sudo crontab -e

  • 编写定时任务如下:

*/1 * * * * /usr/sbin/ntpdate hadoop102

  • 修改任意机器时间

[root@hadoop103 ~]$ sudo date -s “2021-9-11 11:11:11”

  • 1 分钟后查看机器是否与时间服务器同步

[root@hadoop103 ~]$ sudo date