YARN与MapReduce部署与管理
计算、分布式计算:
- 计算:对数据进行处理,使用统计分析等手段得到结果
- 分布式计算:将计算任务分发到多台机器上并行处理,共同完成一个任务,提高计算效率
分布式计算常见的两种工作模式:
- 分散 ---> 汇总 (MapReduce就是这种模式)
- 中心调度 ---> 步骤执行 (大数据体系的Spark、Flink等)
分布式计算框架-MapReduce
MapReduce是Google提出的一种分布式计算框架,用于处理大数据,其核心思想是“分而治之”,将大任务拆分成多个小任务,并行处理,最后汇总结果。
MapReduce框架包含两个核心组件:Map和Reduce。
- Map:将输入数据拆分成多个小任务,每个小任务处理一部分数据,并将结果输出到本地磁盘。
- Reduce:将Map阶段输出的结果进行汇总,得到最终结果。
MapReduce框架具有以下特点:
- 易于编程:用户只需要实现Map和Reduce两个函数,即可完成分布式计算任务。
- 可扩展性:MapReduce框架可以动态地增加或减少计算节点,以适应不同的计算需求。
- 高容错性:MapReduce框架具有自动容错机制,当某个计算节点出现故障时,可以自动将该节点上的任务重新分配到其他节点上,保证计算任务的顺利完成。
YARN & MapReduce
MapReduce 是基于YARN运行的,即没有YARN"无法"运行MapReduce程序。YARN是Hadoop 2.x版本引入的资源管理系统,用于管理集群中的资源,并负责调度和分配任务。
YARN的资源调度器有两种:FIFO和Capacity Scheduler。FIFO是默认的资源调度器,它按照任务的提交顺序来分配资源,先提交的任务先执行。Capacity Scheduler是可插拔的资源调度器,它可以根据用户的配置来分配资源,支持多队列和多用户。
YARN核心架构:
- ResourceManager:负责整个集群的资源管理和调度,包括资源分配、任务调度等。
- NodeManager:负责单个节点的资源管理和任务执行,包括资源监控、任务启动和停止等。
- ApplicationMaster:负责单个应用程序的管理,包括任务调度、资源申请和释放等。
- Container:是YARN中资源的基本单位,每个Container包含一定的CPU和内存资源。
YARN还可以搭配2个辅助角色使得YARN集群运行更加稳定:
- 代理服务器(ProxyServer):Web Application Proxy Web应用程序代理
- 历史服务器(JobHistoryServer): 应用程序历史信息记录服务
YARN Resource 资源配置
1. 全局资源配置
yarn.nodemanager.resource.memory-mb
描述: 设置每个NodeManager节点上YARN可以使用的总物理内存大小(单位:MB)。
示例: yarn.nodemanager.resource.memory-mb=8192 表示NodeManager可以使用的内存为8GB。
yarn.nodemanager.resource.cpu-vcores
描述: 指定每个NodeManager节点上YARN可使用的虚拟CPU核数。
示例: yarn.nodemanager.resource.cpu-vcores=8 表示NodeManager可以使用的CPU核数为8。
2. 资源分配范围
yarn.scheduler.minimum-allocation-mb
描述: 单个容器可申请的最小内存大小(单位:MB)。
示例: yarn.scheduler.minimum-allocation-mb=512 表示容器最小内存为512MB。
yarn.scheduler.maximum-allocation-mb
描述: 单个容器可申请的最大内存大小(单位:MB)。
示例: yarn.scheduler.maximum-allocation-mb=10240 表示容器最大内存为10GB。
yarn.scheduler.minimum-allocation-vcores
描述: 单个容器可申请的最小CPU核数。
示例: yarn.scheduler.minimum-allocation-vcores=1 表示容器最小CPU核数为1。
yarn.scheduler.maximum-allocation-vcores
描述: 单个容器可申请的最大CPU核数。
示例: yarn.scheduler.maximum-allocation-vcores=8 表示容器最大CPU核数为8。
3. 内存与CPU比率配置
yarn.nodemanager.vmem-pmem-ratio
描述: 任务每使用1MB物理内存,最多可使用多少虚拟内存。用于防止内存溢出。
示例: yarn.nodemanager.vmem-pmem-ratio=2.1 表示每使用1MB物理内存,可使用2.1MB虚拟内存。
4. 资源检查配置
yarn.nodemanager.pmem-check-enabled, yarn.nodemanager.vmem-check-enabled
描述: 控制是否启用检查任务超出分配的物理内存或虚拟内存的线程。
示例: 设置为true表示开启检查,超出资源限制的任务将被终止。
5. 自定义资源类型(可选)
YARN支持扩展资源类型,允许用户定义除内存和CPU之外的其他资源,如GPU、网络带宽等。
yarn.resource-types
描述: 配置文件中定义自定义资源类型。
yarn.scheduler.capacity.root..minimum-user-limit-percent
描述: 在Capacity Scheduler中,每个队列可以设置用户最低资源占有率百分比,以保证公平性。
注意事项
确保配置的资源总量不超过节点实际可用资源,否则可能导致资源分配失败或系统不稳定。
配置时应考虑集群的整体负载情况,合理分配资源,避免资源浪费或过度竞争。
调整资源配置后,需要重启YARN相关服务才能生效。
stop-yarn.sh
start-yarn.sh
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>32768</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>32768</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>16</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>16</value>
</property>
MapReduce 配置
MapReduce 配置文件位于 $HADOOP_HOME/etc/hadoop 目录下:mapred-site.xml、mapred-env.sh
# 添加环境变量
vim /usr/local/hadoop/etc/hadoop/mapred-env.sh
# 设置JDK路径
export JAVA_HOME=/usr/java/jdk1.8.0_361-amd64
# 设置JobHistoryServer进程内存为1GB
export HADOOP_JOB_HISTORYSERVER_HEAPSIZE=1024
# 设置日志级别为INFO
export HADOOP_MAPRED_LOG_LEVEL=INFO,RFA
# 配置mapred-site.xml
vim /usr/local/hadoop/etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<description>MapReduce的运行框架设置为YARN</description>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>Vimller-AnolisOS:10020</value>
<description>历史服务器通讯端口</description>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>Vimller-AnolisOS:19888</value>
<description>历史服务器Web UI端口</description>
</property>
<property>
<name>mapreduce.jobhistory.admin.address</name>
<value>Vimller-AnolisOS:10033</value>
<description>历史服务器管理端口</description>
</property>
<!-- 历史信息在HDFS的记录临时路径 -->
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>/data/mr-history/tmp</value>
</property>
<!-- 历史信息在HDFS的记录最终路径 -->
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>/data/mr-history/done</value>
</property>
<!-- 设置MapReduce HOME 为HADOOP_HOME -->
<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>
</configuration>
YARN配置
YARN 配置文件位于 $HADOOP_HOME/etc/hadoop 目录下:yarn-site.xml、yarn-env.sh
# 添加环境变量
vim /usr/local/hadoop/etc/hadoop/yarn-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_361-amd64
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_LOG_DIR=$HADOOP_HOME/logs
# 配置yarn-site.xml
vim /usr/local/hadoop/etc/hadoop/yarn-site.xml
<!-- 配置yarn-site.xml -->
<configuration>
<!-- 资源配置 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>8096</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>8096</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>4</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>4</value>
</property>
<!-- 核心配置 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>Vimller-AnolisOS</value>
<description>resourcemanager所在节点</description>
</property>
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
<description>资源调度策略为公平调度</description>
</property>
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/data/nm-local</value>
<description>NodeManager中间数据本地存储路径</description>
</property>
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>/data/nm-log</value>
<description>NodeManager数据日志本地存储路径</description>
</property>
<property>
<name>yarn.nodemanager.log.retain-seconds</name>
<value>10800</value>
<description>在 NodeManager 上保留日志文件的默认时间(以秒为单位)仅在禁用日志聚合时适用。</description>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<description>为MapReduce程序开启Shuffle服务</description>
</property>
<!-- 额外配置 -->
<property>
<name>yarn.log.server.url</name>
<value>http://Vimller-AnolisOS:19888/jobhistory/logs</value>
<description>历史服务器的URL</description>
</property>
<property>
<name>yarn.web-proxy.address</name>
<value>Vimller-AnolisOS:8089</value>
<description>代理服务器主机和端口</description>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
<description>开启日志聚合</description>
</property>
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/tmp/logs</value>
<description>程序日志HDFS的存储路径</description>
</property>
</configuration>
分发配置文件
cd /usr/local/hadoop/etc/hadoop/
scp mapred-env.sh mapred-site.xml yarn-env.sh yarn-site.xml data-node1:`pwd`/
scp mapred-env.sh mapred-site.xml yarn-env.sh yarn-site.xml data-node2:`pwd`/
启动YARN
# 一键启动
cd /usr/local/hadoop/sbin/
./start-yarn.sh
# 一键停止
./stop-yarn.sh
## 在当前机器单独启动与停止
# 单独启动与停止
yarn --daemon start resourcemanager
yarn --daemon start nodemanager
yarn --daemon stop resourcemanager
yarn --daemon stop nodemanager
# 单独启动与停止proxyserver
yarn --daemon start proxyserver
yarn --daemon stop proxyserver
启动MapReduce JobHistory Server
mapred --daemon start historyserver
mapred --daemon stop historyserver
提交MapReduce程序至YARN运行
Hadoop官方内置了一些预置的MapReduce程序代码,我们无需编程,只需要通过命令即可使用。
常用的有2个MapReduce内置程序:
- wordcount:单词计数程序。 统计指定文件内各个单词出现的次数
- pi:求圆周率 通过蒙特卡罗算法(统计模拟法)求圆周率
# 内置的示例MapReduce程序代码
cd /usr/local/hadoop/share/hadoop/mapreduce
# 通过 hadoop jar 命令来运行它,提交MapReduce程序到YARN中
hadoop jar 程序文件 java类名 [程序参数] ... [程序参数]
hadoop fs -mkdir -p /input/wordcount
hadoop fs -mkdir /output
hadoop fs -put hello.txt /input/wordcount/
cd $HADOOP_HOME/share/hadoop/mapreduce/
hadoop jar hadoop-mapreduce-examples-3.3.6.jar wordcount hdfs://Vimller-AnolisOS:8020/input/wordcount/ hdfs://Vimller-AnolisOS:8020/output/wc1
# 查看结果
hadoop fs -cat /output/wc1/*
2222222222222 1
hello 100
# 删除结果文件
hadoop fs -rm -r /output/wc1
# 测试HA集群上运行
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount hdfs://kube-40:8020/test/ hdfs://kube-40:8020/output/wc1