spark资源分配

Spark的资源主要分为两点:memory,cpu core,涉及到的参数主要有以下6个:

spark.executor.instances / —-num-executors
表示启动多少个executor来运行该作业。
spark.executor.cores / —executor.cores
在默认参数spark.task.cpus设置为1时,该参数的值表示在同一个executor里,最多允许多少个task可同时并发运行。

spark.driver.memory / —-driver-memory
表示驱动进程(Drive端)允许使用的内存空间
spark.executor.memory / —-executor-memory
表示每一个executor进程允许使用的内存空间

spark.shuffle.memoryFraction / —conf spark.shuffle.memoryFraction=
表示在shuffle阶段,用于聚合规约数据时,可使用Java堆内存的比例
spark.storage.memoryFraction / —conf spark.storage.memoryFraction=
表示用于spark缓存数据时,可使用Java堆内存的比例

  1. spark.executor.cores && spark.executor.instances

在Spark on Yarn架构下,这两个值的乘积(spark.executor.cores * spark.executor.instances)决定了Spark App的并发度。

提高并发度,可以使集群同时执行更多的任务;因此当task数一定时,可减少轮询次数。
比如一个Stage有200个task,当并发度为50时,执行这个作业需要轮询4次;当并发度为100时,仅需要轮询2次。
对于并发度(参数乘积)的设置,需要结合队列资源,期望Spark App运行时间,及App每轮Stage的task数决定。
并发度 spark.executor.cores * spark.executor.instances 不可超过队列的最大分配cpu核数。当请求超过最大值,由于频繁的向集群申请资源,反而降低了App的执行效率。
在保证不影响其他App使用队列资源的前提下,可适当提高并发。但当task数量低于并发度,将存在一部分core空间,导致资源浪费。经验值:
当task数很大(千以上级别),建议可设置并发度为队列最大分配cpu核数的1/2或者1/3,避免影响其他作业。
当task数较小时,评估每个task执行时间,在期望运行时间内,可降低并发度,增加轮询次数,减少资源使用。
在并发度过低的情况下,由于同一个executor要处理的task过多,容易造成shuffle阶段reduce过多从同一个executor拉取数据,造成节点响应延时,甚至引发节点失去连接的问题,使得App运行失败。

在保证相同并发量,和内存充足的情况下,可根据作业类型调整core和instance的分配:
作业为IO密集型:若core值较大,容易引起同一个executor的网络IO负载过重,因此建议将core调小;
作业存在大量静态对象,或使用boardcast变量广播数据:由于task序列化及boardcast的分发粒度为executor,且分发过程类似于pipeline的方式,若core值较大,同样的并发下,executor instance减少,则减少分发次数,一定程度上减少task调度执行的时间(申请减少executor,即资源申请,有利于加快task的调度),因此建议将core调大,但最大core值应该小于8:Spark on Yarn:内存分布#

  1. spark.driver.memory

美团没有单独的spark集群,spark部署在Yarn之上。因此提及driver.memory参数,不得不提到的spark on Yarn的两种模式:
yarn-cluster: 适合运行在生产环境。Spark Driver运行在由Yarn管理的AppMaster进程中,由AM负责将集群申请资源,并监督作业运行状态。Client在完成作业的提交后,并可关掉,不影响作业在集群的运行。Client日志仅显示Job的运行状况,没有详细日志。
yarn-client: 适合交互和调试。在此模式下,Spark Driver运行在Client端,负责与运行executor的container通信,而AppMaster仅负责向集群申请资源。Client端Spark-submit进程被kill,则运行在集群上的作业将被kill。

使用yarn-cluster模式运行,程序代码中应该避免使用collect、take、show等将执行结果返回drive的API,这些结果将打印在driver的日志,本地Client也不可见。所以,此模式下,driver仅用于作业的提交,spark默认配置driver memory 为512M。下图为cluster模式下,driver的资源使用情况(配额10G):

使用yarn-client模式运行,若强需直接看到application返回到driver端的输出,一般不建议使用。此模式下,driver memory主要受返回数据大小的影响,视作业具体情况而定。下图为client模式下,driver的资源使用情况(配额10G,无结果返回driver操作):

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个使用Angular的示例代码,用于批量导入Excel电子表格: 1. 首先,需要安装 `xlsx` 和 `file-saver` 库: ``` npm install xlsx file-saver --save ``` 2. 在组件中导入所需的库: ```typescript import { Component } from '@angular/core'; import * as XLSX from 'xlsx'; import { HttpHeaders, HttpClient } from '@angular/common/http'; ``` 3. 创建一个用于读取Excel电子表格的方法: ```typescript onFileChange(evt: any) { const target: DataTransfer = <DataTransfer>(evt.target); if (target.files.length !== 1) { throw new Error('Cannot use multiple files'); } const reader: FileReader = new FileReader(); reader.onload = (e: any) => { const bstr: string = e.target.result; const wb: XLSX.WorkBook = XLSX.read(bstr, { type: 'binary' }); const wsname: string = wb.SheetNames[0]; const ws: XLSX.WorkSheet = wb.Sheets[wsname]; const data = XLSX.utils.sheet_to_json(ws, { header: 1 }); console.log(data); // 将数据发送到服务器进行处理 this.uploadFile(target.files[0]); }; reader.readAsBinaryString(target.files[0]); } ``` 4. 将文件上传到服务器端进行处理: ```typescript uploadFile(file: File) { const formData: FormData = new FormData(); formData.append('file', file, file.name); const headers = new HttpHeaders(); headers.append('Content-Type', 'multipart/form-data'); this.httpClient.post('http://your-server-url', formData, { headers: headers }).subscribe( (response) => { console.log(response); if (response.success) { // 导入成功 notify({ message: '导入成功' }, 'success', 2000); } else { // 导入失败 notify({ message: '导入失败:' + response.message }, 'error', 8000); } }, (error) => { console.log(error); } ); } ``` 请注意,这仅是基本示例代码,您需要根据您的具体需求进行修改和调整。并且需要根据您的具体情况,替换 `http://your-server-url` 为您的服务器端URL。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值