第一阶段(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 从数据流动视角解密WordCount
2 从RDD依赖关系的视角解密WordCount
3 DAG与Lineage的思考
RDD数据流:
1)RDD的5个接口,一个接口记录了从哪些父RDD获取数据,一个接口记录从父RDD的哪些分区获取分区数据;一个接口记录当前RDD对分区的操作算子;
2)RDD的构建 —— 其中之一,从其他RDD转换(操作算子)得到 ;
每个RDD通过记录父RDD、分区数据对应关系 —— 最终形成一个血统图,这些图,记录了数据流和操作算子流。
创建RDD:
RDD可以从普通数组创建出来,也可以从文件系统或者HDFS中的文件创建出来。
举例:从普通数组创建RDD,里面包含了1到9这9个数字,它们分别在3个分区中。
scala> val a = sc.parallelize(1 to 9, 3)
可以从Driver内存中的集合构建,可以从外部存储系统构建,每个转换操作,都会构建出一个新的RDD,这个RDD会记录它的数据来源,和自己的操作,输入--操作——每个RDD都有,对应的,就形成了一个输入——操作——输入——操作.....的流图,也就是每个RDD对应的血统图。
Spark上下文
Spark集群的执行单位是Application,任何提交的任务都会产生一个Application。一个Application只会关联上一个Spark上下文,也就是SparkContext。构建SparkContext时可以传入Spark相关配置,也就是SparkConf,它可以用来指定Application的名称,任务需要的CPU核数/内存大小,调优需要的配置等等。
val conf = new SparkConf()
conf.setAppName("WorkCount")
val sc = new SparkContext(conf)
这三行语句创建了一个Spark上下文,并且运行时这个Application的名字就叫WordCount。
WordCount背后的数据流:
(1)TextFile
lines = sc.textFile(file)
从hdfs文件中创建了叫lines的RDD,它的每个元素就对应文件中的每一行,有了RDD我们就可以通过它提供的各种API来完成需要的业务功能。
(2)map
map是对RDD中的每个元素都执行一个指定的函数来产生一个新的RDD。任何原RDD中的元素在新RDD中都有且只有一个元素与之对应。基于HadoopRDD产生的Partition去掉Key。
( 3)flatmap对Partition中的每一行单词进行拆分并合并为一个大集合,与map类似,区别是原RDD中的元素经map处理后只能生成一个元素,而原RDD中的元素经flatmap处理后可生成多个元素来构建新RDD。
举例:对原RDD中的每个元素x产生y个元素(从1到y,y为元素x的值)
scala> val a = sc.parallelize(1 to 4, 2)
scala> val b = a.flatMap(x => 1 to x)
scala> b.collect
res12: Array[Int] = Array(1, 1, 2, 1, 2, 3, 1, 2, 3, 4)
Reduce
reduce将RDD中元素两两传递给输入函数,同时产生一个新的值,新产生的值与RDD中下一个元素再被传递给输入函数直到最后只有一个值为止。
scala> val c = sc.parallelize(1 to 10)
scala> c.reduce((x, y) => x + y)
res4: Int = 55
(4)ReduceByKey
reduceByKey就是对元素为KV对的RDD中Key相同的元素的Value进行reduce,因此,Key相同的多个元素的值被reduce为一个值,然后与原RDD中的Key组成一个新的KV对。
scala> val a = sc.parallelize(List((1,2),(3,4),(3,6)))
scala> a.reduceByKey((x,y) => x + y).collect
res7: Array[(Int, Int)] = Array((1,2), (3,10))
第一个Stage(父Stage,基于内存进行迭代)
包含5个RDD:HadoopRDD、mapParttionsRDD、mapParttionsRDD、mapParttionsRDD、mapParttionsRDD
注:上面ReduceByKey中Partition中(Hello ,4)为一个value值,而非键值对,因为再进行map操作(基于HadoopRDD产生的Partition去掉行的Key),进行了计算操作后,需要加上一个Key,这符合能量守恒,因为在saveAsTextFile中可以看到this.map(x=>(NUllWriteble.get(),text(x.toString))),outputFormat时需要一个键值对的形式。
第二个Stage包含shuffledRDD和MapPartitionRDD
DT大数据梦工厂
新浪微博:www.weibo.com/ilovepains/
微信公众号:DT_Spark
博客:http://.blog.sina.com.cn/ilovepains
TEL:18610086859
Email:18610086859@vip.126.com