Page tree
Skip to end of metadata
Go to start of metadata

警告:Jupyter启动时会重置教程的笔记本。如果你想修改并保存它们,请复制一份。

仅限管理员

创建部署、队列和主机被认为是一项管理操作。

对运行仿真感兴趣的用户通常不会与这些API进行交互。队列应该提前设置和使用。

管理员将使用这个笔记本中的API来平衡用户对足够大的队列的需求和运行配置主机的成本。

对于目前集群的硬件成本的估计,请访问:https://admin.beta.scale-hexagon.com/nodes/

工作节点部署

工作节点部署是指在特定数量的主机(节点)上安装软件。节点分为CPU和GPU两类。

  • 使用ScaleGroup对象来定义部署。
  • ScaleGroup是由它的名称唯一标识的,它包含一个ScaleImage列表。
  • ScaleImage引用Docker工作节点镜像。
  • 工作节点镜像包含一个或多个工作节点功能。
  • 工作节点功能是在Scale内完成工作的原子单位。

在部署时,Scale将:

  • 确保存在足够的节点。如果需要更多的节点,则自动创建新的节点分组,并/或扩展现有的节点分组。
  • 创建Kubernetes StatefulSet,引用所有被引用的镜像。
  • 等待所有的工作舱都启动和运行。

在ScaleGroup部署完成之后,可以向其发送作业。

查询

代码:

from scale.services import ScaleGroup

ScaleGroup.query()

输出:

{'analytics': ScaleGroup(name=analytics, replicas=2, status=deployed),
 'vtd-cpu': ScaleGroup(name=vtd-cpu, replicas=8, status=deployed),
 'vtd-gpu': ScaleGroup(name=vtd-gpu, replicas=7, status=deployed)}

解除部署(删除)

代码:

from scale.services import ScaleGroup

ScaleGroup.undeploy_all()

输出:

部署(创建)

代码:

from scale.services import ScaleGroup, ScaleImage

groups = [
  # VTD的CPU仿真,带有0个或1个边车
  ScaleGroup('vtd-cpu', replicas=8).forVertical('VTD', gpu_access=False, sidecars=['sidecar_0']),
    
  # VTD的GPU仿真,带有0个或1个边车
  ScaleGroup('vtd-gpu', replicas=1).forVertical('VTD', gpu_access=True, sidecars=['sidecar_0']),
    
  # Adams车辆
  # ScaleGroup('adams', replicas=6).forVertical('Adams Car'),

  # Nastran
  # ScaleGroup('nastran', replicas=6).forVertical('Nastran'),

  # 闭环迭代采样
  # ScaleGroup('sampler', replicas=1).forVertical('Sampler'),

  # 仅使用Spark处理(例如:加载数据集 & 查询)
  ScaleGroup('analytics', replicas=2).forVertical('Analytics'),
]

# 并行部署每个分组
[group.deploy(wait_timeout=0) for group in groups]

# 等待每个分组部署完成
[group.wait_ready() for group in groups]

输出:

[ScaleGroup(name=vtd-cpu, replicas=8, status=deployed),
 ScaleGroup(name=vtd-gpu, replicas=1, status=deployed),
 ScaleGroup(name=analytics, replicas=2, status=deployed)]

Scale

代码:

from scale.services import ScaleGroup

# 添加更多的工作节点分组,可能需要更多的主机
ScaleGroup('vtd-gpu').scale(7)

输出:

ScaleGroup(name=vtd-gpu, replicas=7, status=scaling)

主机

虚拟机是运行软件的地方。在Kubernetes上,主机被称为节点。

在Scale中,主机不是直接提供(创建)的。它们是在部署工作节点时自动提供的。

在云端,主机是要花钱的。主机在不使用时可能会被释放。

目前,释放主机不是自动的。由于主机包含数据,Scale不想删除仍在使用的数据。提供和移除主机是一个缓慢的过程。Scale不希望删除主机,然后在事后短时间内再提供主机。

移除所有工作主机 — 如果你想要运行仿真,则跳过这一步骤

代码:

from scale.services import ScaleGroup

# 注释以下代码,避免运行耗时较长的主机移除和添加操作
# 通常,移除和添加每台主机会耗费20分钟

# ScaleGroup.remove_all_nodes()

输出:

弹性

Scale被设计成有弹性的。这就意味着集群应该根据使用率进行扩展,并且在资源闲置一段时间后进行缩减。

释放/缩减规模

有两种方式可以缩减集群:

  1. 设置一个空闲计数器。这将在空闲一段时间后缩减集群的大小。
  2. 作业完成之后请求休眠。

代码:

from scale.services import ElasticServices

