快速开始
Spark提供了一个外部的API工具来进行交互式分析数据,使用一个Scala方式(利用java虚拟机)或者Python方式,只需要使用以下方式打开
./bin/spark-shell
Spark的基本抽象是一个弹性分布式数据集简称RDD,RDD可以从InputFormat创建(如HDFS文件)或者其它的transformations产生。
scala> valtextFile=sc.textFile("README.md")
textFile:spark.RDD[String]=spark.MappedRDD2ee9b6e3
RDD有actions,会产生返回值,还有transformations,返回一个新RDD的指针,下面我们来执行一个actions
scala> textFile.count()
res0:long=126
scala> textFile.first()
res1:string = #Apache Spark
现在让我们来试试transformation,我们会使用filter 这个transformations 来返回一个新的RDD文本项子集
scala> vallineWithSpack=textFile.filter(line=>line.contains("Spark"))
lineWithSpark:spark.RDD[String]=spark.FilteredRDD@7dd4af09
我们可以把Action和transformations串起来
scala> textFile.filter(line =>line.contains("Spark")).count()
res3: Long=15
RDD的其它一些属性
RDD的Action和transformations可以用于更复杂的计算,比如想找出符合更多条件的单词
scala> textFile.map(line=>line.split(" ").size).reduce((a,b)=>if(a>b) a else b)
res4:Long=15
第一个maps返回一个integer值,创建了一个RDD,reduce调用这个RDD查询最大的行数,map和reduce都是Scala函数式,可以使用任何基于Scala/Java的特征库,比如max()
scala> import java.lang.Math
import java.lang.Math
scala> textFile.map(line=>line.split(" ").size).reduce((a,b)=>Math(a,b))
MapReduce是一个常见的数据处理模式,Spark实现了这一形式
scala> valwordCounts=textFile.flagMap(line=> line.split(" ")).map(word=>(word,1)).reduceByKey((a,b)=>a+b)
wordCounts:spark.RDD[(String,Int)]=spark.ShuffledAggregatedRDD@71f027b8
在这里,我们结合flatMap,map和reduceByKey转换来计算每个单词的文件作为RDD的(String,Int)对,我们的收集单词的数量
scala> wordCounts.collect()
res6:Array[(String,Int)]=Array((means,1),(under,2),(this,3),(Because,1),(Python,2),(agree,1),(cluster,1)......)
缓存
Spark还支持数据集合作为一个集群范围的缓存,这是非常有用的便于重复访问的策略,例如查找一个小“热”数据集或者运行像PageRank迭代算法,作为一个简单的例子,我们把lineswithspark作为一个缓存数据
scala> lineWithSpark.cache()
res7:spark.RDD[String]=spark.FilteredRDD@17e51082
scala> lineWithSpark.count()
res8:Long=15
scala> lineWithSpark.count()
res9:Long=15
似乎使用Spark搜索和缓存一个100行的文本文件有点傻,有趣的是,这些函数可以在非常大的数据集上面使用,甚至把他们分散在几十或者几百个节点上,你也可以用交互的方式连接bin/spark-shell就如在编程指南中介绍的一样
单独的程序
现在我们想使用SparkAPI写一个独立的应用程序,我们将通过一个简单的示例来讲解,在Scala(SBT),java和Python(Maven)
我们用Scala创建一个简单的程序,名字就叫SimpleApp.scala
/* SimpleApp.scala */
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
object SimpleApp{
defmain(args:Array[String]){
vallogFile="YOUR_SPARK_HOME/README.md"
valconf=new SparkConf().setAppName("Simple Application")
val sc=new SparkContext(conf)
vallogData=sc.textFile(logFile,2).cache()
valnumAs=logData.Filter(line=> line.contains("a")).count()
valnumBs=logData.Filter(line=> line.contains("b")).count()
println("Lineswith a:%s,Lines with b:%s".format(numAs,numBs))
}
}
我们传递一个SparkConf对象到程序里面的SparkContext构造器中
我们的应用程序依赖Spark的API,所以我们添加一个SBT配置文件"simple.sbt"对依赖文件进行一个说明
name :="Simple Project"
version :="1.0"
scalaVersion :="2.10.4"
libraryDependencies+="org.apache.spark" %% "spark-core" % "1.1.0"
想要SBT进行正常工作,我们需要按照结构部署simpleapp.scala和simple.sbt到相关目录,一旦到位,我们可以创建一个包含程序代码的jar文件,然后使用Spark提交脚本运行程序
你的文件目录应该类似这样
$find .
.
./simple.sbt
./src
./src/main
./src/main/scala
./src/main/scala/SimpleApp.scala
打包文件
$sbt package
...
[info] Packaging {..}{..}/target/scala-2.10/simple-project_2.10-1.0.jar
运行spark-submit启动你的程序
$YOUR_SPARK_HOME/bin/spark-submit \
--class "SimpleApp"
--master local[4]
target/scala-2.10/simple-project_2.10-1.0.jar
...
Line with a:46,Line with b:23
祝贺你的第一个Spark程序成功运行
程序中有几个示例,你可以用一下方式运行它们
#Scala和java 运行run-example
./bin/run-example SparkPi
#Python程序示例,使用spark-submit启动
./bin/spark-submit example/src/main/python/pi.py