1-02E. JM的西伯利亚特快专递

本文详细解析了1-02E.JM的西伯利亚特快专递问题,通过贪心算法实现字典序最小的解决方案。文章提供了完整的源代码,并解释了算法的正确性和实现细节。

1-02E. JM的西伯利亚特快专递

题解

题面说得很明白了,很明显的一道贪心。

我们知道要让字典序最小,我们必须让越前面的数越小。所以,贪心思想如下:

我们每次假定当前s串中最小的值,若t串尾部的值比这更小,那么就要t串尾的值,否则一直取到最后一个。

其正确性很容易证明。

源码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#define MAXN 100005
using namespace std;
typedef long long LL;
char str[MAXN];
int a[MAXN],n,sum[30],b[MAXN],tot;
int ans[MAXN],cnt;
#define gc() getchar()
template<typename _T>
inline void read(_T &x){
	_T f=1;x=0;char s=gc();
	while(s>'9'||s<'0'){if(s=='-')f=-1;s=gc();}
	while(s>='0'&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=gc();}
	x*=f;
} 
signed main() {
	scanf("%s",str);n=(int)strlen(str);
	for(int i=0;i<n;i++)a[i+1]=str[i]-'a'+1;
	for(int i=1;i<=n;i++)sum[a[i]]++;
	int ind=1;
	for(int i=1;i<=n;i++){
		while(!sum[ind])ind++;
		while(tot&&b[tot]<=ind)ans[++cnt]=b[tot--];
		if(a[i]==ind)ans[++cnt]=ind,sum[ind]--;
		else b[++tot]=a[i],sum[a[i]]--;
	}
	ind=27;
	while(tot&&b[tot]<=ind)ans[++cnt]=b[tot--];
	for(int i=1;i<=cnt;i++)printf("%c",ans[i]+'a'-1);
	return 0;
}

谢谢!!!

<think>嗯,用户现在的问题是关于优化Flink批处理作业在YARN session集群上的配置以提高稳定性。我需要结合之前讨论的Flink批处理模式特点和用户提供的引用内容来给出建议。 用户之前问过批处理是否需要checkpoint,现在转向集群稳定性优化,说明ta可能在实际部署中遇到了问题。用户提供的引用中,[2]提到Flink在YARN上的运行原理,[4]给出了配置示例,这些都很关键。 从技术角度看,YARN session集群的稳定性优化需要多维度考虑: 首先是资源分配,必须防止容器被YARN抢占,所以vcore和memory的配置要留有余量。引用[2]提到Flink在YARN上的资源管理机制,这里可以引用。比如设置yarn.containers.vcores比实际需求多1-2个作为缓冲。 其次是网络配置,批处理中shuffle数据量很大,需要调整传输参数。引用[4]中的hdfs地址配置思路可以延伸,比如设置akka.framesize和netty传输参数。 内存管理方面,批处理不像流处理那样需要大量状态存储,所以taskmanager.memory.managed.size可以调低,把内存留给计算。引用[3]提到的状态TTL设置其实在批处理中不适用,但内存管理思路可以借鉴。 日志和监控也很重要,特别是长期运行的session集群需要配置日志滚动和JMX监控。引用[1]列出的HDFS支持正好用于存储日志。 最后要提醒用户区分session和per-job模式。如果稳定性要求极高,per-job模式可能更合适,虽然session启动快但容错性差。这点在引用[2]的YARN运行模式分析中有涉及。 用户应该是个大数据工程师,正在生产环境部署Flink批处理作业。ta可能遇到了作业意外中断或资源不足的问题,需要具体的调优参数而非理论说明。因此我会给出可直接粘贴到flink-conf.yaml的配置示例,并标注每个参数的作用。</think>优化 Flink Batch 作业在 YARN Session Cluster 的配置以提升稳定性,需结合资源管理、容错机制和参数调优。以下是关键配置项及优化建议: --- ### **1. 资源分配优化** | **配置项** | **推荐值/建议** | **作用** | |-------------------------------|-------------------------------------------------------------------------------|-------------------------------------------------------------------------| | `yarn.containers.vcores` | 略小于 YARN NodeManager 总 vCore 数(如集群总 vCore 为 40,则设 38) | 避免资源超卖导致容器被 YARN 抢占[^2] | | `taskmanager.memory.process.size` | 根据节点内存调整(如 32GB 节点设 `24g`) | 预留内存给 OS 和 YARN,防止 OOM 杀死容器[^2] | | `jobmanager.memory.process.size` | 根据作业复杂度调整(通常 `2g-4g`) | 确保 JobManager 稳定调度任务 | | `taskmanager.numberOfTaskSlots` | 设为 `taskmanager.memory.process.size / 每个 Slot 内存`(如 24GB 内存,每个 Slot 4GB,则设 6) | 平衡并行度和资源利用率 | --- ### **2. 网络与数据传输优化** ```yaml # 提升 shuffle 稳定性(批处理需大量数据传输) taskmanager.memory.network.fraction: 0.2 # 网络缓冲内存占比 taskmanager.memory.network.min: 256mb # 最小网络缓冲 taskmanager.network.request-backoff.max: 30000 # 网络请求重试间隔(ms) akka.framesize: 104857600 # RPC 消息最大尺寸(100MB) ``` --- ### **3. 容错与状态管理** ```java // Batch 模式无需 Checkpoint,但需配置重启策略 configuration.setString( "restart-strategy", "fixed-delay" ); configuration.setInteger( "restart-strategy.fixed-delay.attempts", 3 // 最大重试次数 ); configuration.setString( "restart-strategy.fixed-delay.delay", "10s" // 重试间隔 ); ``` > **关键区别**:批处理依赖任务重试而非 Checkpoint[^2][^4],避免流处理中状态快照的开销。 --- ### **4. 内存管理优化** ```yaml # 减少 GC 停顿 taskmanager.memory.managed.fraction: 0.3 # Flink 托管内存占比(用于排序/哈希) env.java.opts.taskmanager: "-XX:+UseG1GC -XX:MaxGCPauseMillis=200" ``` --- ### **5. 日志与监控** ```yaml # 避免日志过大导致磁盘溢出 yarn.log-aggregation.include-pattern: "*.log" yarn.log-aggregation.retain-seconds: 604800 # 日志保留7天 web.log.path: "/flink/logs" # 日志存储到 HDFS[^1] ``` --- ### **6. Session Cluster 专属配置** ```yaml # 防止 Session 空闲时资源被回收 yarn.application-attempts: 10 # 最大应用尝试次数 yarn.application-master.port: 0 # 随机端口避免冲突 ``` --- ### **验证与调优步骤** 1. **压力测试**:用 `DataSetUtils.generateRandomDataSet()` 生成测试数据,模拟高负载场景。 2. **监控指标**: - YARN 的 `Container Exit Status`(非 0 表示异常) - Flink 的 `numRestarts`(重试次数应接近 0) 3. **参数迭代**:逐步调整内存/并行度,观察 `TaskManager` 的 GC 时间和 CPU 利用率。 > **稳定性陷阱**:避免将 `taskmanager.memory.process.size` 设为节点全部内存,YARN 需预留内存给其他服务[^2]。 --- ### **典型问题排查** | **现象** | **解决方案** | |------------------------|---------------------------------------------------------------------------| | 频繁 `Container killed` | 增加 `yarn.containers.vcores` 缓冲,或减小 `taskmanager.numberOfTaskSlots` | | Shuffle 阶段卡死 | 提升 `taskmanager.memory.network.min` 并检查网络带宽 | | JobManager 失联 | 检查 `jobmanager.memory.process.size` 是否过小,或配置 HA(ZooKeeper)[^2] | --- 通过以上配置,可显著提升批处理作业在 YARN Session 模式下的稳定性。**核心原则**:预留资源缓冲、优化 shuffle 传输、强化错误重试机制。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值