yarn安装依赖(Vue搬迁什么意思)

本文目录
- Vue搬迁什么意思
- vue运行npm run dev出现的怎么解决
- 前端入职需要安装什么环境
- 为什么我要选择使用Yarn来做Docker的调度引擎
- 如何使用spark将程序提交任务到yarn-Spark-about云开发
Vue搬迁什么意思
随着前段时间尤大在 vue3 以及 vite 仓库中切换包管理为 pnpm 的 pr 成功 merge,以及 vue 生态中的一些项目例如 VueUse 也切换使用 pnpm,宣告着 vue 生态中项目仓库完成了从原有的 yarn workspace monorepo 到 pnpm workspace monorepo 的迁移。
可以看到 vite 核心贡献者以及 vue 团队成员之一的 patak (github.com/patak-js) 在 twitter 上对这次项目迁移的生动描述:“项目如同多米诺骨牌一样倒向了 pnpm”。
可以看到这两个的迁移 pr 都是由尤大亲手完成改造,同时 pnpm 作者的本人zkochan(github: github.com/zkochan) 也亲自帮 vite 迁移的 pr 做了 code review。以上几个项目都是基于 monorepo 来做的仓库管理,pnpm 的 workspace 在 monorepo 场景下是有着极好的支持,当然也有非 monorepo 项目的迁移,例如由笔者迁移的 naive-ui 仓库的项目中包管理工具为 pnpm 用于提升 CI 下依赖安装速度的提升
因为 vite 目前会在一些场景下使用到 esbuild 这个库:例如目前开发阶段 vite 会使用 esbuild 进行依赖预打包,来将第三方依赖转成 ESM 格式的 bundle 产物。这样的关系使得 esbuild 作为了 vite 的一个底层依赖,前面也提到过 vite 本身仓库是基于 yarn workspace monorepo 搭建的,因此每次在开发 vite 时使用 yarn 安装依赖的过程中,都会去安装 esbuild 以及相关的包
vue运行npm run dev出现的怎么解决
上面提示了,翻译一下
(package.json存在,但是 node_modules不存在,你的意思是安装吗?)
这个意思是你没有安装依赖项,需要先安装依赖项。运行
npm install
进行安装。如果嫌npm慢可以使用yarn或者cnpm安装依赖,
安装完毕就可以运行了
npm start
前端入职需要安装什么环境
一、基础环境
Node.js 是JavaScript运行时,目前前端工程化必不可缺的一个环境。通常我们会选择稳定版本(LTS)进行下载。
NPM 是javascript的包管理工具,也是目前Node.js默认的包管理工具。一般下载了Node.js后会附带npm,不用专门的去下载。
YARN 是Fackbook开源的依赖管理包,和npm是做同样的工作,但相比npm安装依赖的速度会更加迅速。两者都是讲依赖写入package.json中,在使用习惯上是相近的。
Git 是最先进的代码版本控制软件。
二、开发环境
器
目前前端开发主流的器有 sublimeText、WebStorm、vscode,三种主流器各有特点:
sublimeText是一个十分轻巧的器,器是付费软件,可以无限试用。在 macOS 上下载该软件仅需 15.2MB. 需要安装相应的插件,比如你可能需要某个语言的语法高亮,因此你需要在 store 上找到相应插件来提高你开发体验。
webStorm 是一个功能强大的器,同时也是一个付费软件,并不像sublimeText那样可以无限试用,由于功能太过于齐全,一些低配置的电脑可能会吃不消。以上特点是群友对webStorm的评价,笔者没有使用该器,不过多评论。
vsocde 是由微软开源的一个器,虽然是后起之秀,但开源后该器的设计与体验迅速吸引了一大批用户。它内置了一些前端基础的开发环境,针对Node.js还可以进行短点调试。
vscode其中有一个插件叫做 setiings sync , 它可以将你的器配置上传至gist。就算你换了一个全新的设备,下载vscode后,再下载该插件,传入Token后就可以同步你所有的配置,十分的方便~
vscode的配置可以查看具体教程
浏览器
前端的工作更多时候是与用户打交道,我们的工作产出通常在浏览器页面上呈现。
浏览器通常提供了开发者工具以供开发者调试,目前市面上主流的浏览器主要就是chrome、Safari、IE/Edge、opera、firefox这五种浏览器。国内市场有UC浏览器等,但内核的大多都是采用webkit或者兼容低版本IE内核。
从 statcounter 统计数据来看,目前主要的趋势还是以chrome所使用的webkit内核作为主流,同时chrome的开发者工具对于开发人员十分的友好,因此有很多的开发者选择了该浏览器作为首选的调试工具。chrome还有一个便利就是登陆了谷歌账号后,可以在别的机器上进行同步插件和配置。
为什么我要选择使用Yarn来做Docker的调度引擎
可部署性
先说明下,这里探讨的是Yarn或者Mesos集群的部署,不涉其上的应用。Yarn除了依赖JDK,对操作系统没有任何依赖,基本上放上去就能
跑。Mesos因为是C/C++开发的,安装部署可能会有库依赖。
这点我不知道大家是否看的重,反正我是看的相当重的。软件就应该是下下来就可以Run。所以12年的时候我就自己开发了一套Java服务框架,开发完之后
运行个main方法就行。让应用包含容器,而不是要把应用丢到Tomcat这些容器,太复杂,不符合直觉。
二次开发
Yarn 对Java/Scala工程师而言,只是个Jar包,类似索引开发包Lucene,你可以把它引入项目,做任何你想要的包装。 这是其一。
其二,Yarn提供了非常多的扩展接口,很多实现都是可插拔。可替换的,在XML配置下,可以很方便的用你的实现替换掉原来的实现,没有太大的侵入性,所以就算是未来Yarn升级,也不会有太大问题。
相比较而言,Mesos更像是一个已经做好的产品,部署了可以直接用,但是对二次开发并不友好。
生态优势
Yarn 诞生于Hadoop这个大数据的“始作俑者”项目,所以在大数据领域具有先天优势。
底层天然就是分布式存储系统HDFS,稳定高效。
其上支撑了Spark、MR等大数据领域的扛顶之座,久经考验。
社区强大,最近发布版本也明显加快,对于长任务的支持也越来越优秀。
长任务支持
谈及长任务(long running
services)的支持,有人认为早先Yarn是为了支持离线短时任务的,所以可能对长任务的支持有限。其实大可不必担心,譬如现在基于其上的
Spark Streaming就是7x24小时运行的,跑起来也没啥问题。一般而言,要支持长任务,需要考虑如下几个点:
Fault tolerance,主要是AM的容错。
Yarn Security,如果开启了安全机制,令牌等的失效时间也是需要注意的。
日志收集到集群。
还有就是资源隔离和优先级。如果资源隔离做的太差,会对长时任务产生影响。
大家感兴趣可以先参考Jira。我看这个Jira 13年就开始了,说明这事很早就被重视起来了。下面我们队提到的几个点做下解释。
Fault tolerance
Yarn 自身高可用。目前Yarn的Master已经实现了HA。
AM容错,我看从2.4版本(看的源码,也可能更早的版本就已经支持)就已经支持 keep containers across
attempt
的选项了。什么意思呢?就是如果AM挂掉了,在Yarn重新启动AM的过程中,所有由AM管理的容器都会被保持而不会被杀掉。除非Yarn多次尝试都没办
法把AM再启动起来(默认两次)。 这说明从底层调度上来看,已经做的很好了。
日志收集到集群
日志收集在2.6版本已经是边运行边收集了。
资源隔离
资源隔离的话,Yarn做的不好,目前有效的是内存,对其他方面一直想做支持,但一直有限。这估计也是很多人最后选择Mesos的缘由。但是现在这
点优势Mesos其实已经荡然无存,因为Docker容器在资源隔离上已经做的足够好。Yarn和Docker一整合,就互补了。
小结
Mesos 和 Yarn 都是非常优秀的调度框架,各有其优缺点,弹性调度,统一的资源管理是未来平台的一个趋势,类似的这种资源管理调度框架必定会大行其道。
一些常见的误解
脱胎于Hadoop,继承了他的光环和生态,然而这也会给其带来一定的困惑,首先就是光环一直被Hadoop给盖住了,而且由于固有的惯性,大家会理所当然的认为Yarn只是Hadoop里的一个组件,有人会想过把Yarn拿出来单独用么?
然而,就像我在之前的一篇课程里,反复强调,Hadoop是一个软件集合,包含分布式存储,资源管理调度,计算框架三个部分。他们之间没有必然的关
系,是可以独立开来的。而Yarn
就是一个资源管理调度引擎,其一开始的设计目标就是为了通用,不仅仅是跑MR。现在基于Yarn之上的服务已经非常多,典型的比如Spark。
这里还有另外一个误区,MR目前基本算是离线批量的代名词,这回让人误以为Yarn也只是适合批量离线任务的调度。其实不然,我在上面已经给出了分析,Yarn 是完全可以保证长任务的稳定可靠的运行的。
如何基于Yarn开发分布式程序
本文不会具体教你如何使用Yarn的API,不过如果你想知道Yarn的API,但是又觉得官方文档太过简略,我这里倒是可以给出两个建议:
代码使用范例可以参看Spark Yarn相关的代码。算的上是一个非常精简的Yarn的adaptor。
买本Yarn相关的书,了解其体系结构也有助于你了解其API的设计。
接下来的内容会探讨以下两个主题:
基于Yarn开发分布式程序需要做的一些准备工作
基于Yarn开发容器调度系统的一些基本思路
基于Yarn开发分布式程序需要做的一些准备工作
肯定不能撸起袖子就开始干。开始动手前,我们需要知道哪些事情呢?
Yarn原生的API太底层,太复杂了
如果你想愉快的开发Yarn的应用,那么对Yarn的API进行一次封装,是很有必要的。
Yarn为了灵活,或者为了能够满足开发者大部分的需求,底层交互的API就显得比较原始了。自然造成开发难度很大。这个也不是我一个人觉得,现在
Apache的Twill,以及Hulu他们开发的时候Adaptor那一层,其实都是为了解决这个问题。那为什么我没有用Twill呢,第一是文档实在
太少,第二是有点复杂,我不需要这么复杂的东西。我觉得,Twill与其开发这么多功能,真的不如好好写写文档。
最好是能开发一个解决一类问题的Framework
Yarn只是一个底层的资源管理和调度引擎。一般你需要基于之上开发一套解决特定问题的Framework。以Spark为例,他是解决分布式计算
相关的一些问题。而以我开发的容器调度程序,其实是为了解决动态部署Web应用的。在他们之上,才是你的应用。比如你要统计日志,你只要在Spark上开
发一个Application 。 比如你想要提供一个推荐系统,那么你只要用容器包装下,就能被容器调度程序调度部署。
所以通常而言,基于Yarn的分布式应用应该符合这么一个层次:
Yarn -》 Adapter -》 Framework -》 Application
Adapter 就是我第一条说的,你自个封装了Yarn的API。 Framework就是解决一类问题的编程框架,Application才是你真正要解决业务的系统。通过这种解耦,各个层次只要关注自己的核心功能点即可。
保证你上层的Framework/Application可以移植
Spark是个典型,他可以跑在Mesos上,也可以跑在Yarn上,还可以跑在自己上面(Standalone),实时上,泡在Yarn上的,以及跑Standalone模式的,都挺多的。这得益于Spark本身不依赖于底层的资源管理调度引擎。
这其实也是我上面说的两条带来的好处,因为有了Adaptor,上层的Framework可以不用绑死在某个资源调度引擎上。而Framework则可以让Applicaiton 无需关注底层调度的事情,只要关注业务即可。
另外,你费尽心机开发的Framework上,你自然是希望它能跑在更多的平台上,已满足更多的人的需求,对吧。
基于Yarn开发容器调度系统的一些基本思路
首先我们需要了解两个概念:
哑应用。所谓哑应用指的是无法和分布式系统直接进行交互,分布式系统也仅仅透过容器能进行生命周期的控制,比如关闭或者开启的应用。典型的比如MySQL、Nginx等这些基础应用。他们一般有自己特有的交互方式,譬如命令行或者socket协议或者HTTP协议。
伴生组件。因为有了哑应用的存在,分布式系统为了能够和这些应用交互,需要有一个代理。而这个代理和被代理的哑应用,具有相同的生命周期。典型
的比如,某个服务被关停后,该事件会被分布式系统获知,分布式系统会将该事件发送给Nginx的伴生组件,伴生组件转化为Nginx能够识别的指令,将停
止的服务从Nginx的ProxyBackend列表中剔除。
在容器调度系统中,如果Yarn的NodeManager直接去管理Docker则需要Yarn本身去做支持,我觉得这是不妥的。Yarn的职责就是做好资源管理,分配,调度即可,并不需要和特定的某个技术耦合,毕竟Yarn是一个通用型的资源调度管理框架。
那基于上面的理论,我们基于Yarn,开发一套框架,这个框架会是典型的 master-slave结构(这是Yarn决定的)。这个框架的 slaves 其实都是Docker 的伴生对象。master 可以通过这些Slave 对容器实现间接的管理。
我们简单描述下他们的流程:
用户提交Application,申请资源;
Yarn启动Framework的master;
Yarn启动Framework的slave;
slave 连接上master,并且发送心跳,从而master知道slave的状况slave启动Docker,slave与被启动的这个docker container 一一对应;
slave定时监控Container;
slave发现container crash,slave自动退出,Yarn获得通知,收回资源;
master发现有节点失败,发出新的节点要求,重新在另外一台服务器上启动slave,重复从2开始的步骤。
这里还有一个问题,如果slave 被正常杀掉,可以通过JVM ShudownHook 顺带把Container也关掉。
但是如果slave被kill -9
或者异常crash掉了,那么就可能导致资源泄露了。目前是这个信息是由master上报给集群管理平台,该平台会定时清理。你也可以存储该信息,譬如放
到Redis或者MySQL中,然后启动后台清理任务即可。
了解了这个思路后,具体实施就变得简单了,就是开发一个基于Yarn的master-slave程序即可,然后slave去管理对应的Docker容器,包括接受新的指令。master提供管理界面展示容器信息,运行状态即可。
当然,你还可以再开发一套Framework B专门和Nginx交互,这样比如上面的系统做了节点变更,通知B的master,然后B的master 通过自己的伴生组件Slave 完成Nginx的更新,从而实现后端服务的自动变更和通知。
如何使用spark将程序提交任务到yarn-Spark-about云开发
使用脚本提交
1.使用spark脚本提交到yarn,首先需要将spark所在的主机和hadoop集群之间hosts相互配置(也就是把spark主机的ip和主机名配置到hadoop所有节点的/etc/hosts里面,再把集群所有节点的ip和主机名配置到spark所在主机的/etc/hosts里面)。
2.然后需要把hadoop目录etc/hadoop下面的*-sit.xml复制到${SPARK_HOME}的conf下面.
3.确保hadoop集群配置了 HADOOP_CONF_DIR or YARN_CONF_DIR
1.yarn-standalone方式提交到yarn
在${SPARK_HOME}下面执行:
SPARK_JAR=./assembly/target/scala-2.10.4/spark-assembly-0.9.0-incubating-hadoop2.2.0.jar \
./bin/spark-class org.apache.spark.deploy.yarn.Client \
--jar ./examples/target/scala-2.10/spark-examples_2.10-assembly-0.9.0-incubating.jar \
--class org.apache.spark.examples.SparkPi \
--args yarn-standalone \
--num-workers 3 \
--master-memory 2g \
--worker-memory 2g \
--worker-cores 1
复制代码
2. yarn-client 方式提交到yarn
在${SPARK_HOME}下面执行:
SPARK_JAR=./assembly/target/scala-2.10.4/spark-assembly-0.9.0-incubating-hadoop2.2.0.jar \
SPARK_YARN_APP_JAR=examples/target/scala-2.10/spark-examples_2.10-assembly-0.9.0-incubating.jar \
./bin/run-example org.apache.spark.examples.SparkPi yarn-client
复制代码
二、使用程序提交
1.必须使用linux主机提交任务,使用windows提交到linux hadoop集群会报
org.apache.hadoop.util.Shell$ExitCodeException: /bin/bash: 第 0 行: fg: 无任务控制
复制代码
错误。hadoop2.2.0不支持windows提交到linux hadoop集群,网上搜索发现这是hadoop的bug。
2.提交任务的主机和hadoop集群主机名需要在hosts相互配置。
3.因为使用程序提交是使用yarn-client方式,所以必须像上面脚本那样设置环境变量SPARK_JAR 和 SPARK_YARN_APP_JAR
比如我的设置为向提交任务主机~/.bashrc里面添加:
export SPARK_JAR=file:///home/ndyc/software/sparkTest/lib/spark-assembly-0.9.0-incubating-hadoop2.2.0.jar
export SPARK_YARN_APP_JAR=file:///home/ndyc/software/sparkTest/ndspark-0.0.1.jar
复制代码
file:// 表明是本地文件,如果使用hdfs上的文件将file://替换为hdfs://主机名:端口号。建议使用hdfs来引用 spark-assembly-0.9.0-incubating-hadoop2.2.0.jar,因为这个文件比较大,如果使用file://每次提交任务都需要上传这个jar到各个集群,很慢。
其中SPARK_JAR是${SPARK_HOME}/assembly/target/scala-2.10.4/spark-assembly-0.9.0-incubating-hadoop2.2.0.jar
SPARK_YARN_APP_JAR是自己程序打的jar包,包含自己的测试程序。
4.程序中加入hadoop、yarn、依赖。
注意,如果引入了hbase依赖,需要这样配置
《dependency》
《groupId》org.apache.hbase《/groupId》
《artifactId》hbase-thrift《/artifactId》
《version》${hbase.version}《/version》
《exclusions》
《exclusion》
《groupId》org.apache.hadoop《/groupId》
《artifactId》hadoop-mapreduce-client-jobclient《/artifactId》
《/exclusion》
《exclusion》
《groupId》org.apache.hadoop《/groupId》
《artifactId》hadoop-client《/artifactId》
《/exclusion》
《/exclusions》
《/dependency》
复制代码
然后再加入
《dependency》
《groupId》org.ow2.asm《/groupId》
《artifactId》asm-all《/artifactId》
《version》4.0《/version》
《/dependency》
复制代码
否则会报错:
IncompatibleClassChangeError has interface org.objectweb.asm.ClassVisitor as super class
复制代码
异常是因为Hbase jar hadoop-mapreduce-client-jobclient.jar里面使用到了asm3.1 而spark需要的是asm-all-4.0.jar
5. hadoop conf下的*-site.xml需要复制到提交主机的classpath下,或者说maven项目resources下面。
6.编写程序
代码示例:
package com.sdyc.ndspark.sys;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import scala.Tuple2;
import java.util.ArrayList;
import java.util.List;
/**
* Created with IntelliJ IDEA.
* User: zarchary
* Date: 14-1-19
* Time: 下午6:23
* To change this template use File | Settings | File Templates.
*/
public class ListTest {
public static void main(String args) throws Exception {
SparkConf sparkConf = new SparkConf();
sparkConf.setAppName(“listTest“);
//使用yarn模式提交
sparkConf.setMaster(“yarn-client“);
JavaSparkContext sc = new JavaSparkContext(sparkConf);
List《String》 listA = new ArrayList《String》();
listA.add(“a“);
listA.add(“a“);
listA.add(“b“);
listA.add(“b“);
listA.add(“b“);
listA.add(“c“);
listA.add(“d“);
JavaRDD《String》 letterA = sc.parallelize(listA);
JavaPairRDD《String, Integer》 letterB = letterA.map(new PairFunction《String, String, Integer》() {
@Override
public Tuple2《String, Integer》 call(String s) throws Exception {
return new Tuple2《String, Integer》(s, 1);
}
});
letterB = letterB.reduceByKey(new Function2《Integer, Integer, Integer》() {
public Integer call(Integer i1, Integer i2) {
return i1 + i2;
}
});
//颠倒顺序
JavaPairRDD《Integer, String》 letterC = letterB.map(new PairFunction《Tuple2《String, Integer》, Integer, String》() {
@Override
public Tuple2《Integer, String》 call(Tuple2《String, Integer》 stringIntegerTuple2) throws Exception {
return new Tuple2《Integer, String》(stringIntegerTuple2._2, stringIntegerTuple2._1);
}
});
JavaPairRDD《Integer, List《String》》 letterD = letterC.groupByKey();
// //false说明是降序
JavaPairRDD《Integer, List《String》》 letterE = letterD.sortByKey(false);
System.out.println(“========“ + letterE.collect());
System.exit(0);
}
}
复制代码
代码中master设置为yar-client表明了是使用提交到yarn.
关于spark需要依赖的jar的配置可以参考我的博客spark安装和远程调用。
以上弄完之后就可以运行程序了。
运行后会看到yarn的ui界面出现:
正在执行的过程中会发现hadoop yarn 有的nodemanage会有下面这个进程:
13247 org.apache.spark.deploy.yarn.WorkerLauncher
复制代码
这是spark的工作进程。
如果接收到异常为:
WARN YarnClientClusterScheduler: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient memory
复制代码
出现这个错误是因为提交任务的节点不能和spark工作节点交互,因为提交完任务后提交任务节点上会起一个进程,展示任务进度,大多端口为4044,工作节点需要反馈进度给该该端口,所以如果主机名或者IP在hosts中配置不正确,就会报
WARN YarnClientClusterScheduler: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient memory错误。
所以请检查主机名和IP是否配置正确。
我自己的理解为,程序提交任务到yarn后,会上传SPARK_JAR和SPARK_YARN_APP_JAR到hadoop节点, yarn根据任务情况来分配资源,在nodemanage节点上来启动org.apache.spark.deploy.yarn.WorkerLauncher工作节点来执行spark任务,执行完成后退出。

更多文章:
another time(another time和other time的区别)
2026年10月11日 05:00









