部署服务器:

sparkml 集群

########### sparkml ##########

sparkml-node1 # yarn resource manager
sparkml-node2 # nodemanager spark-2.0.0
sparkml-node3 # nodemanager spark-2.0.0
sparkml-node4 # nodemanager spark-2.0.0
sparkml-node5 # nodemanager spark-2.0.0

上线功能:

  1. Cgroup 限制每个节点 yarn container 能占用的该节点 CPU 总量
  2. 每个 yarn container 能够按照被分配的 vcore 数目 share CPU

测试方法:

功能一测试:

在不限制的情况下,我们跑一条 hive SQL

test_hive_sql.sql

我们看看 container 分配情况:

4 个 nodemanager 节点的 CPU 使用情况:

都接近 100 %

我们现在尝试限制到 50%

设置 cpu.cfs_quota_us="1200000"; (计算方法:24 (逻辑CPU核心数)* 0.5(50% CPU 使用)* 100000(每个计算周期)  = 1200000)

重启 cgroup : /etc/init.d/cgconfig restart

再跑一次同样的 SQL :

基本同样的 container 分配

nodemanager 服务器上的 CPU 使用:

全部限制在 50% 以内

功能二,测试:

hive SQL 跑出来的 container 都只占用了 一个 vcore (mapred的特性?),因此我们用 spark 来进行测试:

我们跑这一段代码:

from __future__ import print_function

#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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 of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# import sys
from random import random
from operator import add from pyspark import SparkContext import time if __name__ == "__main__":
"""
Usage: pi [partitions]
"""
sc = SparkContext(appName="PythonPi")
partitions = int(sys.argv[1]) if len(sys.argv) > 1 else 2
n = 100000 * partitions def f(_):
for i in range(1,10000):
x = random() * random() * random() - 1
y = random() * random() * random() - 1
#time.sleep(60)
x = random() * random() * random() - 1
y = random() * random() * random() - 1
return 1 if x ** 2 + y ** 2 < 1 else 0 count = sc.parallelize(range(1, n + 1), partitions).map(f).reduce(add)
print("Pi is roughly %f" % (4.0 * count / n)) sc.stop()

container 分配:

跑了 1 个 container 4 个 vcore 的服务器上面:

跑测试的  hive SQL

在 node4 这台服务器上:

spark_sc 的 CPU 占用只有 100,没有其他 vcore 为 1 的来自 hdfs 的 container 多

这是因为上述 python 代码没有并发,因此只能使用 一个 核

这台服务器上有 5 个 container :

只有 最后一个 container 的 cpu.shares 值是 4096 ,是别的 4 倍

上述结果和我们观察到的 vcore 分配一致,在这里 python code 的 CPU 占用没有 hive SQL 生成的 container 多是因为 python 使用了 单进程,没有多核调度

测试结果:

对于功能一:生效

对于功能二:生效,通过控制 cpu.shares 来按照 vcore 分配 CPU ,缺乏直观的测试数据

配置参数:

yarn.nodemanager.container-executor.class : org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor

yarn.nodemanager.linux-container-executor.resources-handler.class : org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler

yarn.nodemanager.linux-container-executor.cgroups.hierarchy : /hadoop-yarn (对于 /cgroup/cpu/ 目录下的 cgroup hierarchy ,手动配置到 cgconfig.conf 文件里面)

yarn.nodemanager.linux-container-executor.cgroups.mount : true

yarn.nodemanager.linux-container-executor.cgroups.mount-path : /cgroup (cgroup 文件系统根目录)

yarn.nodemanager.linux-container-executor.group : yarn

yarn.nodemanager.linux-container-executor.nonsecure-mode.limit-users : false

不生效参数:

yarn.nodemanager.resource.percentage-physical-cpu-limit : 100 (该参数控制 nodemanager 节点的总体CPU 使用,hadoop-2.5.0-cdh5.3.2 不支持,可以同在 在 cgconfig.conf 中配置 cpu.cfs_quota_us)

yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage : false (CPU use hard limit)

cgroup 配置:

#
# Copyright IBM Corporation.
#
# Authors: Balbir Singh <balbir@linux.vnet.ibm.com>
# This program is free software; you can redistribute it and/or modify it
# under the terms of version 2.1 of the GNU Lesser General Public License
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it would be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# See man cgconfig.conf for further details.
#
# By default, mount all controllers to /cgroup/<controller> mount {
cpuset = /cgroup/cpuset;
cpu = /cgroup/cpu;
cpuacct = /cgroup/cpuacct;
memory = /cgroup/memory;
devices = /cgroup/devices;
freezer = /cgroup/freezer;
net_cls = /cgroup/net_cls;
blkio = /cgroup/blkio;
} group hadoop-yarn {
perm {
task {
uid = yarn;
gid = hadoop;
} admin {
uid = yarn;
gid = hadoop;
}
}
cpu {
# cpu.shares="1024";
# cpu.cfs_period_us="100000";
# cpu.cfs_quota_us="1200000";
}
}

