WordCount背后的数据流

来源:互联网 发布:淘宝店铺海报尺寸多少 编辑:程序博客网 时间:2024/04/30 17:53

第一阶段(1-3月):会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战。课程会涵盖Scala编程详解、Spark核心编程、Spark SQLSpark StreamingSpark GraphXSparkRMachine LearningSpark内核以及源码剖析、性能调优、企业级案例实战等部分

第二阶段(Spark超大规模大数据案例实战):使用了Spark技术生态栈中的Spark CoreSpark SQLSpark StreamingSparkRMachine Learning,进行离线计算和实时计算业务模块的开发、数据的关联性分析、用户行为模式和特征的训练与应用、用户网络的社区发现、用户影响力、能量传播、标签传播、标签推理、人群划分、年龄段预测、商品交易时序跳转

本期内容:

从数据流动视角解密WordCount

RDD依赖关系的视角解密WordCount

3 DAGLineage的思考

RDD数据流:

1RDD5个接口,一个接口记录了从哪些父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.collectres12: 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).collectres7: 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




0 0
原创粉丝点击