设为首页 收藏本站
查看: 1106|回复: 0

[经验分享] 从零开始学习,Apache Spark源码走读(一)

[复制链接]

尚未签到

发表于 2015-11-14 08:37:29 | 显示全部楼层 |阅读模式

概要



本文以wordCount为例,详细说明Spark创建和运行job的过程,重点是在进程及线程的创建。




实验环境搭建



在进行后续操作前,确保下列条件已满足。



  • 下载spark binary 0.9.1
  • 安装scala
  • 安装sbt
  • 安装java


启动spark-shell



单机模式运行,即local模式



local模式运行非常简单,只要运行以下命令即可,假设当前目录是$SPARK_HOME


MASTER=local bin/spark-shell

"MASTER=local"就是表明当前运行在单机模式



local cluster方式运行



local cluster模式是一种伪cluster模式,在单机环境下模拟Standalone的集群,启动顺序分别如下



  • 启动master
  • 启动worker
  • 启动spark-shell


master


$SPARK_HOME/sbin/start-master.sh

注意运行时的输出,日志默认保存在$SPARK_HOME/logs目录。


master主要是运行类 org.apache.spark.deploy.master.Master,在8080端口启动监听,日志如下图所示 DSC0000.png



修改配置



  • 进入$SPARK_HOME/conf目录
  • 将spark-env.sh.template重命名为spark-env.sh
  • 修改spark-env.sh,添加如下内容

export SPARK_MASTER_IP=localhost
export SPARK_LOCAL_IP=localhost

运行worker


bin/spark-class org.apache.spark.deploy.worker.Worker spark://localhost:7077 -i 127.0.0.1  -c 1 -m 512M
<br>

worker启动完成,连接到master。打开maser的web ui可以看到连接上来的worker. Master WEb UI的监听地址是http://localhost:8080



启动spark-shell


MASTER=spark://localhost:7077 bin/spark-shell

如果一切顺利,将看到下面的提示信息。


Created spark context..
Spark context available as sc.

可以用浏览器打开localhost:4040来查看如下内容



  • stages
  • storage
  • environment
  • executors


wordcount



上述环境准备妥当之后,我们在sparkshell中运行一下最简单的例子,在spark-shell中输入如下代码


scala>sc.textFile(&quot;README.md&quot;).filter(_.contains(&quot;Spark&quot;)).count

上述代码统计在README.md中含有Spark的行数有多少



部署过程详解



Spark布置环境中组件构成如下图所示。


DSC0001.png



  • Driver Program 简要来说在spark-shell中输入的wordcount语句对应于上图的Driver Program。
  • Cluster Manager 就是对应于上面提到的master,主要起到deploy management的作用
  • Worker Node 与Master相比,这是slave node。上面运行各个executor,executor可以对应于线程。executor处理两种基本的业务逻辑,一种就是driver programme,另一种就是job在提交之后拆分成各个stage,每个stage可以运行一到多个task


Notes: 在集群(cluster)方式下,Cluster Manager运行在一个jvm进程之中,而worker运行在另一个jvm进程中。在local cluster中,这些jvm进程都在同一台机器中,如果是真正的Standalone或Mesos及Yarn集群,worker与master或分布于不同的主机之上。



JOB的生成和运行



job生成的简单流程如下



  • 首先应用程序创建SparkContext的实例,如实例为sc
  • 利用SparkContext的实例来创建生成RDD
  • 经过一连串的transformation操作,原始的RDD转换成为其它类型的RDD
  • 当action作用于转换之后RDD时,会调用SparkContext的runJob方法
  • sc.runJob的调用是后面一连串反应的起点,关键性的跃变就发生在此处


调用路径大致如下



  • sc.runJob->dagScheduler.runJob->submitJob
  • DAGScheduler::submitJob会创建JobSummitted的event发送给内嵌类eventProcessActor
  • eventProcessActor在接收到JobSubmmitted之后调用processEvent处理函数
  • job到stage的转换,生成finalStage并提交运行,关键是调用submitStage
  • 在submitStage中会计算stage之间的依赖关系,依赖关系分为宽依赖窄依赖两种
  • 如果计算中发现当前的stage没有任何依赖或者所有的依赖都已经准备完毕,则提交task
  • 提交task是调用函数submitMissingTasks来完成
  • task真正运行在哪个worker上面是由TaskScheduler来管理,也就是上面的submitMissingTasks会调用TaskScheduler::submitTasks
  • TaskSchedulerImpl中会根据Spark的当前运行模式来创建相应的backend,如果是在单机运行则创建LocalBackend
  • LocalBackend收到TaskSchedulerImpl传递进来的ReceiveOffers事件
  • receiveOffers->executor.launchTask->TaskRunner.run


代码片段executor.lauchTask


def launchTask(context: ExecutorBackend, taskId: Long, serializedTask: ByteBuffer) {
val tr = new TaskRunner(context, taskId, serializedTask)
runningTasks.put(taskId, tr)
threadPool.execute(tr)
}


说了这么一大通,也就是讲最终的逻辑处理切切实实是发生在TaskRunner这么一个executor之内。


运算结果是包装成为MapStatus然后通过一系列的内部消息传递,反馈到DAGScheduler,这一个消息传递路径不是过于复杂,有兴趣可以自行勾勒。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-138988-1-1.html 上篇帖子: Apache 配置httpd-vhosts虚拟主机总结及注意事项 下篇帖子: 【Apache Solr系列】Solr QueryElevationComponent--实现竞价排名(手动干预)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表