第一阶段(1-3月):会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战。课程会涵盖Scala编程详解、Spark核心编程、Spark SQL和Spark Streaming、Spark GraphX、SparkR、Machine Learning、Spark内核以及源码剖析、性能调优、企业级案例实战等部分
第二阶段(Spark超大规模大数据案例实战):使用了Spark技术生态栈中的Spark Core、Spark SQL、Spark Streaming、SparkR、Machine Learning,进行离线计算和实时计算业务模块的开发、数据的关联性分析、用户行为模式和特征的训练与应用、用户网络的社区发现、用户影响力、能量传播、标签传播、标签推理、人群划分、年龄段预测、商品交易时序跳转。
本课内容:
1 实战讲解Spark运行原理
2 RDD解密
RDD(弹性分布式数据集)
分布式基于内存特别适合于迭代计算,也可以基于磁盘计算,适合各种规模的集群的计算。
1、分布式:多态集群,整个Spark有一个提交程序的Driver端,提交给集群(多台)进行运行,不同的Node处理其中一部分内容,Node间各不影响
2、主要基于内存:data首先会考虑在MEM中运行,data太大可将部分data数据存放于disk上,
3、擅长迭代计算(多步骤计算)shuffle
RDD:rdd代表要处理的数据,分布式处理,data分成若干分片Partition,存储于不同的节点中,只进行rdd的处理,
(1)RDD弹性的特点:
1、弹性之一:自动的进行内存和磁盘数据存储的切换;
2、弹性之二:基于Lineage的高效容错(第n个节点出错,会从第n-1个节点恢复,血统容错);
3、弹性之三:Task如果失败会自动进行特定次数的重试(默认4次);
4、弹性之四:Stage如果失败会自动进行特定次数的重试(可以值运行计算失败的阶段);只计算失败的数据分片
(2)RDD写入缓存cache的几种情况:
1、计算步骤特别耗时会做Cache
2、计算链条很长,失败的时候会有很大代价,血统容错恢复;
3、shuffle之后;
4、checkPoint:Tachyon(Cache不可靠)data放于文件系统中,保证数据安全
(3)启动Spark后的测试:
./start-dfs.sh
多次检验
./spark-all.sh
启动history server
./start-history-server.sh
http://master:18080
>sc.textFile("hdfs://Master:9000/libary/wordcount/input/Data")
数据来源于HDFS
>val sc.textFile("library/wordcount/input/Data")
//从hdfs上读取了数据,这些数据是一系列分片的数据分布于不同的机器上
Partition size默认情况下 = hsfs上的 Block size(128M)
sc.textFile("错误路径") 不会报错,因为trasformation的时候采用了lazy的机制。
>val flatted=data.flatMap(_.split(" "))
//rdd有依赖关系
>val mapped =flatted.map(word =>(word,1))
>mapped.toDebugString
>val reduced = mapped.reduce(_+_)
//分布式处理shuffle过程,统计数据
>reduced.savaAsTextFile("http://...")
>reduced.toDebugString
//显示rdd依赖关系
Spark架构设计
1、创建SparkContext:用户开发编写的逻辑与集群交互的接口,他会通过与Cluster Manager进行交互,以及通过Cluster Manager申请计算资源
2、Cluster Manager:资源管理器,类似于Hadoop的yarn和mesos
3、Worker Node:集群中具体中每台机器的存储和计算的支撑
4、Executor:在Worker Node上为某个应用程序启动的进程,其内以线程池的方式负责Spark的任务运行,并负责将数据存储在Disk或者MEM上
通常在Driver端发送的任务发送到Worker上的Executor上,让线程池进行计算,每个任务都有独立的Executor
所以Spark执行时线程级别的。
Spark运行机制:
首先用户创建SparkContext,新创建的SparkContext会根据编程时设置的参数或系统默认的配置连接到
ClusterManager上,ClusterManager会根据用户提交时的设置(如:占用CPU、MEN等资源情况),来为用户程序分配计算资源,启动相应的Executor;而Driver根据用户程序调度的Stage的划分,即高层调度器(RDD的依赖关系),若有宽依赖,会划分成不同的Stage,每个Stage由一组完全相同的任务组成,该Stage分别作用于待处理的分区,待Stage划分完成和Task创建完成后,Driver端会向Executor发送具体的task,当Executor收到task后,会自动下载运行需要的库、包等,准备好运行环境后由线程池中的线程开始执行,所以Spark执行是线程级别的。
Hadoop运行比Spark代价大很多,因Hadoop中的MapReduce运行的JVM虚拟机不可以复用,而Spark运行的线
程池中的线程可以进行复用。
执行Task的过程中,Executor会将执行的Task汇报给Driver,Driver收到Task的运行状态情况后,会根据
具体状况进行更新等。Task根据不同的Stage的划分,会被划分为两种类型:
(1)shuffleMapTask,在最后一个Stage前的其他Stage都进行shuffleMapTask,此时是对数据进行shuffle,
shuffle的结果保存在Executor所在节点的本地文件系统中;
(2)第二种Task:ResultTask,负责生成结果数据;
Driver会不断发送Task给Executor进行执行,所以Task都正确执行或者超过执行次数的限制,或者没有执
行时会停止,多正确执行会进入下一个stage,若没有正确执行成功,高层调度器DAGSchedular会进行一定次
数的重试,若还是执行不成功就意味着整个作业的失败。
DT大数据梦工厂
新浪微博:www.weibo.com/ilovepains/
微信公众号:DT_Spark
博客:http://.blog.sina.com.cn/ilovepains
TEL:18610086859
Email:[email protected]