最近刚刚接触spark,对它的很多东西不是很理解,目前先整理一些浅显易懂的,便于后期查阅~
本文希望用浅(ren)显(hua)的语言进行解释说明,方便自己和大家查看~
一、Spark含义
Spark,其实就是数据处理框架,就是基于内存计算的通用大规模数据处理框架。
Spark的出现是因为要弥补Hadoop的不足,那Hadoop又有什么不足呢?
- Hadoop中的MapReduce的表达能力弱:不是所有的数据分析模型都可以表达成map和reduce两阶段的。
- Hadoop中的MapReduce短板问题:必须等待所有的Map都执行完才能执行reduce。
- 写入磁盘耗时:Hadoop中间处理的时候需要写入磁盘,虽然每次写入时间很短,可能也就几秒,但是扛不住数量多啊,数量非常大的时候,写入时间问题就被放大啦~
基于以上问题,Spark横空出世!!!
- 表达能力强:提供Java、Scala、Python和R几种语言的API,支持SQL、机器学习和图计算,覆盖了绝大多数大数据计算的场景。
- 不存在短板问题:因为没有MapReduce,采用函数式编程方法。
- 写入内存省时:中间计算过程写入内存,不要反复读取磁盘。
二、RDD——Spark中最重要的一个知识点
先来看一个例子,统计词个数的例子(已经被用烂~):
val batchSize = 10
val sparkConf = new SparkConf().setAppName("SparkTest").setMaster("local")
val ssc = new StreamingContext(sparkConf, new Duration(batchSize * 1000))
val textFile = ssc.sparkContext.textFile("data/sparkTestFile")
textFile.foreach(println)
val words = textFile.flatMap(line => line.split(" "))
words.foreach(println)
val word_pairs = words.map(word => (word, 1))
word_pairs.foreach(println)
val word_counts = word_pairs.reduceByKey(_+_)
word_counts.foreach(println)
下面我们分别看一下每句的含义与运行结果:
1. 首先打印一下文件里的内容:
val textFile = ssc.sparkContext.textFile("data/sparkTestFile")
textFile.foreach(println)
2. 进行flatMap扁平化处理:
val words = textFile.flatMap(line => line.split(" "))
words.foreach(println)
3. 将每个单词设置个数为1:
val word_pairs = words.map(word => (word, 1))
word_pairs.foreach(println)
4. 对每个词进行统计个数,相同词合并
val word_counts = word_pairs.reduceByKey(_+_)
word_counts.foreach(println)
这四步,每一步就是一个rdd,rdd说的通俗一点就是一个数据集,再通俗一点,就是给数据起个名字~
比如,我将一个文本内容读取出来,那么我怎么称呼这些内容呢?我就可以用rdd统一称呼它,也不管它里面是什么形式的数据。而我对数据扁平化处理后,仍然可以用rdd称呼处理后的数据,只不过此rdd非彼rdd,可以理解为处理之前为rdd1,处理之后为rdd2~
三、懒加载
RDD包含两种算子:Transformation、Action算子。
- Transformation:
- map, mapPartitions, flatMap, filter, union, groupbyKey, repartition, cache
- Action
- reduce, collect, show, count, foreach, save
Transformation操作是将一个rdd转换成另一个rdd,这些操作不会立即被执行,而是等到触发Action操作时才被执行,感觉有点类似于TensorFlow,先定义着,用的时候再处理。这样维护起来更容易,速度也更快,同时又降低了复杂度。
今天先写到这吧~下次在补充~