这一篇我们要来讲解 Spark 的运算机制,我本人是写 Python的,所以下面都会使用 Python 来讲解。
Transformation and Action
Spark 在执行的机制分为 Transformation 和 Action,Spark 执行的时候是使用一个叫 RDD(Resilient Distributed Dataset)的资料型态在做操作的,并且在做 transformation 是 lazy 的,所谓的 lazy 也就是当你呼叫有关 transformation 的 API 的时候,并不会马上执行,仅仅纪录 transformation 的转换过程,而是要等到你呼叫 action 的 API 的时候,Spark 才会开始动作。
wordcount
上面讲完 Spark 的运作机制后,接着让我们来小试一下身手,写一个 wordcount,带大家了解一下基本的写法跟 transformation 和 action
首先先假定大家都有 Spark 环境,所以我就直接 import Spark。
from pyspark import SparkContextdef main(): with SparkContext(appName='wordcount') with sc: # transformation data = sc.textFile('/inpit/a.txt').map(lambda x: x[0])\ .flatMap(lambda x: x.split(' '))\ .map(lambda x: (x, 1)).reduceByKey(lambda a, b: (a+b)) # action result = data.collect() for (word, count) in result: print("word:", word, "count:", count) if __name__ == '__main__': main()
上面是一个 wordcount 的小範例,从读取档案以及 map 的过程,还有最后的 reduceByKey,都是属于 transformation,程式执行到这里,Spark 只会记录我们每一个对 RDD 的操作,并还没有开始做运算,直到我写了 collect(),Spark 就会开始往回找说这一个 RDD 是由前面哪一个操作产生出来的,一直持续往前找,直到找到最初的源头,然后一口气算完,这感觉有一点像递迴。
以上是 Spark 的程式基本概念,详细的 transformation 和 action 还有很多 API 可以用,可以多多上官网查询,如果小弟的文章内容或观念有误,或是各位有更好的意见,欢迎在下面留言交流。
Reference
Spark 2.0