英文標題:Quick Start
英文原址:http://spark.apache.org/docs/latest/quick-start.html
Spark Version:1.6.0
1. 使用Spark Shell進行交互分析
1. 基礎使用
Spark Shell提供了建議的學習API的方式,是一個進行交互式數據分析的強大工具,它提供了Scala和Python的交互環境。
- scala
./bin/spark-shell
- python
./bin/pyspark
Spark的主要抽象是一個叫彈性分佈式數據集(Resilient Distributed Dataset,RDD)的數據集合,RDD可以由Hadoop的輸入格式(例如HDFS文件)創建或者由其他RDD轉換而來。下例RDD由一個文件格式創建而來:
scala> val textFile = sc.textFile("/data/README.md")
textFile: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[1] at textFile at <console>:27
RDD有動作-actions(返回值)和轉換-transformations(返回指向新RDD的指針)兩種操作:
- 動作舉例
scala> val textFile.count() //此RDD中項-items的數量
res0: Long = 95
scala> textFile.first() //此RDD的第一個項
res1: String = # Apache Spark
- 轉換舉例
scala> val linesWithSpark = textFile.filter(line => line.contains("Spark"))
linesWithSpark: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[2] at filter at <console>:29
同時可以將動作和轉換串起來執行:
scala> textFile.filter(line => line.contains("Spark")).count //多少行包含單詞‘Spark’
res2: Long = 17
2. 複雜的RDD操作
RDD的動作和轉換可以用來進行更復雜的計算。
- 示例任務:找出README.md中包含單詞數最多的行的單詞數量
scala> textFile.map(line => line.split(" ").size).reduce((a,b) => if(a > b) a else b)
res3: Int = 14
首先將每一行映射(map)成一個整型值(創建了一個新的RDD),然後在此RDD上調用reduce找單詞數量最大的。map和reduce的參數是Scala中函數,可以使用任意語言特徵或Scala/Java庫。例如,可以輕鬆的調用其他地方聲明的函數,如下使用了Java中的Math.max()函數達到上述代碼同樣的效果:
scala> import java.lang.Math
import java.lang.Math
scala> textFile.map(line => line.split(" ").size).reduce((a,b) => Math.max(a,b))
res4: Int = 14
一個比較通用的數據計算模型是MapReduce,Spark可以輕鬆的執行MapReduce,如下:
scala> val wordCounts = textFile.flatMap(line => line.split(" ")).map(word => (word,1)).reduceByKey((a,b) => a+b)
wordCounts: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[8] at reduceByKey at <console>:30
此處結合了flatMap,map,reduceByKey幾個不同的轉換計算文件中每一個單詞的數量,得到一個(String,Int)對的RDD。接下來使用collection動作收集和呈現單詞技術的結果:
scala> wordCounts.collect()
res5: Array[(String, Int)] = Array((package,1), (this,1), (engine,1), (version,1), (file,1), (documentation,,1), (MASTER,1), (example,3), (are,1), (systems.,1), (params,1), (scala>,1), (DataFrames,,1), (provides,1), (refer,2)...
3. 緩存(Caching)
Spark支持將數據集拉到集羣的內存緩存中,當數據集被頻繁的訪問(如熱點數據集或雲心個交互式的算法例如PageRank)時,這個特性特別重要。請看示例:
scala> linesWithSpark.cache()
res6: linesWithSpark.type = MapPartitionsRDD[2] at filter at <console>:29
scala> linesWithSpark.count()
res7: Long = 17
scala> linesWithSpark.count()
res8: Long = 17
示例中,將linesWithSpark這個RDD進行緩存(雖然看上去將一個100行左右的文件進行緩存很可笑,但是此操作同樣可以應用於非常大的數據集之上,即使數據集跨上百個節點同樣可以),然後對它進行了2次count操作。從http://localhost:4040/jobs/ 的作業完成來看,緩存之後第一次計算仍然需要0.1s,但是第二次計算由於已經緩存成功,所以所需時長爲16ms。
2. Spark應用程序
假設我們希望使用Spark API寫一個自包含的應用程序,下面示例使用Scala(sbt編譯)實現(Java(Maven編譯)、Python請跳轉至官方處查看)。
- scala
/* SimpleApp.scala */
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
object SimpleApp {
def main(args: Array[String]) {
val logFile = "/data/README.md" // Should be some file on your system
val conf = new SparkConf().setAppName("Simple Application")
val sc = new SparkContext(conf)
val logData = sc.textFile(logFile, 2).cache()
val numAs = logData.filter(line => line.contains("a")).count()
val numBs = logData.filter(line => line.contains("b")).count()
println("Lines with a: %s, Lines with b: %s".format(numAs, numBs))
}
}
應用程序必須頂一個一個main方法,而不是直接繼承scala.App,因爲scala.App的子類可能會運行錯誤。示例程序只計算了在README.md中包含字母a和b的總行數,此外,與上述的Spark-Shell示例不同之處在於,在應用程序中需要自行初始化SparkContext,在Spark Shell中已經初始化爲sc。
給SparkContext構造器傳遞一個SparkConf對象作爲參數,這個SparkConf對象包含了應用程序的一些信息,此程序基於Spark API,程序的運行目錄結構中將包含一個simple.sbt文件用戶解釋Spark的依賴:
name := "Simple Project"
version := "1.0"
scalaVersion := "2.10.5"
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.0"
接下來,需要根據當前的目錄結構部署SimpleApp.scala和simple.sbt,以使sbt正常運行,然後可以將此程序打包成JAR包,使用spark-submit腳本進行提交運行。
# Your directory layout should look like this
$ find .
.
./simple.sbt
./src
./src/main
./src/main/scala
./src/main/scala/SimpleApp.scala
# Package a jar containing your application
$ sbt package
...
[info] Packaging {..}/{..}/target/scala-2.10/simple-project_2.10-1.0.jar
# Use spark-submit to run your application
$ YOUR_SPARK_HOME/bin/spark-submit \
--class "SimpleApp" \
--master local[4] \
target/scala-2.10/simple-project_2.10-1.0.jar
...
Lines with a: 46, Lines with b: 23
3. 深入Spark
- API的深入學習,查看“Spark編程指南”
- 在集羣上運行應用程序,查看“部署概述”
- Spark示例(examples目錄下,包括Scala、Java、Python、R),可運行如下:
# For Scala and Java, use run-example:
./bin/run-example SparkPi
# For Python examples, use spark-submit directly:
./bin/spark-submit examples/src/main/python/pi.py
# For R examples, use spark-submit directly:
./bin/spark-submit examples/src/main/r/dataframe.R