关于yarn:yarn-install-命令行执行时背后发生的事情

在深刻解析 yarn install 命令行执行的背地过程之前,让咱们先对 Yarn 有一个根本的意识。Yarn 是一个古代的包管理工具,它为 JavaScript 社区提供了一个疾速、牢靠、平安的形式来治理我的项目依赖。从 Yarn 的初衷来看,它旨在解决 npm(Node Package Manager)在解决大型项目、依赖治理以及装置速度方面的一些问题。 当你在我的项目目录下执行 yarn install 命令时,Yarn 会经验几个要害的步骤来确保依赖被正确装置,这个过程涵盖了解析依赖、查找、下载以及链接这些依赖包。接下来,我将具体解释这一过程的每个步骤,并举例说明。 1. 解析 package.json 文件首先,Yarn 会读取我的项目根目录下的 package.json 文件。这个文件是一个 JSON 格局的文档,列出了我的项目的依赖(包含间接依赖和开发依赖)、版本号、脚本命令等信息。Yarn 通过解析这个文件来确定须要装置哪些包以及这些包的版本束缚。 2. 查看 .yarnrc 和 .npmrc 配置文件Yarn 还会查看我的项目目录或用户主目录下的 .yarnrc 和 .npmrc 文件,这些文件蕴含了包管理器的配置选项,如代理设置、镜像源地址等。这些配置能够影响 Yarn 的行为,比方它会从哪个源下载包。 3. 生成 yarn.lock 文件如果是首次运行 yarn install 或者 package.json 中的依赖有更新,Yarn 会生成(或更新)一个 yarn.lock 文件。这个文件锁定了我的项目依赖的具体版本,确保了团队成员之间装置的依赖一致性,防止了“在我的机器上能够运行”的问题。 4. 解析依赖Yarn 会依据 package.json 和 yarn.lock (如果存在)中的信息,解析出须要装置的所有依赖及其版本。在这个过程中,Yarn 会计算依赖树,确定哪些包是间接依赖,哪些包是间接依赖。 5. 查找并下载依赖接下来,Yarn 会查问本地缓存,看看所需的包版本是否曾经下载过。如果缓存中没有,Yarn 则会从近程仓库(如 npm 官网仓库或配置的镜像源)下载包到本地缓存。这一步骤是并发执行的,大大放慢了依赖的下载速度。 6. 链接依赖下载实现后,Yarn 会将这些包从本地缓存复制到 node_modules 目录,并依据依赖关系进行链接。这个步骤确保了我的项目代码能够正确地援用到装置的包。 ...

March 1, 2024 · 1 min · jiezi

关于yarn:Cesium加载广告牌三

Cesium加载广告牌(三)加载实现广告牌之后,如何对广告牌进行操作?这里实现鼠标左键点击获取广告牌信息的性能。 在加载广告牌的过程中,曾经对广告牌进行了许多属性的设置,然而并没有对广告牌的惟一值进行标准。设置惟一值并不是在billboard的属性内设置,而是在外层的Entity内进行申明。同时Entity中也有name属性。这里须要留神的是id是惟一值,不能与其余id值雷同,name能够。 let bill = new Cesium.Entity({ id:"200222", position: new Cesium.Cartesian3.fromDegrees(120.62521517, 31.42803100), billboard: { image: "./img/laboratory.png", horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.BOTTOM, scale: 1, scaleByDistance: new Cesium.NearFarScalar(30000, 1, 45000, 0.4), heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, disableDepthTestDistance: Number.POSITIVE_INFINITY, }})这里有一点须要强调,代买只是申明了一个Entity实例,并没有进行增加,因而须要将Entity增加仅viewer实体中才能够应用。 viewer.entities.add(bill)如果写成 viewer.entities.add({})模式,就不须要额定增加。 增加实现后须要写入点击事件。 let handlerPoint = new Cesium.ScreenSpaceEventHandler(window.viewer.scene.canvas); handlerPoint.setInputAction(function(event) {},Cesium.ScreenSpaceEventType.LEFT_CLICK)在点击事件外面采纳viewer.scene.pick()办法,通过坐标地位,拾取实体(Entity),图元(Primitive),3DTiles对象,返回的是scene中指定地位最上层的对象。例如点击获取Entity的pick对象,通过pick.id能够拾取以后的entity对象。拾取后,能够用于扭转对象的属性参数,如色彩,图片等。 let handlerPoint = new Cesium.ScreenSpaceEventHandler(window.viewer.scene.canvas); handlerPoint.setInputAction(function(event) { const pick = window.viewer.scene.pick(event.position); console.log(pick)},Cesium.ScreenSpaceEventType.LEFT_CLICK)这里的pick中就存储了广告牌的信息,而后依据获取的广告牌的id不同,能够进行接下来的其余操作。

April 22, 2023 · 1 min · jiezi

关于yarn:深入浅出-Yarn-架构与实现61-NodeManager-功能概述

本节开始将对 Yarn 中的 NodeManager 服务进行分析。NodeManager 须要在每个计算节点上运行,与 ResourceManager 和 ApplicationMaster 进行交互。治理节点的计算资源以及调度容器。后续将对 NM 的性能职责、状态机、容器生命周期和资源隔离等方面进行解说。本篇将从整体上对 NM 进行介绍。 一、NodeManager 根本职能在 Hadoop 集群中,每个计算节点都须要有一个治理服务,其就是 NodeManager(NM)。它负责与 ResourceManager 放弃通信,治理 Container 的生命周期,监控每个 Container 的资源应用状况,追踪节点健康状况,治理日志等。主要职责: 放弃与 ResourceManager 同步跟踪节点的健康状况治理节点各个 Container 的生命周期,监控每个 Container 的资源应用状况治理分布式缓存(对 Container 所需的 Jar,库文件的本地文件系统缓存)治理各个 Container 生成日志整体来说,NM 通过两个 RPC 协定与 RM 和 AM 交互,如下图所示。 一)与 RM 交互通过 ResourceTrackerProtocol 协定: NM 通过该 RPC 协定向 RM 注册、汇报节点健康状况和 Container 运行状态;支付 RM 下达的命令,包含从新初始化、清理 Container 占用资源等。在该协定中,RM 表演 RPC server 的角色,而 NM 表演 RPC Client 的角色(由外部组件 NodeStatusUpdater 实现)。NM 与 RM 之间采纳 「pull 模型」,NM 总是周期性地被动向 RM 发动申请,并支付下达给本人的命令。 ...

March 31, 2023 · 2 min · jiezi

关于yarn:深入浅出-Yarn-架构与实现46-RM-行为探究-申请与分配-Container

本大节介绍应用程序的 ApplicationMaster 在 NodeManager 胜利启动并向 ResourceManager 注册后,向 ResourceManager 申请资源(Container)到获取到资源的整个过程,以及 ResourceManager 外部波及的次要工作流程。 一、整体流程整个过程可看做以下两个阶段的送代循环: 阶段1 ApplicationMaster 汇报资源需要并支付曾经调配到的资源;阶段2 NodeManager 向 ResourceManager 汇报各个 Container 运行状态,如果 ResourceManager 发现它下面有闲暇的资源,则进行一次资源分配,并将调配的资源保留到对应的 应用程序数据结构中,期待下次 ApplicationMaster 发送心跳信息时获取(即阶段1)。一)AM 汇报心跳1、ApplicationMaster 通过 RPC 函数 ApplicationMasterProtocol#allocate 向 ResourceManager 汇报资源需要(因为该函数被周期性调用,咱们通常也称之为“心跳”),包含新的资源需要形容、待开释的 Container 列表、申请退出黑名单的节点列表、申请移除黑名单的节点列表等。 public AllocateResponse allocate(AllocateRequest request) { // Send the status update to the appAttempt. // 发送 RMAppAttemptEventType.STATUS_UPDATE 事件 this.rmContext.getDispatcher().getEventHandler().handle( new RMAppAttemptStatusupdateEvent(appAttemptId, request.getProgress())); // 从 am 心跳 AllocateRequest 中取出新的资源需要形容、待开释的 Container 列表、黑名单列表 List<ResourceRequest> ask = request.getAskList(); List<ContainerId> release = request.getReleaseList(); ResourceBlacklistRequest blacklistRequest = request.getResourceBlacklistRequest(); // 接下来会做一些查看(资源申请量、label、blacklist 等) // 将资源申请宰割(动静调整 container 资源量) // Split Update Resource Requests into increase and decrease. // No Exceptions are thrown here. All update errors are aggregated // and returned to the AM. List<UpdateContainerRequest> increaseResourceReqs = new ArrayList<>(); List<UpdateContainerRequest> decreaseResourceReqs = new ArrayList<>(); List<UpdateContainerError> updateContainerErrors = RMServerUtils.validateAndSplitUpdateResourceRequests(rmContext, request, maximumCapacity, increaseResourceReqs, decreaseResourceReqs); // 调用 ResourceScheduler#allocate 函数,将该 AM 资源需要汇报给 ResourceScheduler // (理论是 Capacity、Fair、Fifo 等理论指定的 Scheduler 解决) allocation = this.rScheduler.allocate(appAttemptId, ask, release, blacklistAdditions, blacklistRemovals, increaseResourceReqs, decreaseResourceReqs);}2、ResourceManager 中的 ApplicationMasterService#allocate 负责解决来自 AM 的心跳申请,收到该申请后,会发送一个 RMAppAttemptEventType.STATUS_UPDATE 事件,RMAppAttemptImpl 收到该事件后,将更新应用程序执行进度和 AMLivenessMonitor 中记录的应用程序最近更新工夫。3、调用 ResourceScheduler#allocate 函数,将该 AM 资源需要汇报给 ResourceScheduler,理论是 Capacity、Fair、Fifo 等理论指定的 Scheduler 解决。以 CapacityScheduler#allocate 实现为例: ...

March 1, 2023 · 3 min · jiezi

关于yarn:深入浅出-Yarn-架构与实现45-RM-行为探究-启动-ApplicationMaster

本节开始,将对 ResourceManager 中一些常见行为进行剖析探索,看某些具体要害的行为,在 RM 中是如何流转的。本节将深刻源码探索「启动 ApplicationMaster」的具体流程。 一、整体流程本大节介绍从应用程序提交到启动 ApplicationMaster 的整个过程,期间波及 Client、RMService、 RMAppManager、RMApplmpl、RMAppAttemptImpl、RMNode、ResourceScheduler 等几个次要组件。当客户端调用 RPC 函数 ApplicationClientProtocol#submitApplication 后, ResourceManager 端的处理过程如下图所示。 二、具体流程剖析接下来追随下面的流程图,咱们深刻源码具体分析每一步都是如何执行的:最开始由客户端发动工作提交 submitApplication(),通过 ClientRMService 和 RMAppManager 发送 RMAppEventType.START 事件,之后交由 RMAppImpl 解决。 protected void submitApplication( ApplicationSubmissionContext submissionContext, long submitTime, String user) throws YarnException { ApplicationId applicationId = submissionContext.getApplicationId(); RMAppImpl application = createAndPopulateNewRMApp(submissionContext, submitTime, user, false); Credentials credentials = null; try { credentials = parseCredentials(submissionContext); if (UserGroupInformation.isSecurityEnabled()) { this.rmContext.getDelegationTokenRenewer() .addApplicationAsync(applicationId, credentials, submissionContext.getCancelTokensWhenComplete(), application.getUser()); } else { // Dispatcher is not yet started at this time, so these START events // enqueued should be guaranteed to be first processed when dispatcher // gets started. // 这里发送 RMAppEventType.START 事件 this.rmContext.getDispatcher().getEventHandler() .handle(new RMAppEvent(applicationId, RMAppEventType.START)); }RMAppImpl 这货色是个状态机,收到事件之后会本人转换状态并且解决相应的逻辑。(状态机还不相熟的同学,可翻到我后面的文章进行学习《2-4 Yarn 根底库 - 状态机库》) ...

February 28, 2023 · 4 min · jiezi

关于yarn:yarn-换源后不生效

问题重现明天克隆下来 GitHub 上的一个我的项目装置依赖时后面的十分快(因为是从 cached 里有),最初一个却怎么也 fetch 不下来,卡在了 fetching package 问题尝试通过 --verbose 参数发现包是从 https://registry.yarnpkg.com/ 下载的,然而配置的源是 https://registry.npmmirror.com/,清理 cache yarn cache clean清理实现后从新 yarn 发现所有的包都是从官网源下载,速度极慢 问题解决通过 vscode 的搜寻性能发现,yarn.lock 文件内定义依赖的 resolved 全副是官网源,于是应用 Ctrl + F 将所有的官网源全副替换为国内镜像源,问题解决

November 19, 2022 · 1 min · jiezi

关于yarn:深入浅出-Yarn-架构与实现24-Yarn-基础库-状态机库

