注意事项
- 配置文件的<description>表签内容可以删,不影响配置文件的读取。
- 最重要的<name><value>标签中间的内容一定要好好检查,尤其是在复制别人的配置信息的时候格外要注意:
- value中有没有空格、有没有因为你打开工具的不同导致部分编码不一致一些符号乱码等问题。
- 尤其是从 pdf文件 复制内容的时候,很容易把每页的标题页脚复制进去,以及pdf复制的内容中有我们看不出来的回车符\n,我今天就是因为配置Yarn的容量调度器,报错说这可能是由于 YARN 包中缺少必要的类或配置文件,或者与调度器相关的配置属性被设置为无效的值。
2023-06-07 16:33:29,238 INFO org.apache.hadoop.service.AbstractService: Service RMActiveServices failed in state INITED
org.apache.hadoop.yarn.exceptions.YarnRuntimeException: Could not instantiate Scheduler: org.apache.hadoop.yarn.server.resourcemanager.scheduler.capaci
ty.CapacityScheduler
at org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.createScheduler(ResourceManager.java:473)
很多时候配置文件光看是一点问题没有的,但是需要仔细审阅,不然会让你怀疑到自闭。
如果还是有报错,那说明就是真的错了,这个时候就需要查看报错日志了
关于yarn-site.xml的参数配置
针对我的电脑(锐龙R7),主要配置三部分
1、ResourceManager
<!-- 1.Yarn-ResourceManager相关配置 ,处理客户端请求,监控管理所有节点(NodeManager)-->
<!-- 选择调度器,默认容量 ,大公司-公平调度器 中小型公司-容量调度器 -->
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
<!-- ResourceManager 处理调度器请求的线程数量,默认 50(也就是用于处理客户端请求的线程数量);
如果提交的任务数大于 50,可以增加该值,但是不能超过 3 台 * 4 线程 = 12 线程(去除其他应用程序实际不能超过 8) -->
<property>
<name>yarn.resourcemanager.scheduler.client.thread-count</name>
<value>8</value>
</property>
2、NodeManager
注意:
并不是说你配置好直接分发给所有节点就完事了,比如NodeManager的参数配置,这是管理每台节点的,如果你的节点的硬件配置(CPU、内存)都差不多,那没问题,你可以配置完yarn-site.xml 后直接分发给集群所有节点。
但是如果你节点的配置相差比较大,一台节点是很好的处理器(比如8核16线程),那么你就需要为它单独配置yarn-site.xml(可以给它配置虚拟核/物理核为 2.0,因为这个参数默认是 1.0)。也就是说我们是根据每台节点的情况不同设置各自的NodeManager参数的。
<!-- 2.Yarn-NodeManager相关配置 管理单节点内存、CPU等资源 -->
<!-- 是否让 yarn 自动检测硬件进行配置,默认是 false,如果该节点有很多其他应用程序,建议
手动配置。如果该节点没有其他应用程序,可以采用自动 -->
<property>
<name>yarn.nodemanager.resource.detect-hardware-capabilities</name>
<value>false</value>
</property>
<!-- 是否将虚拟核数当作 CPU 核数,默认是 false(按照物理核数),如果处理器比较好可以考虑用虚拟核做CPU核数 (比如假设1个i7顶两个i5,那就可以开启),如果节点配置差不多就不需要开启-->
<property>
<name>yarn.nodemanager.resource.count-logical-processors-as-cores</name>
<value>false</value>
</property>
<!-- 虚拟核数和物理核数比例,默认是 1.0(前提是上面得设 将虚拟核作为CPU核数 为true)
注意:这个是针对每个节点配置的,也就是说我们是根据每台节点的情况不同设置各自的NodeManager参数的。
-->
<property>
<name>yarn.nodemanager.resource.pcores-vcores-multiplier</name>
<value>1.0</value>
</property>
<!-- NodeManager 使用内存数,默认 8G,根据我们实际情况(我的内存是4G)修改为 4G 内存 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
</property>
<!-- nodemanager 的 CPU 核数,不按照硬件环境自动设定时默认是 8 个,修改为 4 个 -->
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>4</value>
</property>
3、Container
<!-- 3.Yarn-Container相关配置 -->
<!-- 容器最小内存,默认 1G -->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<!-- 容器最大内存,默认 8G,修改为 2G(不能超过我们NodeManager节点的最大内存) -->
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>2048</value>
</property>
<!-- 容器最小 CPU 核数,默认 1 个 -->
<property>
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
</property>
<!-- 容器最大 CPU 核数,默认 4 个,修改为 2 个(不能超过我们NodeManager的最大CPU核数) -->
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>2</value>
</property>
<!-- 虚拟内存检查,默认打开,修改为关闭 -->
<property>
<description>Whether virtual memory limits will be enforced for
containers.</description>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<!-- 虚拟内存和物理内存设置比例,默认 2.1 -->
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>
如何查看Yarn报错信息
比如我的Yarn是在hadoop103上的,查看报错日志就应该去hadoop103上。
默认在我们Hadoop的主目录下有一个logs的目录:
vim编辑器配置文件
显示行号
命令:esc : set number
删除多行内容
删除1到10行内容
命令:esc:1,10d
附上我今天额外添加的配置信息,日后回来检查
<!-- 1.Yarn-ResourceManager相关配置 ,处理客户端请求,监控管理所有节点(NodeManager)-->
<!-- 选择调度器,默认容量 ,大公司-公平调度器 中小型公司-容量调度器 -->
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
<!-- ResourceManager 处理调度器请求的线程数量,默认 50(也就是用于处理客户端请求的线程数量);
如果提交的任务数大于 50,可以增加该值,但是不能超过 3 台 * 4 线程 = 12 线程(去除其他应用程序实际不能超过 8) -->
<property>
<name>yarn.resourcemanager.scheduler.client.thread-count</name>
<value>8</value>
</property>
<!-- 2.Yarn-NodeManager相关配置 管理单节点内存、CPU等资源 -->
<!-- 是否让 yarn 自动检测硬件进行配置,默认是 false,如果该节点有很多其他应用程序,建议
手动配置。如果该节点没有其他应用程序,可以采用自动 -->
<property>
<name>yarn.nodemanager.resource.detect-hardware-capabilities</name>
<value>false</value>
</property>
<!-- 是否将虚拟核数当作 CPU 核数,默认是 false(按照物理核数),如果处理器比较好可以考虑用虚拟核做CPU核数 (比如假设1个i7顶两个i5,那就可以开启),如果节点配置差不多就不需要开启-->
<property>
<name>yarn.nodemanager.resource.count-logical-processors-as-cores</name>
<value>false</value>
</property>
<!-- 虚拟核数和物理核数比例,默认是 1.0(前提是上面得设 将虚拟核作为CPU核数 为true)
注意:这个是针对每个节点配置的,也就是说我们是根据每台节点的情况不同设置各自的NodeManager参数的。
-->
<property>
<name>yarn.nodemanager.resource.pcores-vcores-multiplier</name>
<value>1.0</value>
</property>
<!-- NodeManager 使用内存数,默认 8G,根据我们实际情况(我的内存是4G)修改为 4G 内存 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
</property>
<!-- nodemanager 的 CPU 核数,不按照硬件环境自动设定时默认是 8 个,修改为 4 个 -->
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>4</value>
</property>
<!-- 3.Yarn-Container相关配置 -->
<!-- 容器最小内存,默认 1G -->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<!-- 容器最大内存,默认 8G,修改为 2G(不能超过我们NodeManager节点的最大内存) -->
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>2048</value>
</property>
<!-- 容器最小 CPU 核数,默认 1 个 -->
<property>
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
</property>
<!-- 容器最大 CPU 核数,默认 4 个,修改为 2 个(不能超过我们NodeManager的最大CPU核数) -->
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>2</value>
</property>
<!-- 虚拟内存检查,默认打开,修改为关闭 -->
<property>
<description>Whether virtual memory limits will be enforced for
containers.</description>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<!-- 虚拟内存和物理内存设置比例,默认 2.1 -->
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>