大数据专题

简单的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操作。

详细配置见英文

Spark一个简单案例