当一个服务领有太多解决逻辑时,会导致代码构造异样的凌乱,很难分辨一段逻辑是在哪个阶段发挥作用的。这时就能够引入状态机模型,帮忙代码构造变得清晰。 一、状态机库概述一)简介状态机由一组状态组成:【初始状态 -> 中间状态 -> 最终状态】。在一个状态机中,每个状态会接管一组特定的事件,依据事件类型进行解决,并转换到下一个状态。当转换到最终状态时则退出。 二)状态转换形式状态间转换会有上面这三种类型: 三)Yarn 状态机类在 Yarn 中提供了一个工厂类 StateMachineFactory 来帮忙定义状态机。如何应用,咱们间接写个 demo。<img src="https://cdn.nlark.com/yuque/0/2022/png/21670600/1665737645204-cf813e7c-20a1-43bf-ac2a-5b65f05ceb7e.png" alt="image.png" style="zoom:67%;" /> 二、案例 demo在上一篇文章《Yarn 服务库和事件库》案例根底上进行扩大,减少状态机库的内容。如果还不理解服务库和事件库的同学,倡议先学习下上一篇文章。案例已上传至 github,有帮忙能够点个 ⭐️https://github.com/Simon-Ace/hadoop-yarn-study-demo/tree/master/state-demo 一)状态机实现状态机实现,能够间接嵌入到上篇文章中的 AsyncDispatcher应用。这里仅给出状态机JobStateMachine以及各种事件处理的代码。残缺的代码我的项目执行,请到 github demo 中查看。 import com.shuofxz.event.JobEvent;import com.shuofxz.event.JobEventType;import org.apache.hadoop.yarn.event.EventHandler;import org.apache.hadoop.yarn.state.*;import java.util.EnumSet;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;/** 可参考 Yarn 中实现的状态机对象:* ResourceManager 中的 RMAppImpl、RMApp- AttemptImpl、RMContainerImpl 和 RMNodeImpl,* NodeManager 中 的 ApplicationImpl、 ContainerImpl 和 LocalizedResource,* MRAppMaster 中的 JobImpl、TaskImpl 和 TaskAttemptImpl 等* */@SuppressWarnings({"rawtypes", "unchecked"})public class JobStateMachine implements EventHandler<JobEvent> { private final String jobID; private EventHandler eventHandler; private final Lock writeLock; private final Lock readLock; // 定义状态机 protected static final StateMachineFactory<JobStateMachine, JobStateInternal, JobEventType, JobEvent> stateMachineFactory = new StateMachineFactory<JobStateMachine, JobStateInternal, JobEventType, JobEvent>(JobStateInternal.NEW) .addTransition(JobStateInternal.NEW, JobStateInternal.INITED, JobEventType.JOB_INIT, new InitTransition()) .addTransition(JobStateInternal.INITED, JobStateInternal.SETUP, JobEventType.JOB_START, new StartTransition()) .addTransition(JobStateInternal.SETUP, JobStateInternal.RUNNING, JobEventType.JOB_SETUP_COMPLETED, new SetupCompletedTransition()) .addTransition(JobStateInternal.RUNNING, EnumSet.of(JobStateInternal.KILLED, JobStateInternal.SUCCEEDED), JobEventType.JOB_COMPLETED, new JobTasksCompletedTransition()) .installTopology(); private final StateMachine<JobStateInternal, JobEventType, JobEvent> stateMachine; public JobStateMachine(String jobID, EventHandler eventHandler) { this.jobID = jobID; // 多线程异步解决,state 有可能被同时读写,应用读写锁来防止竞争 ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); this.readLock = readWriteLock.readLock(); this.writeLock = readWriteLock.writeLock(); this.eventHandler = eventHandler; stateMachine = stateMachineFactory.make(this); } protected StateMachine<JobStateInternal, JobEventType, JobEvent> getStateMachine() { return stateMachine; } public static class InitTransition implements SingleArcTransition<JobStateMachine, JobEvent> { @Override public void transition(JobStateMachine jobStateMachine, JobEvent jobEvent) { System.out.println("Receiving event " + jobEvent); // do something... // 实现后发送新的 Event —— JOB_START jobStateMachine.eventHandler.handle(new JobEvent(jobStateMachine.jobID, JobEventType.JOB_START)); } } public static class StartTransition implements SingleArcTransition<JobStateMachine, JobEvent> { @Override public void transition(JobStateMachine jobStateMachine, JobEvent jobEvent) { System.out.println("Receiving event " + jobEvent); jobStateMachine.eventHandler.handle(new JobEvent(jobStateMachine.jobID, JobEventType.JOB_SETUP_COMPLETED)); } } public static class SetupCompletedTransition implements SingleArcTransition<JobStateMachine, JobEvent> { @Override public void transition(JobStateMachine jobStateMachine, JobEvent jobEvent) { System.out.println("Receiving event " + jobEvent); jobStateMachine.eventHandler.handle(new JobEvent(jobStateMachine.jobID, JobEventType.JOB_COMPLETED)); } } public static class JobTasksCompletedTransition implements MultipleArcTransition<JobStateMachine, JobEvent, JobStateInternal> { @Override public JobStateInternal transition(JobStateMachine jobStateMachine, JobEvent jobEvent) { System.out.println("Receiving event " + jobEvent); // 这是多后果状态局部,因而须要人为制订后续状态 // 这里整个流程完结,设置一下对应的状态 boolean flag = true; if (flag) { return JobStateInternal.SUCCEEDED; } else { return JobStateInternal.KILLED; } } } @Override public void handle(JobEvent jobEvent) { try { // 留神这里为了防止动态条件,应用了读写锁 writeLock.lock(); JobStateInternal oldState = getInternalState(); try { getStateMachine().doTransition(jobEvent.getType(), jobEvent); } catch (InvalidStateTransitionException e) { System.out.println("Can't handle this event at current state!"); } if (oldState != getInternalState()) { System.out.println("Job Transitioned from " + oldState + " to " + getInternalState()); } } finally { writeLock.unlock(); } } public JobStateInternal getInternalState() { readLock.lock(); try { return getStateMachine().getCurrentState(); } finally { readLock.unlock(); } } public enum JobStateInternal { NEW, SETUP, INITED, RUNNING, SUCCEEDED, KILLED }}二)状态机可视化hadoop 中提供了状态机可视化的工具类 VisualizeStateMachine.java,能够拷贝到咱们的工程中应用。依据提醒,运行须要三个参数: ...

November 1, 2022 · 3 min · jiezi

关于yarn:Yarn高可用集群

批改配置文件yarn-site.xml: <?xml version="1.0"?><!-- Licensed 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. See accompanying LICENSE file.--><configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 启用 resourcemanager ha --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!-- 申明 resourcemanager 的地址 --> <property> <name>yarn.resourcemanager.cluster-id</name> <value>cluster-yarn1</value> </property> <!--指定 resourcemanager 的逻辑列表--> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2,rm3</value> </property><!-- ========== rm1 的配置 ========== --> <!-- 指定 rm1 的主机名 --> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>hadoop-4</value> </property><!-- 指定 rm1 的 web 端地址 --><property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>hadoop-4:8088</value></property><!-- 指定 rm1 的外部通信地址 --><property> <name>yarn.resourcemanager.address.rm1</name> <value>hadoop-4:8032</value></property><!-- 指定 AM 向 rm1 申请资源的地址 --><property><name>yarn.resourcemanager.scheduler.address.rm1</name> <value>hadoop-4:8030</value></property><!-- 指定供 NM 连贯的地址 --> <property> <name>yarn.resourcemanager.resource-tracker.address.rm1</name> <value>hadoop-4:8031</value></property><!-- ========== rm2 的配置 ========== --> <!-- 指定 rm2 的主机名 --> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>hadoop-5</value></property><property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>hadoop-5:8088</value></property><property> <name>yarn.resourcemanager.address.rm2</name> <value>hadoop-5:8032</value></property><property> <name>yarn.resourcemanager.scheduler.address.rm2</name> <value>hadoop-5:8030</value></property><property> <name>yarn.resourcemanager.resource-tracker.address.rm2</name> <value>hadoop-5:8031</value></property><!-- ========== rm3 的配置 ========== --><!-- 指定 rm1 的主机名 --> <property> <name>yarn.resourcemanager.hostname.rm3</name> <value>hadoop-6</value></property><!-- 指定 rm1 的 web 端地址 --><property> <name>yarn.resourcemanager.webapp.address.rm3</name> <value>hadoop-6:8088</value></property><!-- 指定 rm1 的外部通信地址 --><property> <name>yarn.resourcemanager.address.rm3</name><value>hadoop-6:8032</value></property><!-- 指定 AM 向 rm1 申请资源的地址 --><property> <name>yarn.resourcemanager.scheduler.address.rm3</name> <value>hadoop-6:8030</value></property><!-- 指定供 NM 连贯的地址 --> <property> <name>yarn.resourcemanager.resource-tracker.address.rm3</name> <value>hadoop-6:8031</value></property> <!-- 指定 zookeeper 集群的地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>hadoop-4:2181,hadoop-5:2181,hadoop-6:2181</value> </property> <!-- 启用主动复原 --> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <!-- 指定 resourcemanager 的状态信息存储在 zookeeper 集群 --> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value></property><!-- 环境变量的继承 --><property> <name>yarn.nodemanager.env-whitelist</name> <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value> </property><!--日志汇集--> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property><!--日志汇集服务器地址--> <property> <name>yarn.log.server.url</name> <value>http://hadoop-4:19888/jobhistory/logs</value> </property><!--日志保留工夫--> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>6048000</value> </property></configuration>获取yarn集群状态:yarn rmadmin -getServiceState rm1启动hadoop集群:start-all.sh ...

October 30, 2022 · 2 min · jiezi

关于yarn:Yarn命令

0.yarn top;查看yarn资源耗费状况 1.yarn application -list;查看所有正在运行的app 2.yarn logs -applicationId appId;查看工作运行日志 3.yarn application -list -appStates;查看不同状态的app 1. ALL NEW2. NEW_SAVING3. SUBMITTED4. ACCEPTED5. RUNNING6. FINISHED7. FAILED8. KILLED

August 19, 2022 · 1 min · jiezi

关于yarn:wallys2x4×4-or-8×8-11AX-MUMIMO-DUAL-CONCURRENT-EMBEDDEDBOARD

2x(4×4 or 8×8) 11AX MU-MIMO DUAL CONCURRENT EMBEDDEDBOARD DR8074A(HK01) IPQ8074A 4x4 2.4G 8x8 5G 802.11ax IPQ8074A 4x4 2.4G 8x8 5G 802.11ax MT7915/MT 7975/IPQ6000/IPQ6018/IPQ6010/IPQ4019/IPQ4029/ipq4018/IPQ8072/IPQ8074/QCN9074/QCN9072/QCN9024/IPQ5018/BY:Wallys Communications (Suzhou ) Co., LTDEMAIL:sales3@wallystech.com Wallys Communications (SuZhou) Co., Ltd., http://www.wallystech.com,which is a professional supplier specializing in product design, manufacturing and offering superior OEM/ODM/JDM services in wireless communications. As a specialized manufacturer and exporter for these products in China,We sincerely hope to establish business relations with your esteemed corporation. We mainly develop high power wireless products based on Quacomm chip such asIPQ6000/IPQ6018/IPQ6010/IPQ4019/IPQ4029/IPQ8072/IPQ8074/QCN9074 and so on . Product Description 8074A(HK01) based on IPQ8074A chipset is an enterprise wireless module integrated with2×2 5G high power Radio module and 2×2 2.4G high power Radio module designedspecifically to provide users with mobile access to high-bandwidth video streaming, voice, anddata transmission for office and challenging RF environment in factories, warehousesestablishment. ...

June 29, 2022 · 2 min · jiezi

关于yarn:npm问题集

短少python编译环境gyp verb could not find "python". checking python launcher解决形式:yarn global add --production windows-build-tools 全局装置编译该工具

May 13, 2022 · 1 min · jiezi

关于yarn:npx-yarn-create-npm-init

TL;DR: npx xxx yarn create npm init 以 create-react-app 为例, 文档提供三种创立应用程序的计划: npx create-react-app my-appnpm init react-app my-appyarn create react-app my-app都好用,为啥呢? npxNPM (Node Package Manager) and NPX (Node Package Executor) NPX 是包的执行器。试一下~ // npx cowsay 亖混子npx: 41 装置胜利,用时 6.739 秒 _______________< 亖混子 > --------------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || ||用处一、以简短的形式执行本地包的命令 若执行我的项目依赖包的执行文件,须要键入以下内容:$ ./node_modules/.bin/jest ; 若应用 npx 将会十分简洁 $ npx jest 用处二、 一次性执行全局模块命令 有些全局包如 create-react-app 应用频率低,在须要时用 npx 即可 。比照全局装置,可保障应用最新版本 ...

January 28, 2022 · 1 min · jiezi

关于yarn:yarn的安装与使用

一、yarn 是什么?yarn 也是一个软件包管理系统,同样用于治理 用 JavaScript 编写的软件包,yarn 的呈现是为了补救 npm 的一些缺点。yarn 与 npm 的区别,看这里! 二、装置 yarn 到我的项目中# 1、装置全局yarn(这样任何目录都能够应用yarn) npm install -g yarn# 2、切换到我的项目目录 cd ~/path/to/project# 3、我的项目应用的版本(berry是我的项目代号,示意是2.0之后最新版本) yarn set version berry# 4、初始化 yarn yarn init # 5、装置我的项目所有依赖的js包 yarn # 或 yarn install三、更新 yarn 到最新版本yarn set version latest四、yarn 的命令# 查看所有命令 yarn help# 初始化,主动创立yarn运行必备文件 yarn init# 装置我的项目依赖的所有js包 yarn # 或 yarn install# 装置指定js包 yarn add [package] yarn add [package]@[version] yarn add [package]@[tag]# 更新指定js包 yarn up [package] yarn up [package]@[version] yarn up [package]@[tag]# 删除指定js包 yarn remove [package]五、参考链接yarn的装置与应用!

November 26, 2021 · 1 min · jiezi

关于yarn:yarn-安装依赖报错

