快速入門(spark 2.4.5)


本教程提供了使用Spark的快速介紹。我們將首先通過Spark的交互式shell(用Python或Scala)介紹API,然後展示如何用Java、Scala和Python編寫應用程序。
想要按照本指南學習,首先需要從Spark網站下載Spark的打包版本。因爲我們不使用HDFS,所以您下載可以爲任何版本的Hadoop包。
注意,在Spark 2.0之前,Spark的主要編程接口是彈性分佈式數據集(RDD)。Spark 2.0之後,RDD被Dataset所取代,Dataset與RDD一樣是強類型的,但是在底層有更豐富的優化。RDD接口仍受支持,您可以在RDD編程指南 中獲得更詳細的參考。但是,我們強烈建議您切換到使用Dataset,它比RDD有更好的性能。有關Dataset的更多信息,請參閱SQL編程指南
注:實際操作前,請確保已經安裝好了spark

安全

默認情況下,Spark中的安全性處於關閉狀態。這意味着您在默認情況下很容易受到攻擊。因此,運行Spark前請閱讀Spark安全指南

使用Spark Shell的交互分析

基礎

Spark的shell爲學習API提供了一個簡單的方法,同時它是一個交互分析數據的強大工具。它在Scala(在Java VM上運行,因此能很好的使用現有Java庫)或Python中都有。在Spark安裝目錄中運行以下命令可以啓動它:

./bin/spark-shell

Spark中最主要的概念是稱爲 Dataset 的分佈式數據集。Dataset可以從Hadoop讀入來創建(如HDFS文件),也可以通過其他Dataset轉換來創建。(在啓動的Spark Shell中)如下是通過Spark源目錄中的README文本文件創建一個新的Dataset:

scala> val textFile = spark.read.textFile("README.md")
textFile: org.apache.spark.sql.Dataset[String] = [value: string]

可以通過調用某些 操作(action) 直接獲取Dataset的值,也可以將其 轉換(transfor) 爲新的Dataset。更多詳細信息,請參閱API文檔

scala> textFile.count() // Number of items in this Dataset
res0: Long = 126 // May be different from yours as README.md will change over time, similar to other outputs

scala> textFile.first() // First item in this Dataset
res1: String = # Apache Spark

接下來的操作是把這個Dataset轉換成一個新的Dataset。通過調用filter返回一個新的Dataset,其中數據的是原文件內容的一個子集。

scala> val linesWithSpark = textFile.filter(line => line.contains("Spark"))
linesWithSpark: org.apache.spark.sql.Dataset[String] = [value: string]

可以把轉換操作連在一起調用:

scala> textFile.filter(line => line.contains("Spark")).count() // How many lines contain "Spark"?
res3: Long = 15

有關Dataset的更多操作

Dataset的操作和轉換可用於更復雜的計算。假設我們想找到最多單詞對應的行:

scala> textFile.map(line => line.split(" ").size).reduce((a, b) => if (a > b) a else b)
res4: Long = 15

代碼首先將文本行映射到一個整數值,隱性創建了一個新的Dataset。對該Dataset調用reduce以查找最大的字數。map和reduce的參數是Scala函數文本(閉包),可以使用任何語言特性或Scala/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))
res5: Int = 15

一種常見的數據流模式是MapReduce,它伴隨Hadoop流行起來。Spark可以輕鬆實現MapReduce流:

scala> val wordCounts = textFile.flatMap(line => line.split(" ")).groupByKey(identity).count()
wordCounts: org.apache.spark.sql.Dataset[(String, Long)] = [value: string, count(1): bigint]

在這裏,我們調用flatMap將行Dataset轉換爲詞Dataset,然後組合使用groupByKey和count將文件中的每個詞統計爲(String,Long)的Dataset 。要將數據合併到當前shell中,可以調用collect:

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> linesWithSpark.cache()
res7: linesWithSpark.type = [value: string]

scala> linesWithSpark.count()
res8: Long = 15

scala> linesWithSpark.count()
res9: Long = 15

使用Spark來瀏覽和緩存一個100行的文本文件似乎很愚蠢。有趣的是,這些相同的函數可以用於非常大的數據集,即使它們是橫跨幾十個或數百個節點。您還可以將bin/spark_shell連接到集羣,以交互方式執行此操作,詳情可參考RDD編程指南

獨立的應用程序

假設我們希望使用Spark API編寫一個獨立的應用程序,接下來將介紹Scala(使用sbt)、Java(使用Maven)和Python(pip)的簡單應用程序。
我們將在Scala中創建一個非常簡單的Spark應用程序,名爲SimpleApp.Scala:

/* SimpleApp.scala */
import org.apache.spark.sql.SparkSession

object SimpleApp {
  def main(args: Array[String]) {
    val logFile = "YOUR_SPARK_HOME/README.md" // Should be some file on your system
    val spark = SparkSession.builder.appName("Simple Application").getOrCreate()
    val logData = spark.read.textFile(logFile).cache()
    val numAs = logData.filter(line => line.contains("a")).count()
    val numBs = logData.filter(line => line.contains("b")).count()
    println(s"Lines with a: $numAs, Lines with b: $numBs")
    spark.stop()
  }
}

注:應用程序應該定義main()方法,而不是擴展scala.App。scala.App的子類在這裏可能無法正常工作。
這個程序是計算Spark 的README 文件中包含“a”的行數和包含“b”的行數(*注:您需要用安裝SPARK的位置替換YOUR_SPARK_HOME *)。與前面使用Spark shell初始化自己的SparkSession的示例不同,我們將SparkSession初始化作爲程序的一部分。
我們調用SparkSession.builder來構造一個SparkSession,然後設置應用程序名,最後調用getOrCreate來獲取SparkSession實例。
我們的應用程序依賴於Spark API,因此我們還將包含一個sbt配置文件build.sbt,它將引入Spark依賴。此文件還添加了Spark依賴的存儲庫:

name := "Simple Project"

version := "1.0"

scalaVersion := "2.12.10"

libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.4.5"

爲了讓sbt正常工作,我們需要修改SimpleApp.scala和build.sbt位置,將目錄結構調整成典型結構。目錄調整好後,我們就可以創建一個包含應用程序代碼的JAR包,然後使用spark-submit腳本運行我們的程序。(注:請確保安裝了sbt

# Your directory layout should look like this
$ find .
.
./build.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.12/simple-project_2.12-1.0.jar

# Use spark-submit to run your application
$ YOUR_SPARK_HOME/bin/spark-submit \
  --class "SimpleApp" \
  --master local[4] \
  target/scala-2.12/simple-project_2.12-1.0.jar
...
Lines with a: 46, Lines with b: 23

從入門到放棄?

恭喜您成功運行了第一個Spark應用程序!

  • 有關API的深入概述,請從RDD編程指南SQL編程指南 開始。
  • 要在集羣上運行應用程序,請轉到部署概述
  • 最後,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

英語困難戶可以等我更新,whatever,建議看原文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章