Spark官方文檔——快速入門(翻譯)

来源:http://www.cnblogs.com/xing901022/archive/2016/09/21/5894562.html
-Advertisement-
Play Games

本篇文檔是介紹如何快速使用spark,首先將會介紹下spark在shell中的交互api,然後展示下如何使用java,scala,python等語言編寫應用。可以查看 "編程指南" 瞭解更多的內容。 為了良好的閱讀下麵的文檔,最好是結合實際的聯繫。首先需要 "下載spark" ,然後安裝hdfs,可 ...


本篇文檔是介紹如何快速使用spark,首先將會介紹下spark在shell中的交互api,然後展示下如何使用java,scala,python等語言編寫應用。可以查看編程指南瞭解更多的內容。

為了良好的閱讀下麵的文檔,最好是結合實際的聯繫。首先需要下載spark,然後安裝hdfs,可以下載任意版本的hdfs。

Spark Shell 交互

基本操作

Spark Shell提供給用戶一個簡單的學習API的方式 以及 快速分析數據的工具。在shell中,既可以使用scala(運行在java虛擬機,因此可以使用java庫)也可以使用python。可以在spark的bin目錄下啟動spark shell:

./bin/spark-shell.sh

spark操作對象是一種分散式的數據集合,叫做Resilient Distributed Dataset(RDD)。RDD可以通過hdfs文件創建,也可以通過RDD轉換得來。

下麵就實際操作下,看看效果。我的本地有個文件——test.txt,內容為:

hello world
haha nihao

可以通過這個文件創建一個新的RDD

val textFile = sc.textFile("test.txt")
textFile: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[1] at textFile at <console>:21

在Spark中,基於RDD可以作兩種操作——Actions運算元操作以及Transformations轉換操作。

我們可以使用一些運算元操作體驗下:

scala> textFile.count() //RDD有用的數量
res1: Long = 2

scala> textFile.first() //RDD第一行
res3: String = hello world

再執行一些轉換操作,比如使用filter轉換,返回一個新的RDD集合:

scala> val lines = textFile.filter(line=>line.contains("hello"))
lines: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[2] at filter at <console>:23

scala> lines.count()
res4: Long = 1

scala> val lines = textFile.filter(line=>line.contains("haha"))
lines: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[3] at filter at <console>:23

scala> lines.count()
res5: Long = 1

scala> lines.first()
res6: String = haha nihao

更多RDD操作

RDD運算元和轉換可以組成很多複雜的計算,比如我們想找出最多一行中單詞最多的單詞數量:

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

這個操作會把一行通過split切分計數,轉變為一個整型的值,然後創建成新的RDD。reduce操作用來尋找單詞最多的那一行。

用戶可以在任何時候調用方法和庫,可以使用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

一個很常見的數據操作就是map reduce,這個操作在hadoop中很常見。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>:28

這裡使用了flatMap,map以及reduceByKey等轉換操作來計算每個單詞在文件中的數量。為了在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也支持在分散式的環境下基於記憶體的緩存,這樣當數據需要重覆使用的時候就很有幫助。比如當需要查找一個很小的hot數據集,或者運行一個類似PageRank的演算法。

舉個簡單的例子,對linesWithSpark RDD數據集進行緩存,然後再調用count()會觸發運算元操作進行真正的計算,之後再次調用count()就不會再重覆的計算,直接使用上一次計算的結果的RDD了:

scala> linesWithSpark.cache()
res7: linesWithSpark.type = MapPartitionsRDD[2] at filter at <console>:27

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

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

看起來緩存一個100行左右的文件很愚蠢,但是如果再非常大的數據集下就非常有用了,尤其是在成百上千的節點中傳輸RDD計算的結果。你也可以通過bin/spark-shell向集群提交任務,可以參考編程指南

獨立應用

要使用spark api寫一個自己的應用也很簡單,可以基於scala、java、python去寫一些簡單的應用。

/* 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 = "YOUR_SPARK_HOME/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()方法。這個程式僅僅是統計文件中包含字元ab的分別都有多少行。你可以設置YOUR_SPARK_HOME替換自己的文件目錄。不像之前在shell中的例子那樣,我們需要自己初始化sparkContext。

通過SparkConf構造方法創建SparkContext。

應用依賴於spark api,因此需要在程式中配置sbt的配置文件——simple.sbt,它聲明瞭spark的依賴關係。

name := "Simple Project"
version := "1.0"
scalaVersion := "2.11.7"
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.0.0"

為了讓sbt正確的工作,還需要創建SimpleApp.scala以及simple.sbt。然後就可以執行打包命令,通過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命令進行打包
$ sbt package
...
[info] Packaging {..}/{..}/target/scala-2.11/simple-project_2.11-1.0.jar

# Use spark-submit to run your application 通過spark-submit提交任務jar包
$ YOUR_SPARK_HOME/bin/spark-submit \
  --class "SimpleApp" \
  --master local[4] \
  target/scala-2.11/simple-project_2.11-1.0.jar
...
Lines with a: 46, Lines with b: 23

其他地址

通過上面的例子,就可以運行起來自己的Spark應用了。

那麼可以參考下麵的鏈接獲得更多的內容:

  • 為了更深入的學習,可以閱讀Spark編程指南
  • 如果想要運行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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 先看效果圖: 1概述 Activity啟動方式有四種,分別是: standard singleTop singleTask singleInstance 可以根據實際的需求為Activity設置對應的啟動模式,從而可以避免創建大量重覆的Activity等問題。 設置Activity的啟動模式,只需要 ...
  • 首先,十分感謝下麵諸位大神,通過你們的分享讓我解決了實際的問題,也學到了豐富的知識。 這些大神都是我平時在解決問題時,在百度搜索發現的,被他們技術知識所吸引,就收藏了起來。 以下排名不分先後,以後會慢慢對各位大神的博客做分析,以便大家能良好的利用。 iOS大神 封神榜 polobymulberry ...
  • Android4.4之前: 在4.4中會報許可權異常 Permission Denial: not allowed to send broadcast android.intent.action.MEDIA_MOUNTED from pid=2269, uid=20016那是因為Android4.4中 ...
  • LLDB是Low Level Debugger的簡稱,在iOS開發的調試中LLDB是經常使用的,LLDB是Xcode內置的動態調試工具。使用LLDB可以動態的調試你的應用程式,如果你不做其他的額外處理,因為debugserver缺少task_for_pid許可權,所以你只能使用LLDB來調試你自己的A ...
  • 首先看演示: 1 簡介 、如果想在Activity中得到新打開Activity 關閉後返回的數據,需要使用系統提供的startActivityForResult(Intent intent, int requestCode)方法打開新的Activity,新的Activity 關閉後會向前面的Acti ...
  • Performance Counter 是量化系統狀態或活動的一個數值,Windows Performance Monitor在一定時間間隔內(預設的取樣間隔是15s)獲取Performance Counter的當前值,並記錄在Data Collections中,通過Performance Moni ...
  • 圖解安裝 PostgreSQL 【博主】反骨仔 【原文地址】http://www.cnblogs.com/liqingwen/p/5894462.html 序 園友的一篇《Asp.Net Core 項目實戰之許可權管理系統(3) 通過EntityFramework Core使用PostgreSQL》需 ...
  • https://www.techonthenet.com/mysql/loops/leave.php This MySQL tutorial explains how to use the LEAVE statement in MySQL with syntax and examples. http ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...