1.Spark-Submit 源码剖析
2.七爪源码:C# 中的洋葱源码洋葱扩展方法
3.Koa洋葱模型 从理解到实现
Spark-Submit 源码剖析
直奔主题吧:
常规Spark提交任务脚本如下:
其中几个关键的参数:
再看下cluster.conf配置参数,如下:
spark-submit提交一个job到spark集群中,学院学院大致的洋葱源码洋葱经历三个过程:
代码总Main入口如下:
Main支持两种模式CLI:SparkSubmit;SparkClass
首先是checkArgument做参数校验
而sparksubmit则是通过buildCommand来创建
buildCommand核心是AbstractCommandBuilder类
继续往下剥洋葱AbstractCommandBuilder如下:
定义Spark命令创建的方法一个抽象类,SparkSubmitCommandBuilder刚好是实现类如下
SparkSubmit种类可以分为以上6种。SparkSubmitCommandBuilder有两个构造方法有参数和无参数:
有参数中根据参数传入拆分三种方式,学院学院然后通过OptionParser解析Args,洋葱源码洋葱构造参数创建对象后核心方法是学院学院车载音乐源码通过buildCommand,而buildCommand又是洋葱源码洋葱通过buildSparkSubmitCommand来生成具体提交。
buildSparkSubmitCommand会返回List的学院学院命令集合,分为两个部分去创建此List,洋葱源码洋葱
第一个如下加入Driver_memory参数
第二个是通过buildSparkSubmitArgs方法构建的具体参数是MASTER,DEPLOY_MODE,学院学院FILES,洋葱源码洋葱CLASS等等,学院学院这些就和我们上面截图中是洋葱源码洋葱对应上的。是学院学院修改struts源码通过OptionParser方式获取到。
那么到这里的洋葱源码洋葱话buildCommand就生成了一个完成sparksubmit参数的命令List
而生成命令之后执行的任务开启点在org.apache.spark.deploy.SparkSubmit.scala
继续往下剥洋葱SparkSubmit.scala代码入口如下:
SparkSubmit,kill,request都支持,后两个方法知识支持standalone和Mesos集群方式下。dosubmit作为函数入口,其中第一步是初始化LOG,然后初始化解析参数涉及到类
SparkSubmitArguments作为参数初始化类,继承SparkSubmitArgumentsParser类
其中env是测试用的,参数解析如下,parse方法继承了SparkSubmitArgumentsParser解析函数查找 args 中设置的--选项和值并解析为 name 和 value ,如 --master yarn-client 会被解析为值为 --master 的 name 和值为 yarn-client 的 value 。
这之后调用SparkSubmitArguments#handle(MASTER, "yarn-client")进行处理。
这个函数也很简单,根据参数 opt 及 value,hcash 源码分析设置各个成员的值。接上例,parse 中调用 handle("--master", "yarn-client")后,在 handle 函数中,master 成员将被赋值为 yarn-client。
回到SparkSubmit.scala通过SparkSubmitArguments生成了args,然后调用action来匹配动作是submit,kill,request_status,print_version。
直接看submit的action,doRunMain执行入口
其中prepareSubmitEnvironment初始化环境变量该方法返回一个四元 Tuple ,分别表示子进程参数、子进程 classpath 列表、系统属性 map 、子进程 main 方法。喜鹊钱包源码完成了提交环境的准备工作之后,接下来就将启动子进程。
runMain则是执行入口,入参则是执行参数SparkSubmitArguments
Main执行非常的简单:几个核心步骤
先是打印一串日志(可忽略),然后是创建了loader是把依赖包jar全部导入到项目中
然后是MainClass的生成,异常处理是ClassNotFoundException和NoClassDeffoundError
再者是生成Application,根据MainClass生成APP,最后调用start执行
具体执行是SparkApplication.scala,那么继续往下剥~
仔细阅读下SparkApplication还是挺深的,所以打算另外写篇继续深入研读~
七爪源码:C# 中的扩展方法
扩展方法在C#中允许将方法“添加”到现有类型,无需创建新的派生类型或修改原始类型。扩展方法实质上是静态方法,但其调用方式如同实例方法,这在C#、射箭游戏源码F#和Visual Basic的客户端代码中没有明显区别。常见的扩展方法包括向System.Collections.IEnumerable和System.Collections.Generic.IEnumerable添加查询功能的LINQ标准查询运算符。
例如,使用System.Linq指令将标准查询运算符引入范围后,可以对整数数组调用OrderBy方法进行排序。扩展方法定义为静态方法,使用实例方法语法调用,第一个参数指定方法操作的类型,并带有this修饰符。扩展方法的范围取决于是否使用using指令显式导入命名空间。
以下示例展示了为System.String类定义的扩展方法,WordCount方法,定义在非嵌套、非泛型的静态类中。使用using指令即可进入范围并调用该方法。调用扩展方法时使用实例方法语法,编译器将生成中间语言(IL)以对静态方法进行调用。
扩展方法允许在代码中调用,MyExtensions类和WordCount方法都是静态的,可以通过其他静态成员访问。WordCount方法可以像其他静态方法一样被调用。
扩展方法的调用在编译时进行。当编译器遇到方法调用时,首先在类型的实例方法中查找匹配项,如果没有找到,则搜索该类型定义的任何扩展方法,并绑定到第一个找到的扩展方法。如果一个类型有一个名为Process(int i)的方法,并且有一个具有相同签名的扩展方法,则编译器将始终绑定到实例方法。
使用扩展方法的常见模式包括:
1. 收集功能:过去,为给定类型创建实现System.Collections.Generic.IEnumerable接口并包含该类型集合功能的“集合类”是常见的做法。然而,通过使用System.Collections.Generic.IEnumerable上的扩展,可以实现相同功能,提供从任何集合调用功能的灵活性,如System.Array或System.Collections.Generic.List上的实现。
2. 特定层的功能:在使用洋葱架构或其他分层应用程序设计时,域实体或数据传输对象通常不包含功能或仅包含适用于所有层的最小功能。扩展方法可用于为每个应用程序层添加特定功能,无需引入其他层不需要或不需要的方法。
Koa洋葱模型 从理解到实现
当使用Koa框架时,Middleware(中间件)的概念想必大家已不陌生。让我们从实例出发,通过自定义两个中间件——logTime用于打印时间戳,logUrl负责打印路由——来探索Koa的洋葱模型。 在index.js中,我们按顺序使用这两个中间件。启动服务并访问路由如/test,你会观察到两个现象:首先,你可能会疑惑:Koa的设计为何不按顺序从头到尾执行中间件?
其次,当中间件存在依赖关系时,如何确保前面的中间件能利用后续中间件的操作结果?比如,logUrl可能处理了url并添加了时间戳,logTime需要获取并打印这个时间戳。
这些现象揭示了Koa洋葱模型的设计原理:中间件的执行顺序是关键。外层(上游)中间件先执行,处理完后通过next函数传递控制权给内层(下游)中间件。这样可以确保每个中间件在适当的时机获取和操作数据,避免了单次链式调用时的依赖问题。 通过源码分析,我们发现Koa的实现依赖于`koa-compose`库,它负责管理中间件的执行流程。我们需要对中间件数组进行包装,以便在调用next时传递必要的上下文信息。通过`bind`方法,我们得以保留和传递必要的参数,实现洋葱模型的逻辑。 总结来说,我们从现象出发,通过实例和源码理解了Koa洋葱模型的必要性和工作方式。通过自定义实现,我们加深了对这一模型的理解。