yarn装置报错报错信息 error C:\Users\Acer\Desktop\react\node_modules\gifsicle: Command failed.Exit code: 1Command: node lib/install.jsArguments:Directory: C:\Users\Acer\Desktop\react\node_modules\gifsicleOutput:‼ getaddrinfo ENOENT raw.githubusercontent.com ‼ gifsicle pre-build test failed i compiling from source × Error: Command failed: C:\WINDOWS\system32\cmd.exe /s /c "autoreconf -ivf"'autoreconf' ���������ⲿ������ǿ����ij���网上百度,发现比拟少人遇到这个问题,感觉应该是本人本地环境有些问题,那有可能是本人本地环境有问题,而后就狐疑是本人装的yarn版本或者node版本不对,或者本人网络不好之类的,瞎猜,还从新把包删了重装之类,都没用,无头苍蝇。 其实问题还是本人教训太少了,记录一下,不便本人当前排查bug 首先程序报错了,不要慌,咱们应该先看报错信息,看下面信息说的是C:\Users\Acer\Desktop\react\node_modules\gifsicle这个文件夹上面的lib/install.js这个脚本外面有命令执行失败了,具体什么问题还不分明,所以应该去找到这个文件去看一下 install.js 'use strict';const path = require('path');const binBuild = require('bin-build');const log = require('logalot');const bin = require('.');(async () => { try { await bin.run(['--version']); log.success('gifsicle pre-build test passed successfully'); } catch (error) { log.warn(error.message); log.warn('gifsicle pre-build test failed'); log.info('compiling from source'); const config = [ './configure --disable-gifview --disable-gifdiff', `--prefix="${bin.dest()}" --bindir="${bin.dest()}"` ].join(' '); try { await binBuild.file(path.resolve(__dirname, '../vendor/source/gifsicle-1.92.tar.gz'), [ 'autoreconf -ivf', config, 'make install' ]); log.success('gifsicle built successfully'); } catch (error) { log.error(error.stack); // eslint-disable-next-line unicorn/no-process-exit process.exit(1); } }})();从这个文件中找一下,看看有没有本人能看懂,或者感觉有问题的,有的,就是这个gifsicle pre-build test failed,终端报错信息中就有这个,所以应该是bin.run(['--version'])这行代码有问题导致产生了这个报错,持续找,bin是require('.')引入进来的,对应的应该是同目录下的index.js,所以应该去看index.js文件的内容 ...

October 1, 2021 · 1 min · jiezi

关于yarn:your-network-connection-Retrying

生产服务器呈现问题: /data/cc/jenkins/workspace/workspace/new_ccas/ccas-ui+ yarnyarn install v1.22.11warning package-lock.json found. Your project contains lock files generated by tools other than Yarn. It is advised not to mix package managers in order to avoid resolution inconsistencies caused by unsynchronized lock files. To clear this warning, remove package-lock.json.[1/4] Resolving packages...[2/4] Fetching packages...info There appears to be trouble with your network connection. Retrying...info There appears to be trouble with your network connection. Retrying...info There appears to be trouble with your network connection. Retrying...info There appears to be trouble with your network connection. Retrying...error An unexpected error occurred: "https://registry.npmjs.org/@xview-ui/admin-core/-/admin-core-2.0.0.tgz: tunneling socket could not be established, cause=connect ECONNREFUSED 127.0.0.1:1080".而后通过:通过 yarn config get registry 确认,没有设置淘宝镜像。 ...

September 10, 2021 · 1 min · jiezi

关于yarn:升级Yarn-2摆脱nodemodules

node我的项目中最臭名远扬的莫过于node_modules文件夹,这个蹩脚的构造动辄使你的文件数目减少几万甚至几十万,无论是装置还是删除,都要耗费大量工夫,并且占据大量inode结点,咱们轻易进入一个react我的项目文件夹,看一下因为有node_modules会使你的我的项目中的文件个数变成多少: $ find . -type f | wc -l223629仅仅一个我的项目上面就有多达22万个文件。 当初咱们来看一下目前的yarn版本号是多少: $ yarn --version1.22.11嗯,目前yarn的版本号是1.22.11,那咱们如何装置yarn 2呢?答案是不须要装置,只须要设置就能够了。 $ yarn set version berry设置完了之后,咱们再来看一下yarn的版本号: $ yarn --version3.0.0不是说好的降级到yarn 2吗?怎么变成3.0了?不必恐慌,越高越好。 而后咱们来看一下我的项目文件夹下多了这么几个文件,首先就是根目录下多了一个.yarnrc.yml,外面只有一句话: yarnPath: .yarn/releases/yarn-berry.cjs相应的,还多了一个文件夹.yarn,外面有一个子文件夹releases,外面有一个文件yarn-berry.cjs,这几个文件就是全副yarn 2减少的内容了,这些内容不要在.gitignore里疏忽,其它的内容是须要疏忽的,当初咱们来在.gitignore里减少一些须要疏忽的内容: /node_modules/.pnp.pnp.js.pnp.cjs.yarn/cache.yarn/unplugged.yarn/install-state.gz接下来,咱们筹备利用新版的yarn装置咱们的依赖文件,在此之前,咱们须要先设置一下yarn库的镜像服务器以放慢整个下载过程: $ yarn config set npmRegistryServer https://registry.npm.taobao.org这时候,你再关上我的项目根目录下的.yarnrc.yml文件,会发现外面多了一行: npmRegistryServer: 'https://registry.npm.taobao.org'yarnPath: .yarn/releases/yarn-berry.cjs所以咱们晓得其实这个yarn config命令也没有什么特地的中央,只是通过它来批改.yarnrc.yml文件而已,你也能够通过间接批改.yarnrc.yml文件来达到同样的成果。 当初,咱们开始删除旧的node_modules文件夹和yarn.lock文件,并重建整个我的项目: $ rm -rf node_modules$ rm -f yarn.lock$ yarn整个下载过程应该还是比较顺利的,咱们来看一下我的项目文件夹中多了哪些文件: .yarn/cache.yarn/unplugged.pnp没有了node_modules文件夹,咱们来看一下.yarn/cache文件夹下有什么内容,外面有咱们之前依赖的node_modules文件夹下的所有依赖包,但不再是以目录的模式存在,而是变成了一个个zip文件,yarn 2就是利用我的项目根目录下的.pnp.cjs文件定位到这些zip文件以达到取代node_modules的作用,这样极大水平地缩小了我的项目中的文件个数。 上面咱们开始启动我的项目: yarn start十有八九你的我的项目这时候是启动不起来的,不要慌,这篇文章通知你所有的解决办法。 首先,你遇到谬误可能是这样: Error: Your application tried to access terser-webpack-plugin, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound.具体内容可能不一样,但你要留神这个关键词Your application,这阐明是你的代码当中的某个地位援用了前面的插件,但你没有在package.json文件中显式申明它,那为什么之前用yarn 1或者npm的时候没有这个问题呢?因为以前是有node_modules文件夹的,所有依赖包都被平摊在这个文件夹中,即便是被其它依赖的依赖引入的,它也会被开释在node_modules根目录下,所以node能够很轻松地找到它,而当初这个文件夹没有了,咱们必须显式地在package.json文件中援用它,能力疏导yarn找到这个依赖项。因而,解决这种Your application不足某个依赖项的办法很简略,咱们只须要用yarn装置它就能够了: ...

August 16, 2021 · 1 min · jiezi

关于yarn:yarnnpmcnpm-命令

yarn、npm、cnpm 命令 // 装置依赖到开发环境yarn add xxxnpm install xxx --save// 装置依赖到生产环境yarn add xxx -Dnpm install xxx --save-dev// 装置依赖到全局yarn global add xxxnpm install xxx -g// 更新依赖到某版本yarn upgrade xxx@v1.1.0npm install xxx@v1.1.0// 更新依赖到最新版本yarn upgrade --latest// 删除依赖yarn remove xxxnpm uninstall xxx// 运行scripts脚本 yarn run dev npm run dev// 查看版本yarn -vnpm -v// 列出所有依赖yarn listnpm list

July 26, 2021 · 1 min · jiezi

关于yarn:使用yarn构建离线nodemodules镜像

1、装置yarn npm install -g yarn2、⾸先咱们须要设置⼀个⽬录作为咱们的“离线镜像”存储,咱们能够通过yarn config 命令来实现 yarn config set yarn-offline-mirror ./npm-packages-offline-cache之后会在以后项⽬门路⽣成⼀个npm-packages-offline-cache ⽂件夹⽤来寄存构建的.tgz离线⽂件 3、挪动配置⽂件到项⽬门路,以便离线镜像仅⽤于此项⽬ mv ~/.yarnrc ./4、删除之前的node_modules和yarn.lock并从新构建 yarn install构建胜利后在npm-packages-offline-cache能看到.tgz压缩⽂件 5、离线装置node_modules yarn install --offlline离线装置中途可能会报错,其实是执⾏某些脚本时须要更新,然而因为是离线,⽆法更新,可疏忽,在有⽹络条件下不会呈现该状况。 在理论项⽬中只须要咱们曾经构建好的npm-packages-offline-cache、yarn.lock、.yarnrc ,而后执⾏离线构建命令即可代替原来的npm install操作。

July 18, 2021 · 1 min · jiezi

关于yarn:Monorepo-中的任务调度机制

前言Monorepo 中的一个我的项目称为 project,对 project 进行的具体操作称为工作 task,比方 build 或 test,能够广义地了解为 npm scripts 中注册的操作,Monorepo 管理工具该当有能力调度这些工作。 先看一个 ,如上图所示,存在一个依赖关系较为简单的 Monorepo,此时须要执行某个工作,例如 build,如何同时保障工作执行程序以及工作执行效率(假如最大工作并行数为 N)? 接下来就是枯燥乏味的做题过程,咱们先把下面那张我的项目依赖图形象成代码。 问题interface Project { name: string; actions: { name: string; fn: () => Promise<void> }[]; dependencyProjects: Project[];}const sleep = (s: number): Promise<void> => new Promise((r) => setTimeout(r, s));// Monorepo 中注册的所有我的项目const projects: Project[] = [ "@monorepo/a", "@monorepo/b", "@monorepo/c", "@monorepo/d", "@monorepo/x", "@monorepo/y", "@monorepo/z",].map((name) => ({ name, actions: [{ name: "build", fn: () => sleep(Math.random() * 1000) }], dependencyProjects: [],}));const [A, B, C, D, X, Y, Z] = projects;A.dependencyProjects = [B];B.dependencyProjects = [D];C.dependencyProjects = [D, X, Y];X.dependencyProjects = [Y, Z];/** * 实现本办法,使得 build 行为依照正确的程序执行,且保障执行效率 * @param projects 须要执行工作的 project 汇合 * @param actionName 具体操作名称 * @param limit 工作最大并行数 */function run(projects: Project[], actionName: string, limit: number) { // todo}run(projects, "build", 12);解题很显著,project 之间存在依赖关系,那么工作之间也存在依赖关系,那么能够失去以下论断: ...

July 5, 2021 · 4 min · jiezi

关于yarn:yarn全局安装后命令为何不能使用

npm全局装置 npm i -g xxxyarn 全局装置 yarn global add xxx然而你可能会发现npm全局装置后的命令能够间接应用,而yarn却不行,这是为什么呢? 咱们来查看下npm和yarn的bin目录 bin是binary的缩写,意思是寄存二进制可执行文件的目录,比方exe,msi,cmd等,而npm,yarn全局装置的命令就会从这外面开始查找可执行文件。 那为什么零碎会从这个门路下进行查找可执行文件呢?这就要说下环境变量 简略的说计算机在执行命令的时候是在环境变量找对应的命令的地位的。如果不正确设置环境变量就不能正确应用相应的命令。如果执行某个命令,零碎无奈在以后文件夹里找到对应的.exe(可执行文件),那么零碎就会去环境变量path蕴含的门路找挨个找看是否能晓得对应的.exe,一旦找到第一个对应的.exe就运行命令,其余的门路下就不找了。如果找不到你就会看到“零碎找不到某某命令”的提醒。 在装置node的过程,装置过程会主动的减少node和npm的门路到环境变量,如下图: 所以咱们应用npm装置的全局命令,能够间接应用,无需再配置环境变量。 关上bin目录能够发现全局装置的命令脚本或者可执行文件 留神:应用cnpm装置的yarn,如果要卸载,须要应用npm卸载,cnpm卸载不了,卸载实现,须要重启命令行工具。然而yarn的bin目录门路不会增加到环境变量中,这也就是为什么yarn全局装置后命令不能应用的起因。 因而,全局装置命令行工具库最好应用npm或者cnpm,不倡议应用yarn。可能有同学会说手动将yarn的bin目录门路增加到环境变量中不就能够了吗?但如果npm和yarn都装置了同一个命令行工具库,然而版本不一样,那在执行命令的时候应该去执行哪一个命令脚本呢? 或者你能够在yarn的bin目录执行脚本命令文件,如下: cd C:\Users\cassmall\AppData\Local\Yarn\bineslint --fix --ext .ts /src参考文章:yarn如何全局装置命令以及和环境变量的关系

June 7, 2021 · 1 min · jiezi

关于yarn:Yarn工作区

本节咱们学习 Yarn 工作区,什么是工作区呢? 工作区是设置软件包体系结构的一种新形式,默认状况下从 Yarn 1.0 开始应用。咱们能够应用这种形式装置多个软件包, 也就是只须要执行一次 yarn install 命令便能够将所有依赖包全副装置。 如何应用工作区在 package.json 文件中增加以下内容,接下来咱们将此目录称为 “工作区根目录”: { "private": true, "workspaces": ["workspace-a", "workspace-b]}其中 private:true 是必填项,工作区并不是要公布的,因为增加了此安全措施来确保没有任何货色能够意外地裸露它们。 创立这个文件之后,咱们须要在创立两个新的子文件夹:workspace-a 和 workspace-b。在每个文件夹外面,创立一个具备以下内容的 package. json 文件: workspace-a/package.json: { "name": "workspace-a", "version": "1.0.0", "dependencies": { "cross-env": "5.0.5" }}workspace-b/package.json: { "name": "workspace-b", "version": "1.0.0", "dependencies": { "cross-env": "5.0.5", "workspace-a": "1.0.0" }}最初能够在工作区根目录中执行 yarn install 命令,如果一切正常,当初应该有一个相似上面这样的文件层次结构: /package.json/yarn.lock/node_modules/node_modules/cross-env/node_modules/workspace-a -> /workspace-a/workspace-a/package.json/workspace-b/package.jsonworkspace-b 须要一个在 workspace-a 中的文件,当初将间接应用以后我的项目外部的文件,而不是从 Github 下面获取。cross-env 包已正确去重并放在我的项目的根目录下,让 workspace-a 和 workspace-b能够一起应用这个包。 限度和正告包层级在工作区和用户失去的内容之间将有所不同(工作区依赖将晋升到文件系统层次结构中)。 对这个层级的假如曾经是危险的,因为晋升过程不是标准化的,所以实践上没有什么新货色。在下面的示例中,如果 workspace-b 依赖于 workspace-a 的包,然而援用的是不同的版本,那么依赖包将从 Github 装置,而不是从本地文件系统链接。 这是因为一些软件包实际上须要应用以前的版本,以建设新的版本(Babel 是其中之一)。在工作区中公布包时要留心。 如果你正筹备公布下一个版本,并且你决定援用一个新依赖但忘了在 package.json 中申明,你的测试仍可能在本地通过(如果其余包曾经把那个援用下载到了我的项目根目录)。 然而其余从源中拉取包的用户就不行了,因为依赖列表当初是不残缺的,他们没方法下载那个新依赖。 目前没有方法在这种状况下抛出正告。工作区必须是我的项目根目录的子目录,咱们不能也不该当援用位于我的项目目录之外的工作区。工作区不反对嵌套。链接:https://www.9xkd.com/ ...

April 23, 2021 · 1 min · jiezi

关于yarn:Yarn依赖与版本

本节咱们来讲 Yarn 中的依赖与版本。软件包依赖关系对于包的胜利是至关重要的,当开发软件包时,咱们可能会用到其余包里的现有代码来开发本人的软件包性能,那么其余包就能够称为我的项目的依赖项。 所有的我的项目依赖都在 package.json 文件中申明,每个依赖项都须要指名依赖名称和最低版本信息。而 yarn.lock 文件里保留了每个依赖的装置版本,来确保软件包在所有装置过程中保持一致。 依赖的类型不同的依赖有着不同的目标,在构建我的项目时须要一些依赖项,在运行程序时也须要一些依赖项,因为有不同的依赖类型。 对于 package.json 文件能够蕴含的一些依赖类型如下所示: { "name": "my_yarn", "dependencies": { "package-a": "^1.1.0" }, "devDependencies": { "package-b": "^1.2.1" }, "peerDependencies": { "package-c": "^2.5.4" }, "optionalDependencies": { "package-d": "^3.1.0" }}dependencies:惯例依赖,也就是运行代码时所需的依赖项。devDependencies:开发依赖,在开发工作流中某些时候须要的依赖关系,而在运行代码时则不须要。peerDependencies:伙伴依赖,一种非凡类型的依赖项,只有在公布本人的程序包时才会呈现。optionalDependencies:可选依赖,这种依赖即使装置失败,Yarn 也会认为整个依赖装置过程是胜利的。bundledDependencies:打包依赖,在公布包时,这个数组里的包都将会被打包(bundle)。依赖的版本Yarn 的软件包恪守语义版本控制,也叫作 “semver",也就是说当咱们从资源库装置一个新包,它会和语义版本范畴一起被增加到咱们的 package.json 文件中。 版本号能够划分为 主版本号.次版本号.订正号,相似于 1.0.0、1.1.2,不同的状况对应不同的版本号增长,如下所示: 主版本号:新的版本不兼容老版本的 API。次版本号:新的版本新增了局部性能并向下兼容。订正号:新的版本修复局部 bug 并向下兼容。有些时候,除了版本号当前还会呈现一些特殊字符,例如 >=,<,^ 和 ~ ,这些是运算符,能够用来指定版本范畴。版本范畴的用途是表明依赖的哪个版本会在代码中起作用。举个例子,像 >2.1.0 示意大于 2.1.0 版本、=4.3.1 示意等于 4.3.1 版本。如果不指定运算符,则示意等于某个版本。 选择性依赖项解决Yarn 反对选择性版本解析,package.json 文件里的 resolutions 字段用于解析选择性版本,能够通过此性能自定义依赖版本。这通常须要在 yarn.lock 文件中进行手动编辑。 示例: 在 package.json 文件中增加一个 resolutions 字段用于笼罩版本定义: ...

April 19, 2021 · 1 min · jiezi

关于yarn:如何发布Yarn包

本节咱们来学习如何公布 Yarn 包,如果咱们心愿通过 Yarn 共享咱们创立好的包给全世界各地的其余开发者,能够将软件包托管到一个可信赖的网站上。 创立软件包 首先咱们须要创立一个软件包,能够通过下列几个命令来创立,如下所示: > git init my_yarn> cd my_yarn> yarn init看一下这几个命令的执行成果:其中 git init my_yarn 命令将会初始化创立一个新本地仓库,它在工作目录下生成一个名为 .git 的暗藏文件夹。而后应用 cd my_yarn 命令跳转到指定目录中,通过 yarn init 初始化一个新的我的项目。在执行 yarn init 时会呈现一些问题,依据需要为每个问题输出答案,最终会在根目录下生成一个 package.json 文件。如果想要对所有的问题都应用默认值,能够间接运行 yarn init --yes 命令。 此时 package.json 文件的内容相似上面所示,当然依据输出答案的不同,内容也会有所不同: <pre spellcheck="false" class="md-fences md-end-block contain-cm modeLoaded" lang="json" contenteditable="false" cid="n18" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Consolas, &quot;Liberation Mono&quot;, Courier, monospace; font-size: 0.9em; white-space: normal; display: block; break-inside: avoid; text-align: left; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(223, 226, 229); border-radius: 3px; padding: 8px 1em 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">{ "name": "my_yarn", "version": "1.0.0", "main": "index.js", "author": "Your Name <you@example.com>", "license": "MIT"}</pre> ...

April 16, 2021 · 1 min · jiezi

关于yarn:Yarn-yarnlock文件

为了在多台机器之间取得统一的装置后果,Yarn 可能会须要比 package.json 文件中配置的依赖项更多的信息。它须要精确存储每一个依赖项的装置版本。因而在 Yarn 我的项目的根目录咱们须要一个 yarn.lock 文件,这个 yarn.lock 文件是主动生成的。 当咱们执行 yarn 命令或者增加依赖包命令后,Yarn 都会在我的项目根目录下主动生成一个 yarn.lock 文件。在应用 Yarn 装置、降级、删除依赖我的项目时,会自动更新到 yarn.lock 文件中。个别咱们不会去手动编辑这个文件,因为很容易毁坏这个文件。 示例:例如咱们装置了一些依赖包,那么 yarn.lock 文件内容相似所示格局: copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== dependencies: bn.js "^4.1.0" elliptic "^6.0.0"能够显著看到 yarn.lock 文件中的信息比 package.json 文件中具体了很多。 在理论我的项目中,yarn.lock 文件也很有用途,咱们能够将 yarn.lock 提交到版本库中,其余成员就能够通过 yarn install 获取所有依赖包,这个能够保障大家装置的依赖是完全一致的,防止产生 bug。

April 14, 2021 · 1 min · jiezi

关于yarn:Yarn安装

本节咱们来学习 Yarn 的装置,在应用 Yarn 之前,咱们须要先装置 Yarn。而装置 Yarn 的形式有多种,例如下载安装程序、通过 Chocolatey 装置、通过 Scoop 装置等,大家能够抉择一种适宜本人的形式装置。 下载 Yarn首先咱们须要关上官网:https://www.yarnpkg.com/lang/en/,能够看到如下所示页面:而后点击页面中的 INSTALL YARN 按钮,会跳转页面,如下图所示:在这个页面中,咱们能够抉择操作系统,例如我应用的是 Windows零碎,所以默认抉择 Windows 版本即可。大家能够依据须要抉择,会默认抉择最新的稳固版本。选好版本后,接着点击 Download Installer进行下载 ,会胜利下载一个 .msi 安装包。 开始装置 Yarn下载实现后,点击安装包就能够开始装置了,会看到如下所示界面,间接点击 Next 按钮,进入下一步:这一步骤中,须要勾选批准协定,能力持续下一步:而后是 Yarn 的装置门路,能够抉择默认门路,也能够本人批改装置门路,持续点击 Next 进入下一步:而后就能够开始装置啦,只须要点击 Install 按钮就会开始装置:装置胜利后的界面如下所示: 最初咱们能够在命令行中通过 yarn --version 命令查看 Yarn 的版本,如果呈现版本号,则示意装置胜利,下图中显示咱们胜利装置了 v1.22.4 版本的 Yarn。 应用npm来装置Yarn如果咱们曾经下载了 Node.js ,那么咱们能够通过 npm 来装置 Yarn,命令如下所示: npm install -g yarn上述命令中的 -g ,示意全局装置。Yarn 装置好后,同样能够通过 yarn --version 命令来查看版本号,呈现版本号则示意装置胜利。 总结本节咱们讲了如何下载安装 Yarn,能够通过在官网下载一个 .msi 安装包文件,而后依据提醒进行装置。也能够通过 npm 来装置 Yarn,须要下载一个 Node.js 。还有其余的装置形式,这里就不一一解说啦,大家如果想理解能够本人去官网看一下。 ...

April 6, 2021 · 1 min · jiezi

关于yarn:Yarn简介

本教程咱们来学习 Yarn,Yarn 是 Yet Another Resource Negotiator 的简写,能够译为另一种资源协调者,也就是资源管理器。 Yarn 是由 Facebook 、Google、Exponent 、Tilde 联合推出的一个新的 Javascript 包管理工具,它的呈现次要是为了补救 npm 的一些缺点。 官网上介绍了 Yarn 的一些劣势,例如 : 速度超快:Yarn 缓存了每个下载过的包,所以再次应用时无需反复下载。 同时利用并行下载以最大化资源利用率,因而装置速度更快。超级平安:在执行代码之前,Yarn 会通过算法校验每个安装包的完整性。超级牢靠:应用具体、简洁的锁文件格式和明确的装置算法,Yarn 可能保障在不同零碎上无差别的工作。Yarn的个性离线模式:如果你以前装置过某个包,再次装置时能够在没有任何互联网连贯的状况下进行。确定性:不论装置程序如何,雷同的依赖关系将在每台机器上以雷同的形式装置。网络性能:Yarn 无效地将申请排序,防止申请沉积,以最大限度地进步网络利用率。多个注册表:无论从 npm 或 Bower 装置任何包,能放弃包工作流程雷同。网络复原:单个申请失败不会导致装置失败,申请在失败时会主动重试。立体模式:将不兼容版本的依赖项解析为单个版本,以防止创立反复项。Yarn三大组成构件ResourceManager:负责整个集群的资源管理和调配,是一个全局的资源管理零碎。NodeManager:是每个节点上的资源和工作管理器,它是治理这台机器的代理,负责该节点程序的运行,以及该节点资源的治理和监控。Yarn 集群每个节点都运行一个NodeManager。ApplicationMaster:用户提交的每个应用程序均蕴含一个 ApplicationMaster,能够运行在 ResourceManager 以外的机器上。Yarn运行流程用户向 Yarn 中提交应用程序,其中包含 ApplicationMaster 程序,启动 ApplicationMaster 的命令、用户程序等。ResourceManager 为这个应用程序调配第一个 Container,在 Container 中运行一个ApplicationMaster。ApplicationMaster 首先向 ResourceManager 注册,这样用户就能够间接通过它本身查看利用长须的运行状态,而后它将为各个工作申请资源,并监控它的运行状态,直到运行完结。ApplicationMaster 采纳轮询的形式通过 RPC 协定向 ResourceManager` 申请和支付资源。一旦 ApplicationMaster 申请到资源后,便与对应的 NodeManager 通信,要求其启动工作。NodeManager 为工作设置好运行环境(包含变量、JAR包、二进制程序等)后,将工作启动命令写到一个脚本中,并通过运行该脚本启动工作。各个工作通过某个 RPC 协定向 ApplicationMaster 汇报本人的状态和进度,以让 ApplicationMaster 随时把握各个工作的运行状态,从而能够在工作失败时重新启动工作。在利用程序运行过程中,用户能够随时通过 RPC 向 ApplicationMaster 查问应用程序的以后运行状态。利用程序运行实现后,ApplicationMaster 向 ResourceManager 登记并敞开本人。总结Yarn 也是一个包管理工具,能够用来代替 npm。比照 npm 有如下区别: ...

March 30, 2021 · 1 min · jiezi

关于yarn:工程化之Yarn

yarn打包 yarn install //yarn add -g caniuse-liteyarn run buildcd distzip -r dist.zip *

March 29, 2021 · 1 min · jiezi

关于运维自动化:带你轻松了解任务运维和数据指标相关的使用

一、实时开发常见问题 1、一个实时计算工作该调配多少资源? 倡议:一些简略ETL工作,并且源数据流量在肯定范畴内, tm个数1、全局并行度1、内存1G。 剖析: 全局并行度为1,对于简略ETL工作会有operator chain,在一个task(线程)中运行、缩小线程切换、缩小音讯序列化/反序列化等,该类问题的瓶颈个别在上游写入端。写入端是瓶颈:个别倡议开启批量写入(须要管制批量大小,避免内存溢出)、开启多并行度写入。如果是单台数据库的瓶颈:开启多个并行度就没法晋升性能、个别倡议依照肯定路由规定写入多台数据库、倡议应用分布式数据库(如Hbase:提前建设分区、防止数据热点写入等)。2、为什么写入Kafka后果中有些分区没有数据? 倡议:如果现有topic曾经存在,并且是多个分区,后果表并行度设置partition数一样。剖析: 因为Flink写Kafka默认采纳的是FixedPartitioner。如果并行度比partition大,则数据都会发送到partition中,然而如果并行度比partition小,则有局部分区是没有数据的。source端,如果并行度小于partition,会取模的形式分给并行度,都会生产到数据。如果并行度大于partition,则会有局部task生产不到数据。3、为什么和维表关联后工作解决数据的能力变慢? 倡议:小数据量不常更新的维表应用ALL模式。大数据量的维表应用应用LRU模式,并且依据数据库不同做相应的解决(比方关系型数据库则建设索引等)。 剖析:1.ALL模式启动时候间接将数据全量加载到内存中,每次关联数据不须要查库,没有其余开销。2.异步(async)查问模式 LRU异步查询数据库,能够并发地解决多个申请。依据SQL中的关联字段程序建设复合索引。避免关联字段索引生效(关联程序不对、关联列做计算等)。如果维表字段个数少,思考将将多余字段都退出到索引中,缩小回表(带来的问题是索引变大)。4、为什么某些工作进步并行度能晋升性能,某些不能? 倡议:查看是否数据歪斜,如果是将数据打散。 剖析: 源头是否数据歪斜。SQL中是否存在导致歪斜的语句。登陆到Flink web页面查看。通过批改SQL解决或者打散groupby字段。二、实时工作运维 1、配置反压告警 场景:反压导致cp失败,数据呈现提早或者不产出。 排查办法:1)借助Flink web-ui 提供的的反压性能查找具体的operatorChain。2)查问Flink metric 'inPoolUsage、outPoolUsage' 来确定具体的反压算子。 2、配置cp失败告警 场景:cp失败导致数据无奈真正落地,工作复原距离太长。 排查办法: 1)是否存在反压。2)查看集群负载、IO、CPU、MEM 是否处于高负荷状态。 3、拆分实时工作日志 场景: Flink实时工作运行工夫长之后导致日志占用磁盘大,另外一个大的日志文件不利于排查问题。 解决办法: 配置log4j.log的滚动参数,设置日志按日期或者大小滚动生产,并且限度保留的大小。 4、监控工作运行中tm日志 场景: 工作执行中产生的运行日志没有监控,比方网络抖动导致的链接失败等等。 解决办法: 批改Flink自带的log4j jar包中的代码,将异样日志重定向一份到Kafka或ES中,进行后续剖析,找到程序中可能存在的暗藏bug。 5、脏数据管理 场景:因为数据源都是从Kafka过去的数据,可能存在数据类型谬误、字段名称谬误、字段阈值在Flink中超范围等。落库过程中,因为字段类型不匹配、阈值超范围等等状况。 解决办法: 在数据解析和数据落库等代码中,对catch中的数据进行收集。当异样数据达到肯定的量时,告警告诉。线下离线修改后果数据。 三、通过Metrics定位问题 1.罕用内置Metrics介绍 端到端的延时(最大、均匀、百分位): flink_taskmanager_job_latency_source_id_operator_id_operator_subtask_index_latency 输出数据量: flink_taskmanager_job_task_operator_numRecordsIn flink_taskmanager_job_task_numBytesIn 输入数据量: flink_taskmanager_job_task_operator_numRecordsOut flink_taskmanager_job_task_numBytesOut 反压值: flink_taskmanager_job_task_isBackPressured 工作buffer: inPoolUsage、outPoolUsage等其余 2、flinkStreamSql中罕用metrics 业务提早: flink_taskmanager_job_task_operator_dtEventDelay(单位s) 数据自身的工夫和进入flink的以后工夫的差值。 各个输出源的脏数据: flink_taskmanager_job_task_operator_dtDirtyData 从Kafka获取的数据解析失败视为脏数据。 各Source的数据输出TPS: flink_taskmanager_job_task_operator_dtNumRecordsInRate Kafka承受的记录数(未解析前)/s。 各Source的数据输出RPS: ...

March 18, 2021 · 1 min · jiezi

关于yarn:yarn-中国镜像代理

yarn config set registry https://registry.npm.taobao.org --globalyarn config set disturl https://npm.taobao.org/dist --global

February 16, 2021 · 1 min · jiezi

关于yarn:lerna-workspaces使用手册

lerna项目管理形式固定模式默认的模式版本号应用lerna.json文件中的version属性。 执行lerna publish时,如果代码有更新,会自动更新此版本号的值。即:所有的包公用一个版本号 应用形式:lerna init 独立模式容许保护人员独立的减少批改每个包的版本,每次公布,所有更改的包都会提醒输出指定版本号。应用形式:lerna init --independent 或 批改lerna.json中的version值为independent,可将固定模式改为独立模式运行。 初始化我的项目lerna提供一种集中管理package的目录模式,提供了一套自动化管理程序git init lerna-demo & cd $_ npm i -g lerna lerna init // 初始化后目录构造|—— packages // 空目录|—— lerna.json|—— package.json配置文件lerna.json{ "npmClient": "yarn", // 执行命令所用的客户端,默认为npm —— 配置后会强制应用最佳实际:能用yarn的用yarn——如lerna bootstap --hoist不再可用 "command": { // 命令相干配置 "publish": { // 公布时配置 "allowBranch": "master", // 只在master分支执行publish "conventionalCommits": true, // 生成changelog文件 "exact": true, // 精确的依赖项 "ignoreChanges": ["ignored-file", "*.md"], // 公布时疏忽的文件 "message": "chore(release): publish" // 公布时的自定义提醒音讯 }, "bootstrap": { // 装置依赖配置 "ignore": "component-*", // 疏忽项 "npmClientArgs": ["--no-package-lock"], // 执行 lerna bootstrap命令时传的参数 "hoist": true }, "version": { "conventionalCommits": true //开启日志:主动生成changLog.md } }, "packages": [ // 指定寄存包的地位 "packages/*" ], "version": "0.0.0" // 以后版本号}启用workspaces环境手动批改根目录下package.json ...

January 26, 2021 · 1 min · jiezi

关于yarn:yarn-安装包时出现错误

error An unexpected error occurred: "https://registry.npm.taobao.org/egg: tunnel ing socket could not be established, cause=getaddrinfo ENOTFOUND 9999猜想起因: 本机有proxy工具解决办法: yarn config set proxy http://localhost:portyarn config set https-proxy http://localhost:port减速办法: yarn config set registry https://registry.npm.taobao.org --global// 查看配置yarn config list

September 18, 2020 · 1 min · jiezi

为什么我们从Yarn切换到pnpm

原文网址:https://www.takeshape.io/arti...原文作者:ANDREW SPROUSE 这是一个重大的决定 在 TakeShape,我们非常关注开发人员的生产力。 我们是一个资源有限的小型团队,因此值得花时间考虑如何更快,更高效地合作。 在最近重构我们的构建过程时,我们做出了一个重大决定:我们将抛弃 Yarn 并改用 pnpm 来管理我们的依赖项并运行我们的脚本。 这是关于我们如何做出该决定以及迄今为止如何使我们受益的故事。 最初,TakeShape 的代码库分散在多个Git存储库中。 每个软件包都是独立开发的,并且彼此依赖。 从理论上讲,这是理想的设置。 在实践中,我们发现所有东西都是相互依赖的,我们真的希望能够同时测试和发布所有软件包。 当我们为其中一个软件包发行新版本时会遇到失败,但是会忘记在依赖它的其他项目中更新该版本。 最终,我们意识到,在保持项目的分离性和依赖性时,monorepo 是正确的权衡。 我们所有的软件包(如Web客户端,前端路由库和CLI)都存在一个可测试且可部署的单元中。 我们的包可以使用package.json 中的 link :语法相互依赖。 这在很大程度上是有效的,但是我们仍然发现管理我们的 monorepo 的部分是乏味的。这在一定程度上是因为我们的 monorepo 中的每个包都用自己的包管理器管理自己的依赖关系,json和它自己的lock 文件。即使每个包使用相同的开发工具链,如eslint、Jest、Typescript和Babel,每个包单独声明这些 devdependency ,这个工具链必须在我们所有的包中保持最新。我们决定不使用Yarn的工作区特性来解决这个问题,因为这将需要抛弃每个包的lock文件,而使用单个工作区范围的lock文件。 避免幻像依赖也比实际需要更加棘手。 当您的代码导入未在 package.json 中声明的包时,就会产生幻像依赖。 假设您将 Package A 添加到依赖于 Package B 的项目中。由于 Yarn 将所有程序包都保留在 node_modules 的根目录下,因此您可以导入和使用 Package B ,而无需将其完全放在 package.json 中。 尽管不是很常见,但这是一个错误的做法,它确实会减慢调试过程的速度,除非您记得有意地检查它。 我们的 monorepo 也使我们的CI管道比所需的更加复杂。 首先,我们并行化了 CircleCI 构建,以加快慢速 Webpack 构建。 但是,随着我们的 monorepo 的增长,为每个构建分别安装依赖项的开销也在增加。 为每个构建安装依赖项成为瓶颈。 作为回应,我们使用自己编写和维护的 CircleCI 脚本巩固了构建过程,以减少使用工作。最终,我们得到了一组脆弱的CI脚本来对任何包进行剪裁、测试和构建更改。 ...

July 8, 2020 · 1 min · jiezi

包管理工具安装速度慢或许是-lock-文件的坑

包管理工具安装速度慢或许是 lock 文件的坑 ⭐️ 更多前端技术和知识点,搜索订阅号 JS 菌 订阅大家都用过 yarn npm 配置镜像加速第三方模块的安装。不知道有没有人遇到过无论怎么配置镜像,安装速度都贼慢的问题。 ???? 就这个很蠢的问题搞到我浪费了很多时间,少赚了几个亿 ???? 问题溯源(yarn 为例):想要降低安装速度只需这几步: ???? 第一次安装模块的时候并没有配置 config 中的镜像,而是直接从 registry.yarnpkg.com 中下载模块的,或许第一次安装速度并没有很慢,亦或者忘记配置 registry,总之就这么装了。并生成了一个 lock 文件锁定版本。 然后问题来了,另一个开发者换了一个网络环境需要重新安装模块,执行 yarn install 命令,速度就有可能会非常慢。即便是配置了 registry,仍然会走 lock 中锁定的 resolved 的安装源。 也就是可能会出现上述错误。 ⚠️ 解决办法:解决办法很简单: 像下面这样把 lock 文件中所有的 resolved 后的 url 全部替换成国内的镜像地址 ???? 这样安装速度就会灰常快了: ✈️ 可能出现的其他问题:上述方法基本上就能解决 lock 文件锁定安装源导致的速度慢的问题了,在安装过程中还可能出现 404 错误的问题: 这种情况找到 lock 文件中对应的模块,修改 resolved 值,换另一个镜像地址即可。 最后祭上大招: 请关注我的订阅号,不定期推送有关 JS 的技术文章,只谈技术不谈八卦 ???? ...

May 23, 2019 · 1 min · jiezi

快速查看-npmyarn-全局安装过的包

npm、yarn 可以很方便的帮助我们快速安装开发前端项目需要的各种依赖包 同时也有意无意的安装了不少全局安装包,有些可能不会再使用了,有些已经太旧 使用以下命令查看自己电脑曾经安装过哪些全局工具包,顺便把那些不再需要的卸载掉吧 查看 npm 全局安装过的包$ npm list -g --depth=0/usr/local/lib├── npm@6.4.1├── nrm@1.0.2└── yrm@1.0.6查看 yarn 全局安装过的包$ yarn global list --depth=0yarn global v1.9.4info "@vue/cli@3.0.1" has binaries: - vueinfo "create-react-app@1.5.2" has binaries: - create-react-app✨ Done in 0.68s.npx 也许是个不错的选择如果有些包我们只会使用一次,或者只想尝试以下,不想安装到全局,也不想作为当前项目的依赖可以使用 npx 的方式来执行 npx 是 npm 5.2+ 版本之后自带的工具,能够帮助我们更高效的执行 npm 软件仓库里的安装包 更方便的执行当前项目中的可执行工具,比如:# npx 之前$ node ./node_modules/.bin/mocha# 使用 npx:$ npx mocha也可直接执行那些不在当前项目,也没在全局安装过的 npm 工具包,比如:create-react-app$ npx create-react-app my-app# 执行以上这条命令 npx 会按以下顺序工作:# 1. 先查看当前项目有没 create-react-app# 2. 如果当前项目找不到,会去全局查找 create-react-app# 3. 如果全局还找不到,会帮我们临时从 npm 包仓库安装 create-react-app,不会污染到当前项目,也不会装到全局✨ 重点推荐 ✨:对于那些不常使用、或者只想一次性尝试的工具,推荐使用 npx 的方式代替 npm install -g、yarn global 全局安装 ...

May 22, 2019 · 1 min · jiezi

OS-X-开发环境配置homebrew-yarn-nvm

问题brew install yarn --without-node 不再起作用,yarn 已经删除了 option --without-node。 准备homebrew 已安装。(非必需条件)使用 zsh 替换 bash: chsh -s /bin/zsh安装步骤安装 nvm: 确定 ~/.bash_profile 是否存在,如果没有则新建一个;执行 touch ~/.bash_profile;执行安装命令: // cURL:curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash// or Wget:wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash安装 node: // 安装最新 nodenvm install node --latest-npm// Always default to the latest available node version on a shellnvm alias default node检查 node: node -v显示 node 版本,例如 v12.1.0 安装 yarn: 安装 yarn 时不安装 node: ...

April 30, 2019 · 1 min · jiezi

hadoopyarn内核资源隔离

整体:https://segmentfault.com/a/11...yarn是hadoop的资源隔离运行在YARN上带来的好处 : 一个集群部署多个版本计算资源按需伸缩不同负载应用混搭,集群利用率高共享底层存储,避免数据跨集群迁移 1.到RM申请,在一个Container中启动AM 包含异步的分配资源,暂存在缓冲区,等待AM来取2.AM RPC取资源并与NM通信 AM领取资源后分配任务不是yarn事情,用户自行实现3.包含各种状态同步,比如7,持续的nm到rm. 隔离算法目前只能实现cpu和内存的隔离1.可以占用空闲资源 Capacity Scheduler2.平均分配 Fair Scheduler基于cgroups linux/kernel/cgroup,包含子系统:cpu,io,mmemory,net等 内核中的代码在kennel下。用户使用:通过文件系统配置(内核给用户提供的方法)VFS 文件:ext2,ext3磁盘,socket,cgroups 。操作系统实现后可以通过mount挂载到cgroups文件系统vi /etc/cgconfig.conf。/sys/fs/cgroup/cpuset中配置即可对于内存并没有直接用cgroups内存隔离:线程监控进程内存量,不是超过立刻杀死,有个生命期 jvm不足以:每个任务不仅有java进程,reduce用C++不能单纯的cgroups内存树直接配置Linux中所有的进程都是通过fork()复制来实现的,而为了减少创建进程带来的堆栈消耗和性能影响,Linux使用了写时复制机制来快速创建进程。也就是说,一个子进程刚刚产生时,它的堆栈空间和父进程是完全一致的,那么从一开始它就拥有和父进程同样的ru_maxrss,如果父进程的ru_maxrss比较大,那么由于rusage计算值取最大值,就算在触发写时复制后,子进程使用的实际最大驻留集大小被更新,我们获得的也还是父进程的那个值,也就是说我们永远拿不到子进程真实使用的内存。Java创建子进程时采用了“fork() + exec()”的方案,子进程启动瞬间,它的内存使用量与父进程是一致的,exec系函数,这个系别的函数通过将当前进程的使用权转交给另一个程序,这时候进程原有的所有运行堆栈等数据将全部被销毁,因此ru_maxrss也会被清零计算,然后子进程的内存会恢复正常;也就是说,Container(子进程)的创建过程中可能会出现内存使用量超过预先定义的上限值的情况(取决于父进程,也就是NodeManager的内存使用量);此时,如果使用Cgroup进行内存资源隔离,这个Container就可能会被“kill”。虽然我们已经可以获得各个Container进程树的内存(物理内存、虚拟内存)使用量,但是我们不能仅凭进程树的内存使用量(物理内存、虚拟内存)是否超过上限值就决定是否“杀死”一个Container,因为“子进程”的内存使用量是有“波动”的,为了避免“误杀”的情况出现,Hadoop赋予每个进程“年龄”属性,并规定刚启动进程的年龄是1,MonitoringThread线程每更新一次,各个进程的年龄加一,在此基础上,选择被“杀死”的Container的标准如下:如果一个Contaier对应的进程树中所有进程(年龄大于0)总内存(物理内存或虚拟内存)使用量超过上限值的两倍;或者所有年龄大于1的进程总内存(物理内存或虚拟内存)使用量超过上限值,则认为该Container使用内存超量,可以被“杀死”。(注意:这里的Container泛指Container进程树)fork/exec/线程/进程在另一篇:xxk8s基本上完全基于cgroups。但是对于内存/磁盘这种没有就不行的不可压缩资源,会再加一个阈值,防止不稳定,能分配的会少于这个。所以k8s对于内存的限制会在fork时误放大没有处理。https://juejin.im/post/5b3d8c...

April 28, 2019 · 1 min · jiezi

入手vue-cli 3.x

笔者环境 macOS node v8.11.3准备工作首先查看本地版本注:vue-cli需要要8.9+版本,我使用的n模块,进行node版本管理。因为之前曾经安装2.x版本 所以先执行卸载npmnpm uninstall vue-cli -g使用yarnyarn global remove vue-cli卸载完成后 重新使用 npm或者yarn进行安装npm install -g @vue/cli#或者使用yarn global add @vue/cli现在 我用yarn成功安装3.5.5版本项目创建vue create yourProject第一个选择是选择默认设置还是去手动选择功能在这里我选择了默认的包含了基本的Babel+ESLint的预制和yarn当然也可以选自己定制babel:使用babel将最新版的js语法进行转换typescript:使用TypeScript写源码PWA:渐进式WEB应用Router:使用vue-routerVuex:使用vuexCSS Pre-processors:css预处理器选择Linter / Formatter:代码规范选择Unit Testing:单元测试E2E Testing:e2e测试以上就是项目的根目录,可以看到跟以前相比变得更加简洁执行build启动项目在vue-cli的项目中,@vue/cli-service 安装了一个名为 vue-cli-service 的命令。可以在 npm scripts 中以 vue-cli-service、或者从终端中以 ./node_modules/.bin/vue-cli-service 访问这个命令。npm run serve# 或者yarn serve# 进行调用以下说明参考官方文档1.vue-cli-service serve [options] 【entry】(启动开发服务器)选项:–open 在服务器启动时打开浏览器–copy 在服务器启动时将 URL 复制到剪切版–mode 指定环境模式 (默认值:development)–host 指定 host (默认值:0.0.0.0)–port 指定 port (默认值:8080)–https 使用 https (默认值:false)2.vue-cli-service build [options] 【entry|pattern 】(dist 目录产生一个可用于生产环境的包)选项:–mode 指定环境模式 (默认值:production)–dest 指定输出目录 (默认值:dist)–modern 面向现代浏览器带自动回退地构建应用–target app | lib | wc | wc-async (默认值:app)–name 库或 Web Components 模式下的名字 (默认值:package.json 中的 “name” 字段或入口文件名)–no-clean 在构建项目之前不清除目标目录–report 生成 report.html 以帮助分析包内容–report-json 生成 report.json 以帮助分析包内容–watch 监听文件变化3.vue-cli-service inspect [options] […paths](审查项目的vue-cli webpack config)选项:–mode 指定环境模式 (默认值:development)4.npx vue-cli-service help 查看所有命令。下面我们来简单使用下这样通过命令行工具 我们使用的vue-cli3 构建的项目成功在本地8888端口 运行起来了后续文章内容都很简单基础,后续会跟随这个演示项目进行更新。 ...

April 11, 2019 · 1 min · jiezi

都8102年了,为什么你还在用Yarn?!

原文出处:yarn-vs-npm仍记得Yarn刚问世时的火爆场景真的太快了,每次yarn install,都会为我节省出好几分钟的时间。Yarn会保证你的node_modules文件夹与同事的node_modules文件夹严格匹配,同样,服务器上的node_modules文件夹也和你本地一模一样,不会出现包版本不一致的情况,也再也不会出现‘在我电脑上好好的啊¯(ツ)/¯’这样的话。六个月过去了…Npm.v5版本脱胎换骨而来,带来了速度提升与版本锁定这两个杀手锏。没错,就是我们刚初弃npm投yarn的最重要的原因。现在,很多开发者心里在嘀咕:我还有必要用Yarn吗?我觉得,是时候再次投到到npm的温暖怀抱了!npm和Yarn一样快请自行查看:# Backupmv node_modules node_modules_backupmv package-lock.json package-lock.backup.jsonmv yarn.lock yarn.backup.lock# Test cold npm speedtime npm install# Reset modulesrm -Rf node_modules# Test warm npm speedtime npm install# Test cold yarn speedtime yarn install# Reset modulesrm -Rf node_modules# Test warm yarn speedtime yarn install# Resetrm package-lock.jsonrm yarn.lock# Restoremv node_modules_backup node_modulesmv package-lock.backup.json package-lock.jsonmv yarn.backup.lock yarn.lock我按上述步骤运行了三次,速度几近持平。轻松切换npm版本Bob安装了Yarn v1.1,Brenda安装了Yarn v1.2. 当他们在工程里添加或删除依赖包时,会使得Yarn修改yarn.lock文件。但在两个Yarn版本中,lock文件有些许的不同,这可不是什么好事。你可以在package.json中标明你的工程应该使用yarn的哪个版本。但如果你有多个工程,每个工程所需的yarn又不尽相同时可怎么办?你应该用npm来安装多个yarn版本:npm install yarn@1.1 –global,npm install yarn@1.2 –global。但每次项目切换你都需要再重新安装Yarn,这很恐怖了!npm可以轻松做到版本切换!使用nvm或n一键切换npm版本,就是如此简单方便!用Lerna管理你的workspaces如果你在用Yarn的workspaces特性,在npm中,你可以用Lerna代替它,它提供了Yarn所具备的所有特性,而且还延伸了一些新功能:管理workspace版本,在workspace中执行命令,发布workspaces。用npm-check来交互式升级Yarn upgrade-interactive命令很棒:在npm中也可以用npm-check实现该功能:npm install npm-check –save-dev添加脚本:{ “scripts”: { “upgrade-interactive”: “npm-check –update” }}然后,npm也可以npm run upgrade-interactive了。Yarn正在变得复杂虽然很多工程的readme中同时展示了npm和yarn,但其实真不必这样。比如,create-react-app工程的readme:npm run build or yarn buildBuilds the app for production to the build folder.Yarn在此处的作用是什么?None。这对于新手而言绝对充满了困惑,我该运行哪个命令?Yarn是什么?我需要它么?选择Yarn,意味着你的团队都将必须使用yarn。 Javascript的生态已经十分复杂了,我们真的要再拿Yarn火上浇油吗?我希望Yarn团队将他们杰出的工作直接放在npm中来让我们的生活好过一点。起飞吧npm!当我重新切回npm后,我发现npm run命令竟然有自动补全功能,这很赞!虽然Yarn也许会作出同样的功能,但npm才是老大哥!npm也有其他的一些新功能,比如npm audit,它可以扫描你工程中的现存漏洞。npm已经足够快,npm的社区已经足够成熟,且一些packages赋予了npm更加强大的生命力!忘了Yarn吧! ...

March 19, 2019 · 1 min · jiezi

基于verdaccio的npm私有仓库搭建和使用总结

资源官方:https://github.com/verdaccio/…参考:https://blog.csdn.net/yyzzhc9…参考:https://www.jianshu.com/p/16b…参考:https://www.jianshu.com/p/1d0…原来用sinopia搭建的私服,但sinopia两年年停止维护了,现在改为verdaccio。使用verdaccio也超级简单,只需几分钟就可以搭建一个私服,适合公司内部不对外的包的安装一:安装和配置A.安装$ yarn global add verdaccioyarn global v1.12.3[1/4] Resolving packages…[2/4] Fetching packages…[3/4] Linking dependencies…[4/4] Building fresh packages…success Installed “verdaccio@3.10.1” with binaries: - verdaccioDone in 52.10s.安装到了 C:\Users\Administrator\AppData\Local\Yarn\bin[我的是win10]B.测试随便建一个空目录测试,我当前工作目录是F:\youshengyouse\del3$ verdaccio warn — config file - C:\Users\Administrator.config\verdaccio\config.yaml warn — Plugin successfully loaded: htpasswd warn — Plugin successfully loaded: audit warn — http address - http://localhost:4873/ - verdaccio/3.10.1在浏览器输入http://localhost:4873/,结果如下二:添加用户另开一个命令行窗口,原来的verdaccio仍在运行$ npm adduser –registry http://localhost:4873Username: abcdPassword: qwerEmail: (this IS public) a@163.comLogged in as abcd on http://localhost:4873/.三:发布私包当前工作目录:要发布哪个包,当前目录切换到包根目录下$ npm publish –registry http://localhost:4873> gatsby2-cli@1.0.0 prepare .> cross-env NODE_ENV=production npm run build> gatsby2-cli@1.0.0 build F:\youshengyouse\frontend\packages\gatsby\packages\gatsby2-cli> babel src –out-dir lib –ignore **/__tests__Successfully compiled 6 files with Babel.npm noticenpm notice package: gatsby2-cli@1.0.0npm notice === Tarball Contents ===npm notice 1.8kB package.jsonnpm notice 7.4kB CHANGELOG.mdnpm notice 3.3kB README.mdnpm notice 9.4kB lib/create-cli.jsnpm notice 2.7kB lib/index.jsnpm notice 4.7kB lib/init-starter.jsnpm notice 2.0kB lib/reporter/errors.jsnpm notice 3.1kB lib/reporter/index.jsnpm notice 4.0kB lib/reporter/prepare-stack-trace.jsnpm notice === Tarball Details ===npm notice name: gatsby2-clinpm notice version: 1.0.0npm notice package size: 11.0 kBnpm notice unpacked size: 38.3 kBnpm notice shasum: 64c9c47b81610731e559bc33f86aa02f87155656npm notice integrity: sha512-vhroNpnWCwivE[…]8hAg+z6SPOeyw==npm notice total files: 9npm notice+ gatsby2-cli@1.0.0现在刷新http://localhost:4873/#/就可以看到刚才发布的包问题:本地安装的包放在哪里了呢?四:安装包npm set registry http://localhost:4873/$ npm init # 如果没有package.json文件得先建$ yarn add gatsby2-cli发现gatsby2-cli是在本地的,其余的依赖还是从npmjs.com仓库中安装的 ...

January 7, 2019 · 1 min · jiezi

package-lock.json和yarn.lock的包依赖区别

node包管理包是一段可以复用的代码,这段代码可以从全局注册表下载到开发者的本地环境。每个包可能会,也可能不会依赖于别的包。简单地说,包管理器是一段代码,它可以让你管理依赖(你或者他人写的外部代码),你的项目需要这些依赖来正确运行。为啥我们需要一个包管理工具呢?因为我们在Node.js上开发时,会用到很多别人写的JavaScript代码。如果我们要使用别人写的某个包,每次都根据名称搜索一下官方网站,下载代码,解压,再使用,非常繁琐。更重要的是,如果我们要使用模块A,而模块A又依赖于模块B,模块B又依赖于模块C和模块D,npm可以根据依赖关系,把所有依赖的包都下载下来并管理起来。否则,靠我们自己手动管理,肯定既麻烦又容易出错。于是一个集中管理的工具应运而生:大家都把自己开发的模块打包后放到npm官网上,如果要使用,直接通过npm安装就可以直接用,不用管代码存在哪,应该从哪下载。Yarn 是为了弥补npm 的一些缺陷[速度慢,稳定性高]而出现的。”npmnpm 为你和你的团队打开了连接整个 JavaScript 天才世界的一扇大门。它是世界上最大的软件注册表,每星期大约有 30 亿次的下载量,包含超过 600000 个 包(package) (即,代码模块)。来自各大洲的开源软件开发者使用 npm 互相分享和借鉴。包的结构使您能够轻松跟踪依赖项和版本。下面是关于 npm 的快速介绍:npm 由三个独立的部分组成:网站网站 是开发者查找包(package)、设置参数以及管理 npm 使用体验的主要途径。注册表(registry)注册表 是一个巨大的数据库,保存了每个包(package)的信息。命令行工具 (CLI)CLI 通过命令行或终端运行。开发者通过 CLI 与 npm 打交道。yarnYarn发布于2016年10月,并在Github上迅速拥有了2.4万个Star。而npm只有1.2万个star。这个项目由一些高级开发人员维护,包括了Sebastian McKenzie(Babel.js)和Yehuda Katz(Ember.js、Rust、Bundler等)。Yarn一开始的主要目标是解决上一节中描述的由于语义版本控制而导致的npm安装的不确定性问题。虽然可以使用npm shrinkwrap来实现可预测的依赖关系树,但它并不是默认选项,而是取决于所有的开发人员知道并且启用这个选项。Yarn采取了不同的做法。每个yarn安装都会生成一个类似于npm-shrinkwrap.json的yarn.lock文件,而且它是默认创建的。除了常规信息之外,yarn.lock文件还包含要安装的内容的校验和,以确保使用的库的版本相同。yarn的优化主要体现在:速度快 :并行安装:无论 npm 还是 Yarn 在执行包的安装时,都会执行一系列任务。npm 是按照队列执行每个 package,也就是说必须要等到当前 package 安装完成之后,才能继续后面的安装。而 Yarn 是同步执行所有任务,提高了性能。离线模式:如果之前已经安装过一个软件包,用Yarn再次安装时之间从缓存中获取,就不用像npm那样再从网络下载了。安装版本统一:为了防止拉取到不同的版本,Yarn 有一个锁定文件 (lock file) 记录了被确切安装上的模块的版本号。每次只要新增了一个模块,Yarn 就会创建(或更新)yarn.lock 这个文件。这么做就保证了,每一次拉取同一个项目依赖时,使用的都是一样的模块版本。更好的语义化: yarn改变了一些npm命令的名称,比如 yarn add/remove,感觉上比 npm 原本的 install/uninstall 要更清晰。node包的安装执行工程自身 preinstall当前 npm 工程如果定义了 preinstall 钩子此时会被执行。确定首层依赖模块首先需要做的是确定工程中的首层依赖,也就是 dependencies 和 devDependencies 属性中直接指定的模块(假设此时没有添加 npm install 参数)。工程本身是整棵依赖树的根节点,每个首层依赖模块都是根节点下面的一棵子树,npm 会开启多进程从每个首层依赖模块开始逐步寻找更深层级的节点。获取模块获取模块是一个递归的过程,分为以下几步:获取模块信息。在下载一个模块之前,首先要确定其版本,这是因为 package.json 中往往是 semantic version(semver,语义化版本)。此时如果版本描述文件(npm-shrinkwrap.json 或 package-lock.json)中有该模块信息直接拿即可,如果没有则从仓库获取。如 packaeg.json 中某个包的版本是 ^1.1.0,npm 就会去仓库中获取符合 1.x.x 形式的最新版本。获取模块实体。上一步会获取到模块的压缩包地址(resolved 字段),npm 会用此地址检查本地缓存,缓存中有就直接拿,如果没有则从仓库下载。查找该模块依赖,如果有依赖则回到第1步,如果没有则停止。模块扁平化(dedupe)上一步获取到的是一棵完整的依赖树,其中可能包含大量重复模块。比如 A 模块依赖于 loadsh,B 模块同样依赖于 lodash。在 npm3 以前会严格按照依赖树的结构进行安装,因此会造成模块冗余。yarn和从 npm5 开始默认加入了一个 dedupe 的过程。它会遍历所有节点,逐个将模块放在根节点下面,也就是 node-modules 的第一层。当发现有重复模块时,则将其丢弃。这里需要对重复模块进行一个定义,它指的是模块名相同且 semver 兼容。每个 semver 都对应一段版本允许范围,如果两个模块的版本允许范围存在交集,那么就可以得到一个兼容版本,而不必版本号完全一致,这可以使更多冗余模块在 dedupe 过程中被去掉。安装模块这一步将会更新工程中的node_modules,并执行模块中的生命周期函数(按照 preinstall、install、postinstall 的顺序)。执行工程自身生命周期当前 npm 工程如果定义了钩子此时会被执行(按照 install、postinstall、prepublish、prepare 的顺序)。包依赖关系我们要使用模块A,而模块A又依赖于模块B,模块B又依赖于模块C和模块D,npm可以根据依赖关系,把所有依赖的包都下载下来并管理起来,而这种依赖又有不一样的表现形式。嵌套依赖扁平依赖嵌套依赖假设目前工程依赖 A, B, C 三个库,而他们对某个库 somelib 存在这样的依赖关系:A - somelib 1.4.xB - somelib 1.6.xC - somelib 1.6.x如果要安装 ABC 三个库,那么 somelib 会存在版本冲突。npm5+/yarn 会在实际安装时,给三个库分别下载各自依赖的 somelib 版本。假设 npm 先安装了 A, 由于 A 依赖 somelib 1.4.x 版本,那么 自身依赖先安装1.4.x 。再安装 B, C 时,由于 B, C 依赖的都不是 1.4.x, 于是安装完之后,关系就变成这个样子了:node_modules├── A│ └── node_modules│ └── somelib 1.4.x├── B│ └── node_modules│ └── somelib 1.6.x└── C └── node_modules └── somelib 1.6.x这样就是嵌套依赖。很显然这种方式很大的浪费了磁盘空间。扁平依赖当关联依赖中包括对某个软件包的重复引用,在实际安装时将尽量避免重复的创建。假设目前工程依赖 A, B, C 三个库,而他们对某个库 somelib 存在这样的依赖关系:A - somelib 1.4.xB - somelib 1.6.xC - somelib 1.6.x如果要安装 ABC 三个库,那么 somelib 会存在版本冲突。npm5+/yarn 会在实际安装时,给三个库分别下载各自依赖的 somelib 版本。假设 npm 先安装了 A, 由于 A 依赖 somelib 1.4.x 版本,那么 1.4.x 会变成主版本。再安装 B, C 时,由于 B, C 依赖的都不是 1.4.x, 于是安装完之后,关系就变成这个样子了:node_modules├── A├── somelib 1.4.x├── B│ └── node_modules│ └── somelib 1.6.x└── C └── node_modules └── somelib 1.6.x这样就是扁平依赖。需要注意的是,明明 B, C 都依赖 1.6.x 版本,实际上 npm5+/yarn 却要把这个版本保存两次,这样明显是对磁盘空间的浪费。我们把这种情况就称为不完全扁平的。目前这种情况还无法安全解决。lock文件锁文件是由包管理器自动生成的。它包含了重现全部的依赖源码树需要的所有信息、你的项目依赖中的所有信息,以及它们各自的版本。现在值得强调的是,Yarn 使用了锁文件,而 npm5以前没有默认锁文件,npm5之后加入了默认锁文件功能。我们会谈到这种差别导致的一些后果。既然我已经向你介绍了包管理器这部分,现在我们来讨论依赖本身。目前常见的两种lock文件:packahe-lock.json 是npm5之后默认生成的锁文件yarn.lock 是yarn的锁文件packahe-lock.json解析{ “name”: “package-name”, “version”: “1.0.0”, “lockfileVersion”: 1, “dependencies”: { “cacache”: { “version”: “9.2.6”, “resolved”: “https://registry.npmjs.org/cacache/-/cacache-9.2.6.tgz", “integrity”: “sha512-YK0Z5Np5t755edPL6gfdCeGxtU0rcW/DBhYhYVDckT+7AFkCCtedf2zru5NRbBLFk6e7Agi/RaqTOAfiaipUfg==” }, “duplexify”: { “version”: “3.5.0”, “resolved”: “https://registry.npmjs.org/duplexify/-/duplexify-3.5.0.tgz", “integrity”: “sha1-GqdzAC4VeEV+nZ1KULDMquvL1gQ=”, “dependencies”: { “end-of-stream”: { “version”: “1.0.0”, “resolved”: “https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.0.0.tgz", “integrity”: “sha1-1FlucCc0qT5A6a+GQxnqvZn/Lw4=” }, } }}可以看出来,package-lock.json把所有的包的依赖顺序列出来,第一次出现的包名会提升到顶层,后面重复出现的将会放入被依赖包的node_modules当中。引起不完全扁平化问题。yarn.lock解析# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.# yarn lockfile v1package-1@^1.0.0: version “1.0.3” resolved “https://registry.npmjs.org/package-1/-/package-1-1.0.3.tgz#a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0"package-2@^2.0.0: version “2.0.1” resolved “https://registry.npmjs.org/package-2/-/package-2-2.0.1.tgz#a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0" dependencies: package-4 “^4.0.0"package-3@^3.0.0: version “3.1.9” resolved “https://registry.npmjs.org/package-3/-/package-3-3.1.9.tgz#a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0" dependencies: package-4 “^4.5.0"package-4@^4.0.0, package-4@^4.5.0: version “4.6.3” resolved “https://registry.npmjs.org/package-4/-/package-4-2.6.3.tgz#a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0"显然yarn.lock锁文件把所有的依赖包都扁平化的展示了出来,对于同名包但是semver不兼容的作为不同的字段放在了yarn.lock的同一级结构中。验证实例在一个测试package工程里面,安装了以下三个包,安装了react-router 3.2.1,另外安装了react-router-dom 4.3.1 和react-router-native 4.3.0,这两个都依赖"react-router”: “^4.3.0”,结果如下:.└── node_modules├── react-router-dom4.3.1│ └── react-router4.3.1├── react-router-native4.3.0│ └── react-router4.3.1└── react-router3.2.1查看package-lock.json结果和最后node_modules安装结果:查看yarn.lock结果和最后node_modules安装结果:lock官方介绍理解 NPM 5 中的 lock 文件知乎问答1知乎问答2 ...

November 20, 2018 · 2 min · jiezi

我们为什么需要 lock 文件

前言从 Yarn 横空出世推出 lock 文件以来,已经两年多时间了,npm 也在 5.0 版本加入了类似的功能,lock 文件越来越被开发者们接收和认可。本篇文章想从前端视角探讨一下我们为什么需要 lock 文件,以及它的一些成本与风险,当然其中一些观点对于后端也是适用的。为什么需要 lock 文件之所以需要 lock 文件,我觉得主要有 4 个原因:确保各环境依赖版本的一致性软件开发一般有着好几个环境,通常包括本地开发环境、集成测试环境、预发布环境以及线上环境。各环境依赖版本不一致通常是 bug 的一大来源,大家可能碰到过“在我的电脑上是好的”这种问题,也许就是依赖版本不一致导致的。这种问题通常很难定位,因为你很难确定到底是自己的问题还是依赖的问题。这也是 Yarn 推出 lock 文件的初衷之一,使用了 lock 文件,你在排查问题时至少可以排除依赖版本不一致这个因素。语义化版本并不绝对可靠一些开发者不愿意使用 lock 文件,一个主要原因是他们希望基于语义化版本号让依赖自动升级,认为只要选择的依赖可靠,大版本不变化就可以放心升级。在绝大多数情况下这么做不会有问题,但是也有意外情况,比如:React 在 v16.4.0 对 getDerivedStateFromProps 的调用时机进行了调整。React 在 v16.3.0 引入了这个 API,最初只有在父组件引起的重渲染过程中会被调用,v16.4.0 调整为在所有渲染过程中都会被调用。如果你在不知情的情况下(自动)把 React 从 v16.3.0 升级到了 v16.4.0,那么极端情况下你的应用就会出问题。虽然只有在很极端的情况下你才会碰到类似问题,但是这种问题本来就是不怕一万就怕万一。可控的升级依赖现在通过 webpack 把依赖单独提取为一个 vendor.js 是个很常见的做法,因为依赖变更相对来说没那么频繁,再配合上强缓存,可以做到即使发布了新版本,用户也可以使用缓存的 vendor.js 而不必重新下载。通常我们的应用不止一个依赖,这些依赖肯定也不是同一时间发布更新,如果不使用 lock 文件让其自由更新,可能会导致 vendor.js 缓存失效多次(每个依赖更新都会导致缓存失效)。如果使用 lock 文件就可以积累一段时间,让多个依赖集中更新,甚至跳过一些小版本更新,从而提高 vendor.js 的缓存命中率。安全问题几个月前 ESLint 发生了一个安全事故,一个攻击者窃取了 ESLint 维护者的 npm 账户,并发布了恶意版本的 eslint-scope 和 eslint-config-eslint(都是更新的小版本),其中前者是 babel-eslint 和 webpack 的依赖。如果没有使用 lock 文件,那么你就极有可能中招,ESLint 事后也建议开发者使用 lock 文件来避免自动安装新版本。成本使用 lock 文件自然会增加一点项目的维护成本,因为依赖不会再自动升级,所以需要项目维护者每隔一段时间手动进行升级。另外如果两个人同时修改了依赖,解决 lock 文件的冲突也是一件很麻烦的事。但是手动升级依赖也有一些额外的好处,至少你升级每个依赖时都要去看一下它的 change log,这样可以对每一次升级做到心中有数,这也有助于你掌握依赖的发展趋势。比如前文提到的 React 的例子,只要你在升级时看一眼它的 change log,就很容易避开可能出现的问题。风险我唯一能想到的风险就是依赖版本固化问题,如果你使用了 lock 文件又没有花时间跟精力去维护它,那么你的项目就很容易陷入依赖版本固化的问题。如果太久没有升级依赖,你当前使用的版本跟最新版差别太大,升级就会很困难,考虑到现实成本问题,可能就永远不会升级了。但是如果不使用 lock 文件就能完全避免这个问题吗,我想也不一定。不使用 lock 文件最多也只能在同一个大版本范围内自动升级,如果依赖升级了大版本,你没有花时间去升级,也会碰到同样的问题。只是相对于不使用 lock 文件,问题暴露的晚一些而已。 ...

November 6, 2018 · 1 min · jiezi

别被官方文档迷惑了!这篇文章帮你详解yarn公平调度

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~本文由@edwinhzhang发表于云+社区专栏FairScheduler是yarn常用的调度器,但是仅仅参考官方文档,有很多参数和概念文档里没有详细说明,但是这些参明显会影响到集群的正常运行。本文的主要目的是通过梳理代码将关键参数的功能理清楚。下面列出官方文档中常用的参数:yarn.scheduler.fair.preemption.cluster-utilization-thresholdThe utilization threshold after which preemption kicks in. The utilization is computed as the maximum ratio of usage to capacity among all resources. Defaults to 0.8f.yarn.scheduler.fair.update-interval-msThe interval at which to lock the scheduler and recalculate fair shares, recalculate demand, and check whether anything is due for preemption. Defaults to 500 ms.maxAMSharelimit the fraction of the queue’s fair share that can be used to run application masters. This property can only be used for leaf queues. For example, if set to 1.0f, then AMs in the leaf queue can take up to 100% of both the memory and CPU fair share. The value of -1.0f will disable this feature and the amShare will not be checked. The default value is 0.5f.minSharePreemptionTimeoutnumber of seconds the queue is under its minimum share before it will try to preempt containers to take resources from other queues. If not set, the queue will inherit the value from its parent queue.fairSharePreemptionTimeoutnumber of seconds the queue is under its fair share threshold before it will try to preempt containers to take resources from other queues. If not set, the queue will inherit the value from its parent queue.fairSharePreemptionThresholdIf the queue waits fairSharePreemptionTimeout without receiving fairSharePreemptionThresholdfairShare resources, it is allowed to preempt containers to take resources from other queues. If not set, the queue will inherit the value from its parent queue.在上述参数描述中,timeout等参数值没有给出默认值,没有告知不设置会怎样。minShare,fairShare等概念也没有说清楚,很容易让人云里雾里。关于这些参数和概念的详细解释,在下面的分析中一一给出。FairScheduler整体结构 图(1) FairScheduler 运行流程图公平调度器的运行流程就是RM去启动FairScheduler,SchedulerDispatcher两个服务,这两个服务各自负责update线程,handle线程。update线程有两个任务:(1)更新各个队列的资源(Instantaneous Fair Share),(2)判断各个leaf队列是否需要抢占资源(如果开启抢占功能)handle线程主要是处理一些事件响应,比如集群增加节点,队列增加APP,队列删除APP,APP更新container等。FairScheduler类图图(2) FairScheduler相关类图队列继承模块:yarn通过树形结构来管理队列。从管理资源角度来看,树的根节点root队列(FSParentQueue),非根节点(FSParentQueue),叶子节点(FSLeaf),app任务(FSAppAttempt,公平调度器角度的App)都是抽象的资源,它们都实现了Schedulable接口,都是一个可调度资源对象。它们都有自己的fair share(队列的资源量)方法(这里又用到了fair share概念),weight属性(权重)、minShare属性(最小资源量)、maxShare属性(最大资源量),priority属性(优先级)、resourceUsage属性(资源使用量属性)以及资源需求量属性(demand),同时也都实现了preemptContainer抢占资源的方法,assignContainer方法(为一个ACCEPTED的APP分配AM的container)。public interface Schedulable { /** * Name of job/queue, used for debugging as well as for breaking ties in * scheduling order deterministically. / public String getName(); /* * Maximum number of resources required by this Schedulable. This is defined as * number of currently utilized resources + number of unlaunched resources (that * are either not yet launched or need to be speculated). / public Resource getDemand(); /* Get the aggregate amount of resources consumed by the schedulable. / public Resource getResourceUsage(); /* Minimum Resource share assigned to the schedulable. / public Resource getMinShare(); /* Maximum Resource share assigned to the schedulable. / public Resource getMaxShare(); /* Job/queue weight in fair sharing. / public ResourceWeights getWeights(); /* Start time for jobs in FIFO queues; meaningless for QueueSchedulables./ public long getStartTime(); /** Job priority for jobs in FIFO queues; meaningless for QueueSchedulables. / public Priority getPriority(); /* Refresh the Schedulable’s demand and those of its children if any. / public void updateDemand(); /* * Assign a container on this node if possible, and return the amount of * resources assigned. / public Resource assignContainer(FSSchedulerNode node); /* * Preempt a container from this Schedulable if possible. / public RMContainer preemptContainer(); /* Get the fair share assigned to this Schedulable. / public Resource getFairShare(); /* Assign a fair share to this Schedulable. / public void setFairShare(Resource fairShare);}队列运行模块:从类图角度描述公平调度的工作原理。SchedulerEventDispatcher类负责管理handle线程。FairScheduler类管理update线程,通过QueueManager获取所有队列信息。我们从Instantaneous Fair Share 和Steady Fair Share 这两个yarn的基本概念开始进行代码分析。Instantaneous Fair Share & Steady Fair ShareFair Share指的都是Yarn根据每个队列的权重、最大,最小可运行资源计算的得到的可以分配给这个队列的最大可用资源。本文描述的是公平调度,公平调度的默认策略FairSharePolicy的规则是single-resource,即只关注内存资源这一项指标。Steady Fair Share:是每个队列内存资源量的固定理论值。Steady Fair Share在RM初期工作后不再轻易改变,只有后续在增加节点(addNode)时才会重新计算。RM的初期工作也是handle线程把集群的每个节点添加到调度器中(addNode)。Instantaneous Fair Share:是每个队列的内存资源量的实际值,是在动态变化的。yarn里的fair share如果没有专门指代,都是指的的Instantaneous Fair Share。1 Steady Fair Share计算方式 图(3) steady fair share 计算流程handle线程如果接收到NODE_ADDED事件,会去调用addNode方法。 private synchronized void addNode(RMNode node) { FSSchedulerNode schedulerNode = new FSSchedulerNode(node, usePortForNodeName); nodes.put(node.getNodeID(), schedulerNode); //将该节点的内存加入到集群总资源 Resources.addTo(clusterResource, schedulerNode.getTotalResource()); //更新available资源 updateRootQueueMetrics(); //更新一个container的最大分配,就是UI界面里的MAX(如果没有记错的话) updateMaximumAllocation(schedulerNode, true); //设置root队列的steadyFailr=clusterResource的总资源 queueMgr.getRootQueue().setSteadyFairShare(clusterResource); //重新计算SteadyShares queueMgr.getRootQueue().recomputeSteadyShares(); LOG.info(“Added node " + node.getNodeAddress() + " cluster capacity: " + clusterResource); }recomputeSteadyShares 使用广度优先遍历计算每个队列的内存资源量,直到叶子节点。 public void recomputeSteadyShares() { //广度遍历整个队列树 //此时getSteadyFairShare 为clusterResource policy.computeSteadyShares(childQueues, getSteadyFairShare()); for (FSQueue childQueue : childQueues) { childQueue.getMetrics().setSteadyFairShare(childQueue.getSteadyFairShare()); if (childQueue instanceof FSParentQueue) { ((FSParentQueue) childQueue).recomputeSteadyShares(); } } }computeSteadyShares方法计算每个队列应该分配到的内存资源,总体来说是根据每个队列的权重值去分配,权重大的队列分配到的资源更多,权重小的队列分配到得资源少。但是实际的细节还会受到其他因素影响,是因为每队列有minResources和maxResources两个参数来限制资源的上下限。computeSteadyShares最终去调用computeSharesInternal方法。比如以下图为例:图中的数字是权重,假如有600G的总资源,parent=300G,leaf1=300G,leaf2=210G,leaf3=70G。图(4) yarn队列权重computeSharesInternal方法概括来说就是通过二分查找法寻找到一个资源比重值R(weight-to-slots),使用这个R为每个队列分配资源(在该方法里队列的类型是Schedulable,再次说明队列是一个资源对象),公式是steadyFairShare=R * QueueWeights。computeSharesInternal是计算Steady Fair Share 和Instantaneous Fair Share共用的方法,根据参数isSteadyShare来区别计算。之所以要做的这么复杂,是因为队列不是单纯的按照比例来分配资源的(单纯按权重比例,需要maxR,minR都不设置。maxR的默认值是0x7fffffff,minR默认值是0)。如果设置了maxR,minR,按比例分到的资源小于minR,那么必须满足minR。按比例分到的资源大于maxR,那么必须满足maxR。因此想要找到一个R(weight-to-slots)来尽可能满足:R(Queue1Weights + Queue2Weights+…+QueueNWeights) <=totalResourceRQueueWeights >= minShareRQueueWeights <= maxShare注:QueueNWeights为队列各自的权重,minShare和maxShare即各个队列的minResources和maxResourcescomputcomputeSharesInternal详细来说分为四个步骤:确定可用资源:totalResources = min(totalResources-takenResources(fixedShare), totalMaxShare)确定R上下限二分查找法逼近R使用R设置fair Share private static void computeSharesInternal( Collection<? extends Schedulable> allSchedulables, Resource totalResources, ResourceType type, boolean isSteadyShare) { Collection<Schedulable> schedulables = new ArrayList<Schedulable>(); //第一步 //排除有固定资源不能动的队列,并得出固定内存资源 int takenResources = handleFixedFairShares( allSchedulables, schedulables, isSteadyShare, type); if (schedulables.isEmpty()) { return; } // Find an upper bound on R that we can use in our binary search. We start // at R = 1 and double it until we have either used all the resources or we // have met all Schedulables’ max shares. int totalMaxShare = 0; //遍历schedulables(非固定fixed队列),将各个队列的资源相加得到totalMaxShare for (Schedulable sched : schedulables) { int maxShare = getResourceValue(sched.getMaxShare(), type); totalMaxShare = (int) Math.min((long)maxShare + (long)totalMaxShare, Integer.MAX_VALUE); if (totalMaxShare == Integer.MAX_VALUE) { break; } } //总资源要减去fiexd share int totalResource = Math.max((getResourceValue(totalResources, type) - takenResources), 0); //队列所拥有的最大资源是有集群总资源和每个队列的MaxResource双重限制 totalResource = Math.min(totalMaxShare, totalResource); //第二步:设置R的上下限 double rMax = 1.0; while (resourceUsedWithWeightToResourceRatio(rMax, schedulables, type) < totalResource) { rMax = 2.0; } //第三步:二分法逼近合理R值 // Perform the binary search for up to COMPUTE_FAIR_SHARES_ITERATIONS steps double left = 0; double right = rMax; for (int i = 0; i < COMPUTE_FAIR_SHARES_ITERATIONS; i++) { double mid = (left + right) / 2.0; int plannedResourceUsed = resourceUsedWithWeightToResourceRatio( mid, schedulables, type); if (plannedResourceUsed == totalResource) { right = mid; break; } else if (plannedResourceUsed < totalResource) { left = mid; } else { right = mid; } } //第四步:使用R值设置,确定各个非fixed队列的fairShar,意味着只有活跃队列可以分资源 // Set the fair shares based on the value of R we’ve converged to for (Schedulable sched : schedulables) { if (isSteadyShare) { setResourceValue(computeShare(sched, right, type), ((FSQueue) sched).getSteadyFairShare(), type); } else { setResourceValue( computeShare(sched, right, type), sched.getFairShare(), type); } } }(1) 确定可用资源handleFixedFairShares方法来统计出所有fixed队列的fixed内存资源(fixedShare)相加,并且fixed队列排除掉不得瓜分系统资源。yarn确定fixed队列的标准如下: private static int getFairShareIfFixed(Schedulable sched, boolean isSteadyShare, ResourceType type) { //如果队列的maxShare <=0 则是fixed队列,fixdShare=0 if (getResourceValue(sched.getMaxShare(), type) <= 0) { return 0; } //如果是计算Instantaneous Fair Share,并且该队列内没有APP再跑, // 则是fixed队列,fixdShare=0 if (!isSteadyShare && (sched instanceof FSQueue) && !((FSQueue)sched).isActive()) { return 0; } //如果队列weight<=0,则是fixed队列 //如果对列minShare <=0,fixdShare=0,否则fixdShare=minShare if (sched.getWeights().getWeight(type) <= 0) { int minShare = getResourceValue(sched.getMinShare(), type); return (minShare <= 0) ? 0 : minShare; } return -1; }(2)确定R上下限R的下限为1.0,R的上限是由resourceUsedWithWeightToResourceRatio方法来确定。该方法确定的资源值W,第一步中确定的可用资源值T:W>=T时,R才能确定。//根据R值去计算每个队列应该分配的资源 private static int resourceUsedWithWeightToResourceRatio(double w2rRatio, Collection<? extends Schedulable> schedulables, ResourceType type) { int resourcesTaken = 0; for (Schedulable sched : schedulables) { int share = computeShare(sched, w2rRatio, type); resourcesTaken += share; } return resourcesTaken; } private static int computeShare(Schedulable sched, double w2rRatio, ResourceType type) { //share=Rweight,type是内存 double share = sched.getWeights().getWeight(type) * w2rRatio; share = Math.max(share, getResourceValue(sched.getMinShare(), type)); share = Math.min(share, getResourceValue(sched.getMaxShare(), type)); return (int) share; }(3)二分查找法逼近R满足下面两个条件中的一个即可终止二分查找:W == T(步骤2中的W和T)超过25次(COMPUTE_FAIR_SHARES_ITERATIONS)(4)使用R设置fair share设置fair share时,可以看到区分了Steady Fair Share 和Instantaneous Fair Share。 for (Schedulable sched : schedulables) { if (isSteadyShare) { setResourceValue(computeShare(sched, right, type), ((FSQueue) sched).getSteadyFairShare(), type); } else { setResourceValue( computeShare(sched, right, type), sched.getFairShare(), type); } }2 Instaneous Fair Share计算方式图(5)Instaneous Fair Share 计算流程该计算方式与steady fair的计算调用栈是一致的,最终都要使用到computeSharesInternal方法,唯一不同的是计算的时机不一样。steady fair只有在addNode的时候才会重新计算一次,而Instantaneous Fair Share是由update线程定期去更新。此处强调的一点是,在上文中我们已经分析如果是计算Instantaneous Fair Share,并且队列为空,那么该队列就是fixed队列,也就是非活跃队列,那么计算fair share时,该队列是不会去瓜分集群的内存资源。而update线程的更新频率就是由 yarn.scheduler.fair.update-interval-ms来决定的。private class UpdateThread extends Thread { @Override public void run() { while (!Thread.currentThread().isInterrupted()) { try { //yarn.scheduler.fair.update-interval-ms Thread.sleep(updateInterval); long start = getClock().getTime(); // 更新Instantaneous Fair Share update(); //抢占资源 preemptTasksIfNecessary(); long duration = getClock().getTime() - start; fsOpDurations.addUpdateThreadRunDuration(duration); } catch (InterruptedException ie) { LOG.warn(“Update thread interrupted. Exiting.”); return; } catch (Exception e) { LOG.error(“Exception in fair scheduler UpdateThread”, e); } } } }3 maxAMShare意义handle线程如果接收到NODE_UPDATE事件,如果(1)该node的机器内存资源满足条件,(2)并且有ACCEPTED状态的Application,那么将会为该待运行的APP的AM分配一个container,使该APP在所处的queue中跑起来。但在分配之前还需要一道检查canRuunAppAM。能否通过canRuunAppAM,就是由maxAMShare参数限制。 public boolean canRunAppAM(Resource amResource) { //默认是0.5f float maxAMShare = scheduler.getAllocationConfiguration().getQueueMaxAMShare(getName()); if (Math.abs(maxAMShare - -1.0f) < 0.0001) { return true; } //该队的maxAMResource=maxAMShare * fair share(Instantaneous Fair Share) Resource maxAMResource = Resources.multiply(getFairShare(), maxAMShare); //amResourceUsage是该队列已经在运行的App的AM所占资源累加和 Resource ifRunAMResource = Resources.add(amResourceUsage, amResource); //查看当前ifRunAMResource是否超过maxAMResource return !policy .checkIfAMResourceUsageOverLimit(ifRunAMResource, maxAMResource); }上面代码我们用公式来描述:队列中运行的APP为An,每个APP的AM占用资源为RACCEPTED状态(待运行)的APP的AM大小为R1队列的fair share为QueFS队列的maxAMResource=maxAMShare * QueFSifRunAMResource=A1.R+A2.R+…+An.R+R1ifRunAMResource > maxAMResource,则该队列不能接纳待运行的APP之所以要关注这个参数,是因为EMR很多客户在使用公平队列时会反映集群的总资源没有用满,但是还有APP在排队,没有跑起来,如下图所示:图(6) APP阻塞实例公平调度默认策略不关心Core的资源,只关心Memory。图中Memory用了292G,还有53.6G的内存没用,APP就可以阻塞。原因就是default队列所有运行中APP的AM资源总和超过了(345.6 * 0.5),导致APP阻塞。总结通过分析fair share的计算流程,搞清楚yarn的基本概念和部分参数,从下面的表格对比中,我们也可以看到官方的文档对概念和参数的描述是比较难懂的。剩余的参数放在第二篇-公平调度之抢占中分析。 官方描述总结Steady Fair ShareThe queue’s steady fair share of resources. These shares consider all the queues irrespective of whether they are active (have running applications) or not. These are computed less frequently and change only when the configuration or capacity changes.They are meant to provide visibility into resources the user can expect, and hence displayed in the Web UI.每个非fixed队列内存资源量的固定理论值。Steady Fair Share在RM初期工作后不再轻易改变,只有后续在增加节点改编配置(addNode)时才会重新计算。RM的初期工作也是handle线程把集群的每个节点添加到调度器中(addNode)。Instantaneous Fair ShareThe queue’s instantaneous fair share of resources. These shares consider only actives queues (those with running applications), and are used for scheduling decisions. Queues may be allocated resources beyond their shares when other queues aren’t using them. A queue whose resource consumption lies at or below its instantaneous fair share will never have its containers preempted.每个非fixed队列(活跃队列)的内存资源量的实际值,是在动态变化的,由update线程去定时更新队列的fair share。yarn里的fair share如果没有专门指代,都是指的的Instantaneous Fair Share。yarn.scheduler.fair.update-interval-msThe interval at which to lock the scheduler and recalculate fair shares, recalculate demand, and check whether anything is due for preemption. Defaults to 500 ms.update线程的间隔时间,该线程的工作是1更新fair share,2检查是否需要抢占资源。maxAMSharelimit the fraction of the queue’s fair share that can be used to run application masters. This property can only be used for leaf queues. For example, if set to 1.0f, then AMs in the leaf queue can take up to 100% of both the memory and CPU fair share. The value of -1.0f will disable this feature and the amShare will not be checked. The default value is 0.5f.队列所有运行中的APP的AM资源总和必须不能超过maxAMShare * fair share问答如何将yarn 升级到特定版本?相关阅读Yarn与MesosSpark on Yarn | Spark,从入门到精通YARN三大模块介绍 【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识 ...

October 8, 2018 · 7 min · jiezi