# 将闲置时间设为30分钟。如果发现Scale闲置30分钟(在最近一次使用之后),然后
#     将所有的工作节点分组缩减为0,并且
#     将工作节点相关的虚拟机释放,
#     将配置成ElasticLevel.ELASTIC的核心服务缩减为0,
#     对应的虚拟机数量也会做相应调整。

# ElasticServices().set_idle_time(1800) # 单位为秒

输出:

代码:

from scale.services import ElasticServices

# 如果想要立即缩减,请运行以下代码(取消注释之后)
# 工作节点只会在空闲时才会被释放。等待正在运行的作业完成。
# 除了工作节点之外,还会将配置成ElasticLevel.ELASTIC的核心服务释放

# ElasticServices().set_request_release_when_idle(True)

输出:

分配/扩展规模

有两种方式可以扩展集群:

  1. 在使用df.run()提交仿真时:
    • Scale将自动添加工作节点
    • Scale将确保被配置成ElasticLevel.ELASTIC的核心服务得到分配
  2. “cron”作业可以定期启动一些服务

代码:

from scale.services import AllocationConfiguration, AllocationConfigurationCollection, ElasticServices

# 这样可以控制Scale在通过run()方法运行作业时的自动分配

# config = AllocationConfigurationCollection(
#     default=AllocationConfiguration(
#         max_workers=20,
#         worker_tasks_min=5,
#         worker_tasks_preferred=10,
#         worker_tasks_max=80),
    
#     by_worker={
#         'gpu': AllocationConfiguration(
#             max_workers=4,
#             worker_tasks_min=5,
#             worker_tasks_preferred=10,
#             worker_tasks_max=80)
#     }
# )

# ElasticServices().set_allocation_configuration(config)

输出:

代码:

from scale.services import AllocationCron, ElasticServices

# 这样可以定义一个cron作业,确保每天早上7点会有10个CPU工作节点可用

# job = AllocationCron(
#     name='daily wakeup',
#     interval='0 14 * * * *', # GMT时区
#     workers={'cpu': 10})

# ElasticServices().set_cron_jobs([job])

输出:

核心服务

核心服务指的是Scale框架服务。

配置

大多数核心服务都是可配置的,有些则不是。可配置的核心服务包括:

  1. job_support
  2. hdfs
  3. kibana

核心服务可以配置为:

  • ON:这个配置确保服务总是可用的,包括系统闲置时
  • OFF:这个配置会完全禁用服务。由于这个配置,Scale需要的支持核心服务的虚拟机数量可能会自动减少。
  • ELASTIC:这个配置将导致在系统闲置时关闭服务,并且在运行仿真作业之前打开服务。这也有助于减少Scale在闲置期间使用的虚拟机数量。

注意:

集群部署完成之后,所有的核心服务都是ON状态。

警告:在将核心服务设置为ON/OFF之前,建议执行以下操作:

  • 保存你的笔记本,因为Jupyter可能暂时不可用
  • 确保没有正在进行的仿真,因为这个变化可能会导致它们失败
获取核心服务配置

代码:

from scale.services import ElasticServices

# 这将获取现有的核心服务配置

print(ElasticServices().get_core_services_config())

输出:

	CoreServicesConfig:
             job_support: ON
             hdfs: ON
             kibana: ON
设置核心服务配置

代码:

from scale.services import ElasticServices, CoreServicesConfig, ElasticLevel

# 这会将核心服务配置设置为指定值。新的配置会立即应用。
# Scale确保所有配置为ON的核心服务仍然在运行,所有配置为OFF的核心服务都关闭。
# 由于禁用了一些服务,虚拟机数量可能会自动减少。
# 目前,标记为ELASTIC的核心服务不会被修改。

# config = CoreServicesConfig(
#     job_support=ElasticLevel.ON,
#     hdfs=ElasticLevel.ON,
#     kibana=ElasticLevel.ON)

# ElasticServices().set_core_services_config(config)

# 你可以获取核心服务配置,查看上述更改是否生效

# print(ElasticServices().get_core_services_config())

输出:

状态

对核心服务配置的任何更改都将立即应用。可以获取所有核心服务的状态。Scale支持每个核心服务的以下状态:

  • RUNNING:核心服务是活跃的
  • NOT_RUNNING:核心服务是不活跃的
  • PENDING:核心服务正在转换为RUNNING状态或NOT_RUNNING状态
获取核心服务状态

代码:

from scale.services import ElasticServices

# 这会获取核心服务的状态

print(ElasticServices().get_core_services())

输出:

	CoreServicesStatus:
             job_support: RUNNING
             hdfs: RUNNING
             kibana: RUNNING
Write a comment...