【Spark1.6官方翻譯】Spark快速入門

英文標題: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。
cache後的計算時長

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
發佈了34 篇原創文章 · 獲贊 57 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章