大数据专题
简单的Spark应用源码案例
Spark应用源码下载见: Github
Apache的Spark是通用的提供类似Hadoop的MapReduce集群计算框架,拥有强大的抽象处理大型数据集。对于涉及到性能,功能和API种种原因,Spark正在变得比MapReduce更受欢迎。
该源码将教会你如何使用Scala学习如何编写,编译和运行一个Spark简单的应用程序。这个案例是一个单词计数WordCount, 这是最经典的MapReduce应用,在字数统计这个案例中,我们的目标是在在我们的语料库的字母中找出最流行的词汇分布。
1. 读入一个文本文档的输入。
2.统计每个单词出现的次数。
3.筛选少于1百万次的所有单词。
3.对于剩余的结果,统计每个字母的次数。
在MapReduce的,这将需要两个MapReduce工作以及在它们之间持续中间数据到HDFS。相反在Spark中,你可以用更少的代码大约90%行写一个作业。
我们的输入文档是剥离标点符号的一个巨大的文本文件。完整的Scala程序看起来像这样:
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
object SparkWordCount {
def main(args: Array[String]) {
val sc = new SparkContext(new SparkConf().setAppName("Spark Count"))
val threshold = args(1).toInt
// split each document into words
val tokenized = sc.textFile(args(0)).flatMap(_.split(" "))
// count the occurrence of each word
val wordCounts = tokenized.map((_, 1)).reduceByKey(_ + _)
// filter out words with less than threshold occurrences
val filtered = wordCounts.filter(_._2 >= threshold)
// count characters
val charCounts = filtered.flatMap(_._1.toCharArray).map((_, 1)).reduceByKey(_ + _)
System.out.println(charCounts.collect().mkString(", "))
}
}
Spark 使用 "lazy evaluation", 意味着转换只有一个action操作被调用时才会在集群中执行,action操作在这个案例是collect收集,将数据拉到客户端然后saveAsTextFile, 也就是将数据写到一个类似HDFS文件系统中.
值得注意的是,Spark的 "reduce"稍微区别于MapReduce. 在MapReduce一个reduce函数调用接受一个规定Key的所有记录,而在Spark,只接受两个参数,Spark的reduce类似mao的groupBy操作。
详细配置见英文