- 1、Hadoop入门
- 2、搭建Hadoop集群
- 3、HDFS
- 4、MapReduce
- 5、Yarn
- 6、生产调优
1、Hadoop入门
1.1 Hadoop优势
-
高可靠性
Hadoop底层维护多个数据副本,即使Hadoop某个计算元素或存储出现故障,也不会导致数据丢失
-
高扩展性
在集群间分配任务数据,可方便的扩展数以千计的节点
-
高效性
在MapReduce的思想下,Hadoop是并行工作的,以加快任务处理速度
-
高容错性
能够自动将失败的任务重新分配
1.2 Hadoop1.x、Hadoop2.x、Hadoop3.x的区别
- 在Hadoop1.x时代,Hadoop中的MapReduce同时处理业务逻辑运算和资源的调度,耦合性较大
- 在Hadoop2.x时代,增加了Yarn。此时Yarn只负责资源的调度,MapReduce只负责运算
- 在Hadoop3.x时代,其组成与Hadoop2.x没有变化,功能上进行了优化
1.3 HDFS架构概述
Hadoop Distributed File System,简称HDFS,是一个分布式文件系统
- 角色
-
NameNode(简称 nn)
存储文件的元数据:如文件名,文件目录结构,文件属性(生成时间、副本数、文件权限),以及每个文件 的块列表和块所在的DataNode等
-
DataNode(简称 dn)
在本地文件系统存储文件块数据,以及块数据的校验和
-
Secondary NameNode(简称 2nn)
每隔一段时间对NameNode元数据备份
-
1.4 YARN架构概述
Yet Another Resource Negotiator,简称YARN,是一种资源协调者,是Hadoop的资源管理器
- 角色
- ResourceManager(RM):整个集群资源(内存、CPU等)的调度者
- NodeManager(NM):单个节点服务器资源的调度者
- ApplicationMaster(AM):单个任务运行的调度者
- Container:容器,里面封装了任务运行所需要的资源(内存、CPU、磁盘、网络等)
- 说明
- 客户端可以有多个
- 集群上可以运行多个ApplicationMaster
- 每个NodeManager上可以有多个Container
1.5 MapReduce架构概述
MapReduce将计算过程分为两个阶段:Map和Reduce
- Map阶段并行处理输入数据
- Reduce阶段对Map结果进行汇总
1.6 HDFS、YARN、MapReduce三者关系
- 客户端发送任务请求
- YARN接受到请求,开启一个Container1(包含一个ApplicationMaster1),该Container1向YARN请求资源
- Container1获取到资源后,开始MapReduce中的Map阶段,开启一个Container(包含一个ApplicationMaster2,即MapTask)
- 在Map阶段,ApplicationMaster2与HDFS进行交互
- HDFS按NameNode的元数据信息检索,将DataNode中存储的数据返回给ApplicationMaster2
- Container1收到MapTask完成的信息后,开启一个Container(包含一个ApplicationMaster3,即ReduceTask),ApplicationMaster3汇总ApplicationMaster2返回的数据
- ApplicationMaster3汇总完数据后,通知HDFS完成数据的存储
- 任务结束,释放资源
1.7 大数据技术生态体系
1.8 环境准备
-
在虚拟机中搭建环境
推荐是Vmware WrokStation Pro 16版本,兼容了虚拟化,能够和wsl2一起使用
-
配置java和hadoop环境
-
编写shell分发脚本
-
ssh免密登录
1.9 Hadoop运行模式
-
本地模式
单机运行,只是用来演示一下官方案例
-
伪分布式模式
单机运行,但是具备了Hadoop集群的所有功能,一台服务器模拟一个分布式的环境
-
完全分布式模式
多台服务器组成分布式环境
1.10 Hadoop本地模式运行:官方WordCount案例
-
创建wcinput文件夹
mkdir -p ~/learnstation/wcinput
-
在wcinput文件夹下创建一个word.txt文件并输入以下内容
vim word.txt hadoop yarn hadoop mapreduce test test
-
执行程序
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount ~/learnstation/wcinput ~/learnstation/wcoutput
-
查看结果
cat ~/learnstation/wcoutput/part-r-00000
2、搭建Hadoop集群
2.1 集群部署规划
pc001(192.168.117.101) | pc002(192.168.117.102) | pc003((192.168.117.101)) | |
---|---|---|---|
HDFS | NameNode DataNode |
DataNode |
SecondaryNameNode DataNode |
YARN | NodeManager |
ResoureManager NodeManager |
NodeManager |
-
注意点
- NameNode和SecondaryNameNode很消耗内存,不要安装在同一台服务器
- ResourceManager很消耗内存,不要和NameNode、SecondaryNameNode配置在同一台机器上
2.2 配置文件说明
Hadoop配置文件分为两类:默认配置文件和自定义配置文件。
-
默认配置文件
默认文件 文件存放在Hadoop的jar包中的位置 [core-default.xml] $HADOOP_HOME/share/hadoop/common/hadoop-common-xxx.jar [hdfs-default.xml] $HADOOP_HOME/share/hadoop/hdfs/hadoop-hdfs-xxx.jar [yarn-default.xml] $HADOOP_HOME/share/hadoop/yarn/hadoop-yarn-common-xxx.jar [mapred-default-xml] $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-xxx.jar -
自定义配置文件
core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml
四个配置文件存放在$HADOOP_HOME/etc/hadoop
路径下,用户想修改某一默认配置值时,可以修改自定义配置文件,更改相应属性值。
2.3 配置自定义文件
2.3.1 配置核心文件
-
配置core-sit.xml
cd $HADOOP_HOME/etc/hadoop vim core-site.xml
-
在标签configuration中添加以下内容
<configuration> <!-- 指定NameNode的地址 HDFS内部的通信地址--> <property> <name>fs.defaultFS</name> <value>hdfs://pc001:8082</value> </property> <!-- 指定Hadoop本地数据的存储地址--> <property> <name>hadoop.tmp.dir</name> <value>/opt/software/hadoop-3.1.3/data</value> </property> <!-- 配置HDFS网页登录使用的静态用户 --> <property> <name>hadoop.http.staticuser.user</name> <value>nuochengze</value> </property> </configuration>
-
分发给其他服务器
~/bin/xsync.sh core-site.xml
2.3.2 配置HDFS文件
-
配置hdfs-site.xml文件
cd $HADOOP_HOME/etc/hadoop vim hdfs-site.xml
-
在标签configuration中添加以下内容
<configuration> <!-- NameNode nn web端访问地址--> <property> <name>dfs.namenode.http-address</name> <value>pc001:9870</value> </property> <!-- SecondaryNameNode 2nn web端访问地址 --> <property> <name>dfs.namenode.secondary.http-address</name> <value>pc003:9868</value> </property> </configuration>
-
分发给其他服务器
2.3.3 配置YARN文件
-
配置yarn-site.xml文件
cd $HADOOP_HOME/etc/hadoop vim yarn-site.xml
-
在标签configuration中添加以下内容
<configuration> <!-- Site specific YARN configuration properties --> <!-- 指定MR走 shuffle--> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定 ResourceManager 的地址--> <property> <name>yarn.resourcemanager.hostname</name> <value>pc002</value> </property> <!-- 环境变量的继承--> <property> <name>yarn.nodenamager.env-whitelist</name> <value>JAVA_HOEM,HADOOP_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value> </property> </configuration>
-
分发给其他服务器
2.3.4 配置MapReduce文件
-
配置mapred-site.xml文件
cd $HADOOP_HOME/etc/hadoop vim mapred-site.xml
-
在标签configuration中添加以下内容
<configuration> <!-- 指定MapReduce 程序运行在Yarn上--> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
-
分发给其他服务器
2.4 群起集群
2.4.1 配置workers
-
编辑workers文件
cd $HADOOP_HOME/etc/hadoop vim workers
-
修改内容为如下
pc001 pc002 pc003
说明:workers文件中,添加的内容结尾不允许有空格,文件中不允许有空行
-
分发给其他服务器
2.4.2 启动集群
注意!!! 在root用户下启动集群时,会报”ERROR: Attempting to operate on hdfs namenode as root“
需要用非root用户启动
useradd nuochengze // 添加用户nuochengze
passwd nuochengze // 修改密码
配置 nuochengze 用户具有 root 权限,方便后期加 sudo 执行 root 权限的命令
1、vim /etc/sudoers
2、vim /etc/sudoers
...
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
nuochengze ALL=(ALL) NOPASSWD:ALL
...
3、注意:nuochengze 这一行不要直接放到 root 行下面,因为所有用户都属于 wheel 组,你先
配置了 nuochengze 具有免密功能,但是程序执行到%wheel 行时,该功能又被覆盖回需要
密码。所以 nuochengze 要放到%wheel 这行下面
-
格式化namenode
hdfs namenode -format
说明:
- 如果集群第一次启动,需要在pc001节点格式化NameNode
- 格式化NameNode,会产生新的集群ID,导致NameNode和DataNode的集群ID不一致,集群找不到以往数据
- 如果集群在运行过程中报错,需要重新格式化NameNode的话,一定要先停止namenode和datanode进程,并且要删除所有机器的data和logs目录,然后再进行格式化
-
在pc001上启动HDFS
./sbin/start-dfs.sh
-
查看启动的active internet connections
netstat -nltp
-
在pc002(布置了ResoureceManager的节点)上启动yarn
./sbin/start-yarn.sh
-
web端查看HDFS的NameNode
浏览器中输入:http://pc001:9870
-
web端查看YARN的ResourceManager
浏览器中输入:http://pc002:8088
2.4.3 配置历史服务器
-
作用
查看程序的历史运行情况
-
配置mapred-site.xml,添加以下内容
<!-- 历史服务器地址--> <property> <name>mapreduce.jobhistory.address</name> <value>pc001:10020</value> </property> <!-- 历史服务器web端地址--> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>pc001:19888</value> </property>
-
在pc001上面启动历史服务器
mapred --daemon start historyserver
-
查看JobHistory
http://pc001:19888
2.4.4 配置日志的聚集
-
作用
应用运行完成后,将程序运行日志信息上传到HDFS系统上,方便开发调试
-
配置yarn-site.xml,添加以下内容
<!-- 开启日志聚集功能--> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <!-- 设置日志聚集服务器地址--> <property> <name>yarn.log.server.url</name> <value>http://pc001:19888/jobhistory/logs</value> </property> <!-- 设置日志保留时间为7天--> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> </property>
-
在pc001上面启动历史服务器
mapred --daemon start historyserver
-
查看日志
http://pc001:19888/jobhistory/logs
2.4.5 集群启动/停止方式
-
各个模块分开启动/停止
start-dfs.sh/stop-dfs.sh #HDFS的整体启停 start-yarn.sh/stop-yarn.sh #yarn的整体启停
-
单个服务组件逐一启动/停止
-
HDFS组件
hdfs --daemon start/stop namenode/datanode/secondarynamenode
-
YARN组件
yarn --daemon start/stop resourcemanager/nodemanager
-
2.4.6 常用脚本
-
启动集群
# xhadoopop.sh #! /bin/bash if [ $# -lt 1 ] then echo "Tips:请输入参数" exit fi case $1 in "start") echo "=================启动集群========================" echo "-----------------启动历史服务器-----------" ssh pc001 "mapred --daemon start historyserver" echo "-----------------启动HDFS-----------------" ssh pc001 "$HADOOP_HOME/sbin/start-dfs.sh" echo "-----------------启动YARN-----------------" ssh pc002 "$HADOOP_HOME/sbin/start-yarn.sh" ;; "stop") echo "=================关闭集群========================" echo "-----------------关闭HDFS-----------------" ssh pc001 "$HADOOP_HOME/sbin/stop-dfs.sh" echo "-----------------关闭YARN-----------------" ssh pc002 "$HADOOP_HOME/sbin/stop-yarn.sh" echo "-----------------关闭历史服务器-----------" ssh pc001 "mapred --daemon stop historyserver" ;; *) echo "Error:请输入正确的参数" echo "参数 start: 启动集群" echo "参数 stop : 关闭集群" ;; esac
-
文件分发
# xsync.sh #! /bin/bash # 1.判断参数个数 if [ $# -lt 1 ] then echo 'Not Enougth Arugement!' exit; fi # 2.遍历集群所有机器 for host in pc001 pc002 pc003 do echo "==================$host=====================" # 3.遍历指定的目录 for file in $@ do # 4.判断指定文件是否存在 if [ -e $file ] then # 4.1 获取父目录 pdir=$(cd -P $(dirname $file);pwd) # 4.2 获取文件名称 fname=$(basename $file) # 4.3 对目标host创建对应的目录 ssh $host "mkdir -p $pdir" # rsync同步文件 rsync -av $pdir/$fname $host:$pdir/$fname else echo "The file $file is not exists!" fi done done
-
jps集群监控
# xjpsall.sh #! /bin/bash for host in pc001 pc002 pc003 do echo "============$host==============" ssh $host "jps" done
2.5 配置文件整体一览
2.5.1 core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy o