ZooKeeper节点数据量限制引起的Hadoop YARN ResourceManager崩溃原因分析(三)

hadoop相关问题 一、mapreduce作业oom 1、任务还没启动,直接oom报错 AM日志: 21/05/10 15:15:13 INFO mapreduce.Job: Task Id : attempt_1617064346277_101596_m_000000_1, Status : FAILEDError: Java heap space21/05/10 15:15:16 INFO mapreduce.Job: Task Id : attempt_1617064346277_101596_m_000000_2, S 阅读详情

阿里云协同办公工具Teambition 0元试用>>> hot3.png

这个问题又让我们碰到了,发生次数不频繁但是一旦发生就会造成ResourceManager服务崩溃、ZK注册watch过多等问题。不彻底解决这个问题心中一直是个梗,所以基于前两次的分析和阅读社区最新版Hadoop 3.2.1代码之后,给生产环境YARN打patch最终解决这个问题。对于疑难问题,每遇到一次就有一次不同的感悟,接下来是我本次分析和解决该问题的过程记录。前两次解决和分析该问题的记录如下:

环境

  • Hadoop版本:Apache Hadoop 2.6.3
  • ZooKeeper版本:ZooKeeper 3.4.10
  • 两个ResourceManager节点:主节点RM01,从节点RM02

问题原因

这个问题很难复现,前两次一直没找到产生该问题的原因,打了patch之后,我们在日志中发现,产生该问题主要是由于部分异常任务导致的,日志如下:

2020-04-28 10:05:54 INFO  org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore:768 - Application update attemptState data size for /rmstore/ZKRMStateRoot/RMAppRoot/application_1587969707206_16259/appattempt_1587969707206_16259_000001 is 20266528. Exceed the maximum allowed 3145728 size. ApplicationAttemptState info: ApplicationAttemptState{attemptId=appattempt_1587969707206_16259_000001, diagnostics='User class threw exception: java.lang.RuntimeException: org.apache.spark.SparkException: Job aborted due to stage failure: Task 15 in stage 2.0 failed 4 times, most recent failure: Lost task 15.3 in stage 2.0 (TID 4224, datanode44.bi): java.util.concurrent.ExecutionException: java.lang.Exception: failed to compile: org.codehaus.janino.JaninoRuntimeException: Code of method "(Lorg/apache/spark/sql/catalyst/expressions/GeneratedClass$SpecificUnsafeProjection;Lorg/apache/spark/sql/catalyst/InternalRow;)V" of class "org.apache.spark.sql.catalyst.expressions.GeneratedClass$SpecificUnsafeProjection" grows beyond 64 KB
/* 001 */ public java.lang.Object generate(Object[] references) {
/* 002 */   return new SpecificUnsafeProjection(references);
/* 003 */ }
/* 004 */
/* 005 */ class SpecificUnsafeProjection extends org.apache.spark.sql.catalyst.expressions.UnsafeProjection {
/* 006 */
/* 007 */   private Object[] references;
/* 008 */   private scala.collection.immutable.Set hset;
/* 009 */   private boolean hasNull;
/* 010 */   private UnsafeRow result;
/* 011 */   private org.apache.spark.sql.catalyst.expressions.codegen.BufferHolder holder;
/* 012 */   private org.apache.spark.sql.catalyst.expressions.codegen.UnsafeRowWriter rowWriter;

当任务出现异常时,YARN会保存任务的异常信息,当异常信息很多时,YARN往ZK保存任务状态的数据量就会超过ZK的限制。从日志中可以看出,出现异常的Spark任务状态数据是20266528字节,也就是19MB,远远超过了我们所设置的3MB。在YARN监控界面上可以看到该任务的异常信息有20万行:

解决方案

由于有了前两次发现和解决问题以及源码理解的经验,所以这次解决问题就顺手的多,去年八月份解决该问题的最终方案是调整ZK服务端和YARN客户端的jute.maxbuffer参数值为3MB,也就是调整ZK中每个ZNode能保存的最大数据量为3MB。但是这样的方案有以下明显的缺点:

  • 使ZK中保存的数据量比较大,导致ZK JVM内存紧张,极端情况下会使ZK OOM,同时也会影响ZK数据读写、数据同步以及持久化效率
  • jute.maxbuffer属于硬配置的方式,为了使配置生效,还需要重启ZK服务和客户端YARN RM服务,对ZK服务以及依赖ZK的服务运维成本比较大。由于当前我们生产环境YARN使用的这套ZK集群还管理HBase、流式计算任务的元数据,所以重启影响还是比较大的

可以看出,通过修改jute.maxbuffer方式虽然也解决了问题,但是会对ZK服务和依赖ZK的服务有影响,运维成本也比较高。于是通过追踪社区issue和阅读Hadoop 3.2.1源码,我们采取通过在yarn-site.xml增加yarn.resourcemanager.zk-max-znode-size.bytes配置的方式来解决YARN往ZK写数据量超过ZK限制的问题,该配置是在Hadoop 2.9.0版本加入的。使用这种方式,我们不需要修改ZK服务端的配置,而只需要修改YARN服务端的配置并重启YARN就能限制YARN往ZK写入的数据量,而且也提高了ZK服务的可用性。打了patch后的代码逻辑超过数据量限制的任务状态数据直接被丢弃,并打印log日志,方便日后问题追溯。打了patch后的ZKRMStateStore主要代码如下(由于篇幅原因,其余代码省略):

public class ZKRMStateStore extends RMStateStore{
    
    private int zknodeLimit; // 保存ZNode节点数据量限制
    
     @Override
    public synchronized void initInternal(Configuration conf) throws Exception {
        // 其余部分省略
        // 获取yarn-site.xml中yarn.resourcemanager.zk-max-znode-size.bytes的值
        zknodeLimit = conf.getInt(YarnConfiguration.RM_ZK_ZNODE_SIZE_LIMIT_BYTES,
                YarnConfiguration.DEFAULT_RM_ZK_ZNODE_SIZE_LIMIT_BYTES);
    }
    
    @Override
    public synchronized void updateApplicationAttemptStateInternal(
            ApplicationAttemptId appAttemptId,
            ApplicationAttemptStateData attemptStateDataPB)
            throws Exception {
        String appIdStr = appAttemptId.getApplicationId().toString();
        String appAttemptIdStr = appAttemptId.toString();
        String appDirPath = getNodePath(rmAppRoot, appIdStr);
        String nodeUpdatePath = getNodePath(appDirPath, appAttemptIdStr);
        if (LOG.isDebugEnabled()) {
            LOG.debug("Storing final state info for attempt: " + appAttemptIdStr
                    + " at: " + nodeUpdatePath);
        }
        byte[] attemptStateData = attemptStateDataPB.getProto().toByteArray();

        ApplicationAttemptState attemptState = getApplicationAttemptState(appAttemptId, attemptStateDataPB);
        // 判断要写入的任务尝试数据信息是否超过zknodeLimit变量的值,如果没有,就执行任务尝试数据更新操作。否则,只打印info信息,不执行任务尝试数据更新操作
        if (attemptStateData.length <= zknodeLimit) {
            if (existsWithRetries(nodeUpdatePath, true) != null) {
                setDataWithRetries(nodeUpdatePath, attemptStateData, -1);
            } else {
                createWithRetries(nodeUpdatePath, attemptStateData, zkAcl,
                        CreateMode.PERSISTENT);
                LOG.debug(appAttemptId + " znode didn't exist. Created a new znode to"
                        + " update the application attempt state.");
            }
            LOG.info("Application update attemptState data size for " + nodeUpdatePath + " is "
                    + attemptStateData.length + ". The maximum allowed " + zknodeLimit + " size. ApplicationAttemptState info: " + attemptState.toString() + ". AppAttemptTokens length:" + attemptStateDataPB.getAppAttemptTokens().array().length
                    + ". See yarn.resourcemanager.zk-max-znode-size.bytes.");
        } else {
            LOG.info("Application update attemptState data size for " + nodeUpdatePath + " is "
                    + attemptStateData.length + ". Exceed the maximum allowed " + zknodeLimit + " size. ApplicationAttemptState info: " + attemptState.toString() + ". AppAttemptTokens length:" + attemptStateDataPB.getAppAttemptTokens().array().length
                    + ". See yarn.resourcemanager.zk-max-znode-size.bytes.");
        }
    }
}

问题总结

1、YARN使用ZK来实现故障状态恢复,这里的修改会不会影响正常任务的执行和状态恢复?

不会。经过线上一段时间的运行和我们使用zkdoctor监控的数据发现,YARN存储在ZK中的正常任务的状态数据一般不会超过512K,只有部分异常任务的异常信息数据会特别大,这个异常信息数据是引起YARN向ZK写数据量超过限制的根本原因。

YARN将共享状态存储系统定义成一个RMStateStore抽象类,以保存ResourceManager故障恢复后所必需的状态信息,这些信息都是一些基本数据类型的信息,没有特别复杂的数据类型,比如字节数组。ResourceManager也不会保存已经分配给每个ApplicationMaster的资源信息和每个NodeManager的资源使用信息,这些均可通过相应的心跳汇报机制重构出来。因此,ResourceManager的HA实现是非常轻量级的。涉及到任务状态的主要类如下:

(1)Application状态信息ApplicationState:

 /**
   * State of an application application
   * 任务状态信息类
   */
  public static class ApplicationState {
    final ApplicationSubmissionContext context; // 任务描述信息content
    final long submitTime; // 任务提交时间
    final long startTime; // 任务开始时间
    final String user; // 任务提交人
    Map<ApplicationAttemptId, ApplicationAttemptState> attempts =
                  new HashMap<ApplicationAttemptId, ApplicationAttemptState>(); // 任务重试信息
    // fields set when application completes.
    RMAppState state; // 任务运行状态
    String diagnostics; // 任务异常诊断信息
    long finishTime; // 任务完成时间
    
    // 省略其他代码
  }

(2)Application对应的每个ApplicationAttempt信息ApplicationAttemptState:

 /**
   * State of an application attempt
   * 任务尝试状态信息类
   */
  public static class ApplicationAttemptState {
    final ApplicationAttemptId attemptId; // 任务尝试ID
    final Container masterContainer; // 所在container的信息
    final Credentials appAttemptCredentials; // 安全token
    long startTime = 0; // 开始时间
    long finishTime = 0; // 结束时间
    // fields set when attempt completes
    RMAppAttemptState state; // 运行状态
    String finalTrackingUrl = "N/A"; // 任务运行日志查看地址
    String diagnostics; // 任务异常诊断信息
    int exitStatus = ContainerExitStatus.INVALID; // 任务退出状态
    FinalApplicationStatus amUnregisteredFinalStatus; // 任务最终状态
    long memorySeconds; // 任务消耗的内存总资源
    long vcoreSeconds; // 任务消耗的CPU总资源
    
    // 省略其他代码
  }

(3)安全令牌相关信息RMDTSecretManagerState:

 /**
   * 安全令牌信息
   */
  public static class RMDTSecretManagerState {
    // DTIdentifier -> renewDate
    Map<RMDelegationTokenIdentifier, Long> delegationTokenState =
        new HashMap<RMDelegationTokenIdentifier, Long>(); // 授权令牌状态
    Set<DelegationKey> masterKeyState =
        new HashSet<DelegationKey>(); // master key状态
    int dtSequenceNumber = 0; // 序列号
    
    // 省略其他代码
 }

2、YARN出现异常时为什么会导致ZK中注册很多的watch?

YARN出现异常会进行故障转移,故障转移到standby节点,standby节点会调用RMState的loadState方法进行任务状态数据的恢复,loadState会调用ZKRMStateStore的loadRMAppState方法读取在ZK中保存的任务状态数据,在调用ZK的getData方法时会给任务状态节点和任务尝试状态节点注册watch,以监听任务状态的变化。由于任务状态节点和任务尝试状态节点是持久节点,不会因为ZK客户端连接失效而删除,且是一对多的关系,因此会导致watch数量很多。以下是加载任务状态的相关代码:

 private synchronized void loadRMAppState(RMState rmState) throws Exception {
        // 当/rmstore/ZKRMStateRoot/RMAppRoot/节点及其子节点被删除或创建时,watch被触发
        List<String> childNodes = getChildrenWithRetries(rmAppRoot, true);
        for (String childNodeName : childNodes) {
            String childNodePath = getNodePath(rmAppRoot, childNodeName);
            // 获取任务节点数据并注册watch,该watch当任务节点被删除或数据被更新时触发
            byte[] childData = getDataWithRetries(childNodePath, true);
            if (childNodeName.startsWith(ApplicationId.appIdStrPrefix)) {
                // application
                if (LOG.isDebugEnabled()) {
                    LOG.debug("Loading application from znode: " + childNodeName);
                }
                ApplicationId appId = ConverterUtils.toApplicationId(childNodeName);
                ApplicationStateDataPBImpl appStateData =
                        new ApplicationStateDataPBImpl(
                                ApplicationStateDataProto.parseFrom(childData));
                // 获取任务数据
                ApplicationState appState =
                        new ApplicationState(appStateData.getSubmitTime(),
                                appStateData.getStartTime(),
                                appStateData.getApplicationSubmissionContext(),
                                appStateData.getUser(),
                                appStateData.getState(),
                                appStateData.getDiagnostics(), appStateData.getFinishTime());
                if (!appId.equals(appState.context.getApplicationId())) {
                    throw new YarnRuntimeException("The child node name is different " +
                            "from the application id");
                }
                rmState.appState.put(appId, appState);
                // 获取任务重试数据
                loadApplicationAttemptState(appState, appId);
            } else {
                LOG.info("Unknown child node with name: " + childNodeName);
            }
        }
    }

我们生产环境设置在ZK中保存2万个任务状态信息,发生问题时监控发现YARN往ZK注册了10几万的watch。由于ZK的watch信息是用HashMap(key是ZNode节点的path,value是注册在ZNode上的watch集合)保存的,因此大量的watch会使这个HashMap成为JVM中的一个大对象,这个大对象会一直保存在ZK的服务器端不会被回收,直到YARN被动删除或者更新任务状态数据时才会移除相应节点的watch,ZK服务端保存watch信息的HashMap的元素数量才会相应减少。这是一个比较缓慢的过程,在这个过程中,ZK很可能因为JVM GC问题响应缓慢甚至出现OOM。去年就由于YARN出现问题往ZK注册很多watch导致ZK OOM,继而影响到依赖ZK的HBase服务出现异常。因此,我们在打patch的基础上,将YARN迁移到一套独立的ZK集群,这套ZK集群只为YARN服务,从而提高大数据基础服务的可用性。

我们监控和统计发现,正常情况下,YARN往ZK中注册的watch很少,基本上都是运行时的任务状态数据节点的watch,因此不会对ZK产生太大压力。

3、YARN向ZK写任务状态异常为什么会触发YARN故障转移?

在ZKRMStateStore与ZK交互的方法里,都会调用ZKRMStateStore.ZKAction类的runWithRetries方法进行重试,正常情况下不需要重试。如果发生异常才会触发重试逻辑,默认重试1000次,当重试1000次之后,会使用throw方式给上层调用者抛出异常,凡是以下方法都有可能抛出异常:

异常会被RMStateStore的notifyStoreOperationFailed方法捕捉到,该方法很简单,主要进行以下逻辑判断:

  • 如果YARN开启了HA,则触发故障转移操作
  • 如果没有开启HA,则判断YARN是否开启了快速失败特性,则触发RMFatalEventType.STATE_STORE_OP_FAILED事件,退出进程
  • 如果以上两个条件都不满足,则打印warn信息

该方法具体代码如下:

 /**
   * 该方法通知RM存储操作失败,参数是引起操作失败的异常信息
   * This method is called to notify the ResourceManager that the store
   * operation has failed.
   * @param failureCause the exception due to which the operation failed
   */
  protected void notifyStoreOperationFailed(Exception failureCause) {
    LOG.error("State store operation failed ", failureCause);
    // 如果开启了HA,则执行故障转移操作
    if (HAUtil.isHAEnabled(getConfig())) {
      LOG.warn("State-store fenced ! Transitioning RM to standby");
      Thread standByTransitionThread =
          new Thread(new StandByTransitionThread());
      standByTransitionThread.setName("StandByTransitionThread Handler");
      standByTransitionThread.start();
    } else if (YarnConfiguration.shouldRMFailFast(getConfig())) { // 如果没有开启HA,则判断有没有开启快速失败
      LOG.fatal("Fail RM now due to state-store error!");
      rmDispatcher.getEventHandler().handle(
          new RMFatalEvent(RMFatalEventType.STATE_STORE_OP_FAILED,
              failureCause));
    } else { // 否则,打印跳过存储异常警告信息
      LOG.warn("Skip the state-store error.");
    }
  }

参考资料

重启yarn导致rm都为standby分析 1、问题现象 调整yarn参数配置后,重启两个rm服务,重启后rm状态都为standby 2、问题分析 查两个rm日志都显示如下 两点错误信息,一个是都为standby状态,一个是很多的application任务失败 还有zk日志中会一直刷连接zk问题 3、问题解决 进入zookeeper控制台,找到保存yarn任务的地方,删除yarn任务信息 ls /rmstore/ZKRMStateRoot/RMAppRoot 不为空则使用该命令rmr /rmstore/ZKRMSta.. 阅读详情

相关推荐

YARN不是调度器:揭秘Hadoop分布式操作系统内核架构

YARN是Hadoop生态中首个将计算资源抽象为可编程操作系统内核的基础设施,其核心在于资源抽象、进程隔离与生命周期自治。它通过ResourceManager、ApplicationMaster和NodeManager构成的双层调度模型,实现全局资源仲裁与应用级智能调度的解耦。技术价值体现在多租户隔离、跨框架资源复用及生产级容错能力,广泛应用于Spark、Flink等大数据引擎的资源底座。深入理解YARN的CGroups内存控制、Timeline Server事件总线与RM HA状态恢复机制,是构建高可用P

congbao6525的博客 391

Yarn RM写ZNode超数据量限制bug修复

Yarn RM写ZNode超数据量限制bug修复 问题背景 线上集群出现过几次 Yarn RM 写 ZK ZNode 的数据量超过 ZNode 限制,导致 RM 服务均进入 Standby 状态,用户无法正常提交任务,整个集群 hang 住,后续排查发现主要是异常任务写 ZNode 数据量太大,超过 ZNode 限制,导致集群其他提交作业的状态信息无法正常写入 ZNode,为避免类似问题再次出现,我们对 RM 写 ZNode 逻辑进行了优化,规避异常任务对整个集群造成的雪崩效应。 一、问题复现 最直

JacksonKing的专栏 919

YARN架构深度解析:RM/NM/AM三层设计与Container资源隔离原理

YARN是Hadoop生态中实现多计算框架(如Spark、Flink、MapReduce)共享集群资源的核心调度框架,其本质是一套基于资源契约的分布式协调系统。它通过ResourceManager、NodeManager和ApplicationMaster的职责分离,解耦资源管理与任务调度,支撑高并发、多租户、可伸缩的生产级数据平台。关键技术价值在于以cgroups为底座的Container资源隔离机制,确保内存、CPU等硬性配额不被突破,从而避免作业间相互干扰。典型应用场景包括企业数据中台统一资源池建设、

weixin_34167819的博客 1512

yarn的原生web页面加载数据显示历史job列表缓慢

问题描述: yarn的原生web页面加载数据显示历史job列表缓慢 问题原因: 这是由于yarn提交的历史任务数量太大(接近1w)导致 解决方法 方法一: 在网上看到有人说有相关的配置,去官网上找了一下,应该是这个yarn的timeline时序数据库有关的配置,截图如下 这两个参数的翻译一下分别是: 时间轴存储区中最近读取的实体开始时间的缓存大小(以实体数为单位)默认为10000 时间线存储区中最近写入的实体开始时间的缓存大小(以实体数为单位)默认为10000 这里的实体entity应该就是job 官网配

jingyi1219的博客 913

YARN不是调度器,而是分布式操作系统内核

YARN是Hadoop生态中首个将计算资源抽象为可编程内核的分布式系统,其本质超越传统资源调度器,提供进程隔离、内存管控、故障自愈等操作系统级能力。它基于双层调度模型解耦全局资源仲裁(ResourceManager)与应用自治逻辑(ApplicationMaster),通过CGroups、Timeline Server、ZKRMStateStore等机制实现多租户安全与可观测性。在PB级数据平台实践中,YARN的配置偏差、内核参数冲突、版本契约断裂常导致Container OOM、AM注册失败、Timeli

weixin_30861797的博客 433

Hadoop生态全景解析:从HDFS/YARN到Spark/Flink的工程本质

分布式数据处理是现代大数据平台的核心能力,其底层依赖于可靠的分布式存储与智能资源调度。HDFS通过多副本与心跳机制实现统计级高可用,YARN解耦计算与存储资源,为Spark、Flink等引擎提供统一调度基础。MapReduce定义了‘移动计算而非数据’的范式,Spark以内存计算优化迭代任务,Flink则通过事件时间与状态管理实现真正流批一体。HBase弥补HDFS随机读写短板,Kafka承担高吞吐数据管道角色,Hive作为SQL翻译层降低使用门槛。这些组件并非孤立工具,而是围绕数据生命周期协同演进的有机系

weixin_33912453的博客 388

ZooKeeper节点数据量限制引起的Hadoop YARN ResourceManager崩溃原因分析

面试:你懂什么是分布式系统吗?Redis分布式锁都不会?>>> 环境 Hadoop版本:Apache Hadoop 2.6.3 ZooKeeper版本:ZooKeeper 3.4.10 两个ResourceManager节点:主节点RM01,从节点RM02 背景 最近有一次我们的Hadoop监控平台发出ResourceManager(以下简称RM)崩溃的报警信息,...

Viking的博客 2510

Cloudera CDP实战指南:HDFS可靠性、YARN调优与混合治理

Cloudera Data Platform(CDP)已超越传统Hadoop发行版,演进为面向企业数据治理的操作系统。其核心在于统一元数据管理、动态安全策略与存储计算解耦架构,支撑金融、制造等关键行业对高可用、强合规与弹性扩展的刚性需求。HDFS底层可靠性设计决定集群容灾能力,YARN资源调度真实瓶颈直接影响Spark作业稳定性;而CDP Public Cloud与Private Cloud的混合治理逻辑,则解决了多云/本地数据协同、租户隔离与联邦查询等现实挑战。本文聚焦生产级CDP部署、HDFS脑裂防控、

weixin_34294649的博客 320

ZooKeeper节点数据量限制引起的Hadoop YARN ResourceManager崩溃原因分析(二)

时隔五个月(点击阅读前文),如标题所示的问题再次发生,本次由于我们大数据监控系统的完善,让我对该问题进行了更深一步的研究。以下是整个排查过程和解决方案: 一、问题说明 从8月8日早上8点12收到第一条ResourceManager服务异常报警,截止到8月11日早上8点,每天早上8点到8点12之间频繁发生ResourceManager服务异常问题,晚上8点和下午1-3点偶尔出现该问题。以下是Spac...

Viking的博客 1756

【大数据入门核心技术-Hadoop】(六)Hadoop3.2.1高可用集群搭建

独立模式又称为单机模式,仅1个机器运行1个java进程,主要用于调试。伪分布模式也是在1个机器上运行HDFS的NameNode和DataNode、YARN的 ResourceManger和NodeManager,但分别启动单独的java进程,主要用于调试。单Namenode节点模式-高可用HA模式集群模式主要用于生产环境部署。会使用N台主机组成一个Hadoop集群。这种部署模式下,主节点和从节点会分开部署在不同的机器上。本教程主要安装 多Namenode 节点 高可用集群模式二、准备工作本高可用参考以上非高

3945

招聘数据分析全流程:Hadoop+爬虫+SpringBoot实现

大数据分析正在成为企业决策和人才市场洞察的核心能力,而数据采集、分布式存储与离线计算则是构建数据价值链条的基础。爬虫技术用于高效获取海量半结构化数据,Hadoop生态提供高容错的分布式存储与并行计算能力,通过MapReduce完成数据清洗、去重和特征提取,再结合SpringBoot构建Web服务,将分析结果以可视化方式呈现。这类技术组合广泛应用于招聘信息挖掘、行业薪资分析、技能需求图谱构建等场景,尤其适合需要处理多源异构数据的工程实践。本文基于招聘网站真实数据,完整拆解从爬虫采集、HDFS存储、MapRed

weixin_34006965的博客 375

【Hadoop】resourcemanager.recovery.RMStateStore: State store operation failed

一、背景 今天又碰见了一个很鬼的问题,yarn的ui上nodemanager都是active,而且资源也完全充足,但是我提交任务的时候就卡主了!而且是什么类型的任务都提交不了,相当于yarn的服务直接不可用,关键是什么参数都没有修改,也没有重启yarn服务,突然他就不行了 二、查问题 所以我第一反应是查看resourcemanager的日志(记得要查看active的那台) 结果我看到了 ERROR org.apache.hadoop.yarn.server.resourcemanager.r.

lsr40的博客 1489

Vue3 + OpenLayers 开发指南(一) - 环境搭建与基础配置

本文详细介绍了如何从零开始搭建Vue3与OpenLayers的集成开发环境。通过项目初始化、核心依赖安装、目录结构规划及基础配置,手把手引导开发者创建一个结构清晰、可维护的现代化WebGIS应用骨架,为后续添加地图图层和交互功能奠定坚实基础。

weixin_28049429的博客 339

Hadoop工程师校招笔试核心考点:从HDFS到MapReduce的实战剖析

在大数据技术体系中,Hadoop生态始终是分布式存储与计算的基础底座。无论你是备战校招的应届生,还是刚入门的数据开发者,理解HDFS的副本机制与NameNode元数据管理、掌握MapReduce作业的执行生命周期与Shuffle原理,都是构建扎实技术功底的关键。进一步地,YARN资源调度、Zookeeper高可用协调、Hive与Spark的联动应用,则构成了生产环境下的完整技术链路。本文结合爱奇艺Hadoop工程师笔试真题,从存储、计算、调度、协同等层面拆解高频考点,并融入数据倾斜、小文件、集群调优等真实场

weixin_34211761的博客 483

用Python和NumPy可视化理解波函数:从概率密度到薛定谔方程的可视化教程

本文通过Python和NumPy实现量子力学波函数的可视化,从概率密度到薛定谔方程的动态演化,帮助读者直观理解量子态的特性。教程涵盖无限深势阱、量子谐振子等模型,结合代码示例展示时间演化和期望值计算,为量子力学学习提供实用工具。

weixin_27303545的博客 226

Matlab中eig内置函数转为C语言

本文记录一下如何将MATLAB中的eig函数转为C语言,即通过C语言求解矩阵的特征值与特征向量。[V,D]=eig(Rx)中V为矩阵Rx的特征向量,D为矩阵的特征值。其中Rx维度为12*12的复矩阵。 首先在MATLAB端创建入口函数保存为eigvalue.m: 打开MATLAB Coder,添加入口函数: 3.在定义输入类型窗口中,需要添加输入数据来训练...

u011441044的博客 3515

Hadoop生态实战指南:从底层原理到电商全链路搭建

Hadoop生态并非孤立工具集合,而是围绕海量非结构化数据在廉价硬件上实现可靠存储、高效计算与实时服务的一整套工业级数据基础设施。其核心在于HDFS的分布式容错存储、YARN的统一资源调度、MapReduce奠定的批处理范式,以及Spark、Flink等引擎对延迟与一致性的分层优化。技术价值体现在解耦架构带来的资源复用性、跨组件协同形成的端到端数据闭环,以及面向业务场景(如实时风控、用户画像、OLAP分析)的精准能力匹配。本文以电商用户行为分析为典型场景,贯通Kafka接入、Flink实时处理、Hive数仓

weixin_33991418的博客 394

YOLOv11改进 | 上采样篇 | YOLOv11引入CARAFE上采样

在本文中,我们提出了一个通用、轻量级、高效的特征重组算子CARAFE来实现这一目标.CARAFE有几个吸引人的特性:(1)大视场。(2)内容感知处理。到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv11改进有效涨点专栏,本专栏目前为新开的,后期我会根据各种前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~大视场:不同于以往的方法(如双线性插值),CARAFE能够在更大的感受野内聚合上下文信息,从而捕获更丰富的语义信息。

tsg6698的博客 920

Zookeeper面试八股文:从数据模型到ZAB协议,一文通关

在分布式系统设计中,一致性协调是绕不开的基础问题。ZooKeeper作为经典的分布式协调组件,通过树形数据模型和会话机制提供可靠的状态管理,而ZAB协议则保证了集群写操作的顺序性与多数派确认,从根本上解决了Leader选举和崩溃恢复的一致性难题。Watcher机制让客户端能够实时感知节点变化,以通知替代轮询,支撑起分布式锁、配置中心、服务注册发现等典型场景。理解这些底层原理,不仅能应对生产环境中的集群部署与故障排查,也能帮助工程师在Hadoop HA、Kafka Controller等生态整合中游刃有余。本

weixin_34306593的博客 316

使用 MATLAB/Simulink + Simscape Electrical 来构建一个CCHP微电网与新能源协同运行的模型

随着能源需求的增长和对环境保护要求的提高,冷热电联供(Combined Cooling, Heating and Power, CCHP)系统作为一种高效的分布式能源解决方案,越来越受到关注。CCHP系统通过利用一次能源同时产生电力、制冷和供热,实现了能源的梯级利用,提高了能源使用效率。结合太阳能、风能等可再生能源,可以进一步增强系统的灵活性和环保性。本文将详细介绍如何使用来构建一个CCHP微电网与新能源协同运行的模型,并通过仿真分析其性能表现。本文介绍了如何使用构建一个。

xiaoheshang_123的博客 141

语音识别:PyAudio、SoundDevice、Vosk、openai-whisper、Argos-Translate、FunASR(Python)

本文介绍了Python中常用的音频处理库PyAudio,详细解析了其核心功能、核心概念和典型工作流程。PyAudio是一个跨平台的音频I/O库,支持音频录制、播放、实时流处理和低延迟操作。核心概念包括PyAudio类(管理音频设备和流)和Stream类(代表音频流)。文章重点讲解了open()方法的关键参数、回调函数的使用方式以及典型的工作流程,包括设备查询、流配置和资源释放。PyAudio适用于需要实时音频处理的场景,如语音识别和音频效果处理。

算法工程师 705
上一篇: 大压缩文件对Impala查询性能的影响
下一篇: Java反序列化与对象的创建
Viking_bird
博客等级 码龄11年 92粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值