原理简述:

cgroup 通过 cgroup hierarchy  来将 subsystem 和 task 联系起来,每次 yarn 在启动 container 的时候都会将在指定的 hadoop-yarn cgroup hierarchy  下面新建属于每个 container 的 hierarchy

开始跑 container 以后

由于总体的 节点 CPU 限制在线上版本不支持(YarnConfiguration.java 里面没有读入 yarn.nodemanager.resource.percentage-physical-cpu-limit 参数,也没有在 CgroupsLCEResourcesHandler 有相关实现,具体实现参考 : YARN-2440

我们在 hadoop-yarn 里面配置 设置 cpu.cfs_quota_us ,在 hadoop-yarn  下属的所有 container cgroup hierarchy   都不能超过父 hierarchy   的限制

对于功能二:

通过 YARN-600 加入到  CgroupsLCEResourcesHandler 类

if (isCpuWeightEnabled()) {
createCgroup(CONTROLLER_CPU, containerName);
int cpuShares = CPU_DEFAULT_WEIGHT * containerResource.getVirtualCores(); // absolute minimum of 10 shares for zero CPU containers
cpuShares = Math.max(cpuShares, 10); updateCgroup(CONTROLLER_CPU, containerName, "shares",
String.valueOf(cpuShares));
}

cpuShares 最少值 为 10 ,按照 VirtualCores 给予每个 container 相应的 cpu.shares 值

Linux cfs 调度器会根据 cpu.shares 值作用到 CPU 调度,具体参考:cpu.shares 作用原理

部署流程:

yarn-site.xml 

<property>
<name>yarn.nodemanager.container-executor.class</name>
<value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value>
</property>
<property>
<name>yarn.nodemanager.linux-container-executor.resources-handler.class</name>
<value>org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler</value>
</property>
<property>
<name>yarn.nodemanager.linux-container-executor.cgroups.hierarchy</name>
<value>/hadoop-yarn</value>
</property>
<property>
<name>yarn.nodemanager.linux-container-executor.cgroups.mount</name>
<value>true</value>
</property>
<property>
<name>yarn.nodemanager.linux-container-executor.cgroups.mount-path</name>
<value>/cgroup</value>
</property>
<property>
<name>yarn.nodemanager.linux-container-executor.group</name>
<value>yarn</value>
</property>
<property>
<name>yarn.nodemanager.resource.percentage-physical-cpu-limit</name>
<value></value>
</property>
<property>
<name>yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.linux-container-executor.nonsecure-mode.limit-users</name>
<value>false</value>
</property>

部署 cgroup

重新编译 container-executor :

cd ${HADOOP_HOME}/hadoop-2.6.-src/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/

cmake src -DHADOOP_CONF_DIR=/etc/hadoop
make

cd targe/usr/local/bin/即可获得需要的container-executor文件

配置 container-executor.cfg

yarn.nodemanager.linux-container-executor.group=yarn
banned.users=bin
min.user.id=
allowed.system.users=hdfs,yarn

启动 cgroup

重启 yarn

参考文献:

yarn 新特性 - cgroup

Using YARN with Cgroups

Using YARN with Cgroups 参数配置 Apache 官网

cgroup 使用文档

YARN配置Kerberos认证

container executor 简介

按照 vcore 计算 container CPU 使用

AMBARI-9376

美团概述:Cgroup 简介

Cgroup – 从CPU资源隔离说起

cgroup 部署测试指南

后续跟进:

调查 yarn 是否支持灰度上 cgroup

我们使用在外围不停 cgclassify 来上 cgroup

#!/bin/bash 

echo ""
echo "" containerPid=` su - yarn -c ' jps | grep -v NodeManager | grep -v -i jps ' | awk '{print $1}' ` containerList=` su - yarn -c ' jps | grep -v NodeManager | grep -v -i jps ' ` echo " We will begin to move ${containerList} of yarn to cgroup " for pid in ${containerPid}
do
cgclassify -g cpu:hadoop-yarn $pid
done echo " Move to cgroup per minute done " taskID=` cat /cgroup/cpu/hadoop-yarn/tasks ` echo " Content in hadoop-yarn hierarchy is : ${taskID} " date echo ""
echo ""

部署 crontab job 一分钟一次,看效果

待续

Using YARN with Cgroups testing in sparkml cluster的更多相关文章

  1. Hadoop 3.1.1 - Yarn - 使用 CGroups

    在 Yarn 上使用 CGroups CGroups 是一种将任务及其子任务聚集和划分进一个垂直的分组的策略,并提供在此结构上的特别的操作.CGroups 是 Linux 内核功能,自内核版本 2.6 ...

  2. 十四:Using CGroups with YARN

        Cgroups可以控制linux 上应用程序的资源(内存.CPU)使用,yarn可以使用Cgroups来CPU使用.Cgroups的配置,在yarn-site.xml中设置: 1)启用Cgro ...

  3. Spark On YARN启动流程源码分析(一)

    本文主要参考: a. https://www.cnblogs.com/yy3b2007com/p/10934090.html 0. 说明 a. 关于spark源码会不定期的更新与补充 b. 对于spa ...

  4. Flink运行在yarn上

    在一个企业中,为了最大化的利用集群资源,一般都会在一个集群中同时运行多种类型的 Workload.因此 Flink 也支持在 Yarn 上面运行: flink on yarn的前提是:hdfs.yar ...

  5. <YARN><MRv2><Spark on YARN>

    MRv1 VS MRv2 MRv1: - JobTracker: 资源管理 & 作业控制- 每个作业由一个JobInProgress控制,每个任务由一个TaskInProgress控制.由于每 ...

  6. 有关python numpy pandas scipy 等 能在YARN集群上 运行PySpark

    有关这个问题,似乎这个在某些时候,用python写好,且spark没有响应的算法支持, 能否能在YARN集群上 运行PySpark方式, 将python分析程序提交上去? Spark Applicat ...

  7. YARN 多租户资源池配置

    简介: YARN 多租户资源池配置 当多用户同在一个 hadoop 集群作业时,就需要对资源进行有效的限制,例如区分测试.正式资源等 一.查看默认资源池 # 访问:http://192.168.1.2 ...

  8. Spark运行模式_基于YARN的Resource Manager的Client模式(集群)

    现在越来越多的场景,都是Spark跑在Hadoop集群中,所以为了做到资源能够均衡调度,会使用YARN来做为Spark的Cluster Manager,来为Spark的应用程序分配资源. 在执行Spa ...

  9. 执行”spark-shell –master yarn –deploy-mode client”,虚拟内存大小溢出,报错

    在Hadoop 2.7.2集群下执行如下命令: spark-shell  --master yarn --deploy-mode client 爆出下面的错误: org.apache.spark.Sp ...

