1、环境说明
- 基于Apache Hadoop 3.1.3 版本
- 依赖JDK环境
- Hadoop3.1.3下载地址
2、Hadoop架构
- 狭义上的hadoop主要包括三大组件
分布式存储HDFS
、分布式计算MapReduce
、分布式资源管理和调度YARN
2.1 HDFS架构
-
主要负责数据的存储
-
NameNode
: 管理命名空间、存储数据块映射信息(元数据)、 负责处理客户端对HDFS的访问. -
SecondaryNameNode
: NameNode 的热备, 会定期合并命名空间镜像 fsimage和命名空间镜像的编辑日志fsedits, 在主NameNode发生故障时, 可以 快速切换为新的 Active NameNode -
DataNode
: 负责实际文件数据的存储、文件会被拆分成多个块, 以多副本方式存储在不同的DataNode
2.2 Yarn 架构
- 主要负责作业的调度 和 资源的管理
ResourceManager(RM)
:- 处理提交的作业请求, 资源申请请求.
- 监控NodeManager的状态
- 启动和监控ApplicationMaster
NodeManager(NM)
:- 管理每个节点上运行的资源
- 定时向 RM 汇报本节点上的资源使用情况和各个 Container 的运行状态
- 处理来自AM 对 各个Container 启动/停止等请求
Container
:- 即是任务运行的容器又是Yarn对资源的抽象, 封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等. RM 为 AM 返回的资源便是用 Container 表示的。 YARN 会为每个任务分配一个 Container 且该任务只能使用该 Container 中描述的资源
ApplicationMaster(AM)
:- 每个作业会在NM中启动一个AM, 然后由AM去负责发送MapTask、ReduceTask任务的启动请求给NM, 以及向RM申请任务执行所需要的资源
- 与RM交互去申请资源Container(比如作业执行的资源, 任务执行的资源)
- 负责启动、停止任务, 并且监控所有任务的运行状态,当任务Task有失败时,重新为任务申请资源并重启任务
3、集群规划
如无特别说明,每台服务器要保持一样的配置
Hadoop300 | Hadoop301 | Hadoop302 | |
---|---|---|---|
NameNode | V | ||
DataNode | V | V | V |
SecondaryNameNode | V | ||
ResourceManger | V | ||
NodeManger | V | V | V |
4、下载解压
4.1 安装包放置
- 将下载的
hadoop3.1.3
解压并创建快捷方式到~/app
目录下, hadoop301,hadoop302同理
[hadoop@hadoop300 app]$ pwd
/home/hadoop/app
[hadoop@hadoop300 app]$ ll
lrwxrwxrwx 1 hadoop hadoop 47 2月 21 12:33 hadoop -> /home/hadoop/app/manager/hadoop_mg/hadoop-3.1.3
4.2 配置Hadoop环境变量
vim ~/.bash_profile
# ============ java =========================
export JAVA_HOME=/home/hadoop/app/jdk
export PATH=$PATH:$JAVA_HOME/bin
# ======================= Hadoop ============================
export HADOOP_HOME=/home/hadoop/app/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
5、hadoop配置
5.1 env文件
- 修改
${HADOOP_HOME}/etc/hadoop下
的hadoop-env.sh, mapred-env.sh、yarn-env.sh这三个文件都添加JDK的环境变量
export JAVA_HOME=/home/hadoop/app/jdk
5.2 core-site.xml
- 修改
${HADOOP_HOME}/etc/hadoop/core-site.xml
文件 - 关于代理用户的配置见官网 Proxy User
<!-- 指定HDFS中NameNode的地址, -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop300:8020</value>
</property>
<!-- 指定Hdfs的NameNode、DataNode数据存储路径, 默认在/tmp/hadoop-${user.name}下 -->
<!--
<property>
<name>hadoop.tmp.dir</name>
<value>/tmp/hadoop-${user.name}</value>
</property>
-->
<!-- 配置HDFS管理页面登陆的静态用户为 hadoop -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>hadoop</value>
</property>
<!-- 配置该hadoop用户允许通过代理访问的主机节点-->
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
<!-- 配置该hadoop用户允许代理的用户所属组-->
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
<!-- 配置该hadoop用户允许代理的用户, *代表所有-->
<property>
<name>hadoop.proxyuser.hadoop.users</name>
<value>*</value>
</property>
5.3 hdfs-site.xml 文件 (hdfs配置)
- 配置HDFS相关属性
<!-- 指定HDFS副本的数量-->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- SecondaryNameNode启动地址 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop302:9868</value>
</property>
5.4 yarn-site.xml (yarn配置)
- 配置yarn相关属性
<!-- Reducer获取数据的方式, 使用shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的主机地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop301</value>
</property>
<!-- 容器向RM的内存申请请求允许的最小值, 即最小分配为该内存大小-->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>200</value>
</property>
<!-- 容器向RM的内存申请请求允许的最大值, 超出将会抛出 InvalidResourceRequestException异常-->
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>2048</value>
</property>
<!-- 设置Yarn可使用的内存大小, 即可分配给容器的物理内存量(以MB为单位)。如果设置为-1并且yarn.nodemanager.resource.detect-hardware-capabilities为true,则会自动计算(在Windows和Linux中)。在其他情况下,默认值为8192MB。-->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
</property>
<!-- 关闭Yarn对物理内存和虚拟内存的限制检查
因为内存计算方式不一样, 可能会误认为内存不够然后把作业kill掉
-->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<!-- 配置任务历史服务地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop300:19888/jobhistory/logs/</value>
</property>
<!-- 开启日志聚集功能使能
日志聚集就是应用运行完成以后,将容器本地运行的日志信息收集上传到HDFS系统上。方便查看
-->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间设置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
5.5 mapred-site.xml (MapReduce配置)
- 配置MapReduce相关设置
<!-- 指定MR运行在YARN上, 默认运行在local本地 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 指定jobhistory地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop300:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop300:19888</value>
</property>
<!-- 指定hadoop环境变量 -->
<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>
5.6 workers 文件配置
- 修改
${HADOOP_HOME}/etc/hadoop/workers
文件, 设置Hadoop集群节点列表tip: 注意不要出现空行和空格
hadoop300
hadoop301
hadoop302
6、启动测试
6.1 格式化NameNode
- 在hadoop300执行
[hadoop@hadoop300 app]$ hdfs namenode -format
6.2 启动Hdfs
- 在hadoop300启动
[hadoop@hadoop300 ~]$ start-dfs.sh
Starting namenodes on [hadoop300]
Starting datanodes
Starting secondary namenodes [hadoop302]
6.3 启动Yarn
- 在hadoop301启动
[hadoop@hadoop301 ~]$ start-yarn.sh
Starting resourcemanager
Starting nodemanagers
6.4 启动JobHistory
[hadoop@hadoop300 hadoop]$ mapred --daemon start historyserver
6.5 效果
- 启动成功后jps查看进程
- 这时hdfs的nn、dn、sn都启动起来了,
- 而yarn的RM、NM也启动起来了
- mr的JobHistory也启动起来了
[hadoop@hadoop300 hadoop]$ xcall jps
--------- hadoop300 ----------
16276 JobHistoryServer
30597 DataNode
19641 Jps
30378 NameNode
3242 NodeManager
--------- hadoop301 ----------
24596 DataNode
19976 Jps
27133 ResourceManager
27343 NodeManager
--------- hadoop302 ----------
24786 SecondaryNameNode
27160 NodeManager
24554 DataNode
19676 Jps
访问HDFS的NameNode界面 在hadoop300:9870
访问HDFS的SecondaryNameNode界面 在hadoop300:9868
访问Yarn管理界面: 在hadoop301:8088
访问JobHistory的界面, 在hadoop300:19888
7、hadoop集群统一启动脚本
vim hadoop.sh
#!/bin/bash
case $1 in
"start"){
echo ---------- Hadoop 集群启动 ------------
echo "启动Hdfs"
ssh hadoop300 "source ~/.bash_profile;start-dfs.sh"
echo "启动Yarn"
ssh hadoop300 "source ~/.bash_profile;mapred --daemon start historyserver"
echo "启动JobHistory"
ssh hadoop301 "source ~/.bash_profile;start-yarn.sh"
};;
"stop"){
echo ---------- Hadoop 集群停止 ------------
echo "关闭Hdfs"
ssh hadoop300 "source ~/.bash_profile;stop-dfs.sh"
echo "关闭Yarn"
ssh hadoop300 "source ~/.bash_profile;mapred --daemon stop historyserver"
echo "关闭JobHistory"
ssh hadoop301 "source ~/.bash_profile;stop-yarn.sh"
};;
esac