第11课:彻底解密WordCount运行原理学习笔记
本期内容:
1. 从数据流动视角解密WordCount,即用Spark作单词计数统计,数据到底是怎么流动的。
2. 从RDD依赖关系的视角解密WordCount。Spark中的一切操作皆RDD,后面的RDD对前面的RDD有依赖关系。
3. DAG与Lineage的思考。依赖关系会形成DAG。
1. 从数据流动视角解密WordCount
(1)在IntelliJ IDEA中编写下面代码:
package com.dt.spark
/**
* 使用Java的方式开发进行本地测试Spark的WordCount程序
* @author DT大数据梦工厂
* http://weibo.com/ilovepains
*/
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
object WordCount {
def main(args: Array[String]){
val conf = new SparkConf()
conf.setAppName("Wow, My First Spark App!")
conf.setMaster("local")
val sc = new SparkContext(conf)
val lines = sc.textFile("D://tmp//helloSpark.txt", 1)
val words = lines.flatMap { line => line.split(" ") }
val pairs = words.map { word => (word,1) }
val wordCounts = pairs.reduceByKey(_+_)
wordCounts.foreach(wordNumberPair => println(wordNumberPair._1 + " : " + wordNumberPair._2))
sc.stop()
}
}
(2)在D盘下地tmp文件夹下新建helloSpark.txt文件,内容如下:
Hello Spark Hello Scala
Hello Hadoop
Hello Flink
Spark is awesome
(3) 在WordCount代码区域点击右键选择Run 'WordCount'。可以得到如下运行结果:
Flink : 1
Spark : 2
is : 1
Hello : 4
awesome : 1
Hadoop : 1
Scala : 1
下面从数据流动的视角分析数据到底是怎么被处理的。
说明:
Spark有三大特点:
1. 分布式。无论数据还是计算都是分布式的。默认分片策略:Block多大,分片就多大。但这种说法不完全准确,因为分片切分时有的记录可能跨两个Block,所以一个分片不会严格地等于Block的大小,例如HDFS的Block大小是128MB的话,分片可能多几个字节或少几个字节。一般情况下,分片都不会完全与Block大小相等。
分片不一定小于Block大小,因为如果最后一条记录跨两个Block的话,分片会把最后一条记录放在前一个分片中。
2. 基于内存(部分基于磁盘)
3. 迭代
textFile源码(SparkContext中);
def textFile( path: String, minPartitions: Int = defaultMinPartitions): RDD[String] = withScope { assertNotStopped() hadoopFile(path, classOf[TextInputFormat], classOf[LongWritable], classOf[Text], minPartitions).map(pair => pair._2.toString) }
可以看出在进行了hadoopFile之后又进行了map操作。
HadoopRDD从HDFS上读取分布式文件,并且以数据分片的方式存在于集群之中。
map的源码(RDD.scala中)
<