随机推荐

  1. Android零点一度的区别——Matrix

    2013-07-07 导语:Matrix是android中对图像绘制的处理(旋转.放缩.平移等等),貌似书本翻页就是用这种方式处理的 正文: 1.基于坐标(px,py)旋转degrees度, post ...

  2. 写一些脚本的心得总结系列第4篇-------从数据库同步到redis

    5.从数据库同步到redis的. redis把数据放内存里,读取都非常方便,也提供了远超memcache的丰富数据结构.下面我举2个例子,比如1)把数据从数据库写入到redis: <?php $ ...

  3. [ios2]判断retina 屏幕

    判断是否retina屏幕 #define isRetina ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSize ...

  4. MyEclipse导入Maven项目pom文件第一行报错,运行Tomcat报Log4j错误--解决方法

    问题描述: 前一段时间电脑第一次导入Maven项目,又是pom文件错,改好后又是运行Tomcat报Log4j错误,一直倒腾了近一个月程序才成功跑起来,太不容易. 也上网查了很长时间,没一个方法能解决我 ...

  5. 【MSP是什么】MSP认证之项目群管理

    项目群管理是一套流程.工具和方法来管理一组项目以达到与组织愿景一致的目的.为了达成对业务具有战略重要性的成果并实现收益, 而对一系列项目和变革活动的组织.方向和实施开展的协调行动.通过对项目群进行管理 ...

  6. jQuery的css

    1.css(name|pro|[,val|fn]) 访问匹配元素的样式属性. 参数name 描述: 取得第一个段落的color样式属性的值. $("p").css("co ...

  7. Maven之(七)pom.xml配置文件详解

    setting.xml主要用于配置maven的运行环境等一系列通用的属性,是全局级别的配置文件:而pom.xml主要描述了项目的maven坐标,依赖关系,开发者需要遵循的规则,缺陷管理系统,组织和li ...

  8. Linux 下Nginx 的安装及负载均衡的简单配置

    这次发布程序需要均衡负载,网上看了一下这方便的东西,觉得很不错,学完之后做下总结,一遍后期用到. 1.安装nginx之前需要安装的两个依赖,pcre-x.x.x.tar.gz 和pcre-devel- ...

  9. TCP/IP协议中backlog参数

    TCP建立连接是要进行三次握手,但是否完成三次握手后,服务器就处理(accept)呢? backlog其实是一个连接队列,在Linux内核2.2之前,backlog大小包括半连接状态和全连接状态两种队 ...

  10. 【jQuery、原生】键盘键入两位小数

    jquery的处理办法 <!doctype html> <html lang="en"> <head> <meta charset=&qu ...