說明: 要在本地運行spark,由於spark是用scala語言寫的,運行在JVM上面,你要作的只是安裝java 6及以上版本就夠了。html
訪問http://spark.apache.org/downloads.html 的apache 官網下載sparkjava
獲得咱們的預編譯版本的 spark-1.2.0-bin-hadoop2.4.tgzpython
解壓完是這樣的:shell
咱們看一下spark的目錄結構:apache
README.md 包含用來入門spark的簡單的使用說明編程
bin 包含能夠用來和spark進行各類方式的交互的一些列可執行文件,包括稍後會用到的spark shellapi
core streaming python。。。 包含spark項目主要組件的源代碼maven
examples 包含一些能夠查看和運行的spark程序,對學習spark 的 API很是由幫助。分佈式
接下來咱們先嚐試一下用spark shell 運行一些spark自帶的實例代碼,而後下回在嘗試編譯並運行咱們本身的spark程序。函數
spark帶有交互式的shell,能夠做即便數據分析。和其餘的系統中的shell相似,但不一樣的是在其餘shell工具中你只能使用單機的硬盤和內存來操做數據。而spark shell 能夠用來與分佈式存儲在許多臺機器的內存或者硬盤上的數據進行交互,而且處理過程的分發由spark自動控制完成。
因爲spark可以在工做節點上把數據讀取到內存中,因此許多分佈式計算均可以在幾秒鐘以內完成,哪怕是那種在十幾個節點上處理TB級別的數據的計算。因此那些交互式的即時探索性分析很是適合spark。spark提供Python及Scala的加強版shell,支持與集羣的鏈接。
spark shell的強大之處 就在於使用某個語言的shell做一些簡單的數據分析;
打開spark安裝目錄,進入bin下面 ./spark-shell 注: 這是scala版本的 spark shell
有點帥~
我建議java開發人員也熟悉一下shell 即便是scala版本的,這對學習spark API 頗有幫助。
若是以爲shell中輸出的日誌信息過多而令人分心,能夠調整日誌的級別來控制輸出的信息量。你須要在conf目錄下建立一個名爲log4j.properties的文件來管理日誌設置。
Spark開發者們已經在Spark中加入了一個日誌設置文件的模板,咱們能夠在conf目錄下找到 log4j.properties.template
將這個模板複製一份,並去掉.template 放到conf下面使其生效。
咱們修改其中的這一行 將日誌級別改成WARN 這樣日誌就會大大減小的
咱們能夠看到再次啓動,日誌信息相比第一次已經少了不少了
在spark中,咱們經過對分佈式數據集的操做來表達咱們的計算意圖,這些計算會自動的在集羣上並行進行,這樣的數據集被稱爲彈性分佈式數據集,簡稱RDD。
RDD是Spark對分佈式數據和計算的基本抽象
在spark-shell中直接能夠輸入一下命令進行簡單的行數統計 如圖:
這是一個scala即時統計的例子
解釋一下:
這是建立一個命爲lines的RDD, 而後lines.count() 統計RDD中的元素個數,lines.first() 輸出RDD中的第一個元素,也就是README.md的第一行。
變量lines是一個RDD,是從你的電腦上的一個本地文本文件建立出來的。咱們能夠在這個RDD上運行各類並行操做,好比統計這個數據集中的元素個數,或者輸出第一個元素。
從上層看,每一個spark應用都由一個驅動器程序(driver program)來發起集羣上的各類並行操做。驅動器程序包含應用的main函數,而且定義了集羣上的分佈式數據集。在前面的例子裏,實際的驅動器程序就是spark shell 自己,你只要輸入想要運行的操做就能夠了。
驅動器經過一個spark context對象來訪問spark。這個對象表明對計算集羣的一個鏈接。shell啓動時已經自動建立了一個spark context對象,是一個叫作sc的變量。咱們能夠經過在shell中輸入sc來查看它的類型。
一旦有了sc ,咱們就能夠用它來建立RDD,在2.2.3 中 咱們調用了sc.textFIle() 來建立了一個表明文件中各行文本的RDD,咱們能夠在這些行上進行各類數據操做,好比count()。
要執行這些操做,驅動器程序通常要管理多個執行器節點(executor),好比咱們在集羣上運行count()操做,那麼不一樣的節點會統計文件的不一樣部分的行數,因爲咱們剛纔是在本地模式下運行spark shell,所以全部的工做都在單個節點上運行,但你能夠將這個shell 鏈接到集羣上來進行並行的數據分析。
以下圖:
擴展2.2.3 中的例子,目標是篩選出文件中包含 「Python」這個單詞的行
這就篩選出了包含python這個單詞的行。
spark最神奇的地方在於像filter這樣的基於函數的操做也會在集羣上並行執行。也就是說spark會自動的將函數(好比line.contains("Python"))發到各個執行器節點上。這樣你就能夠在單一的驅動器程序中編程,而且讓代碼自動運行在多個節點上。
這一部分是如何在程序中運用spark。除了spark shell, spark 也能夠在java scala 或者python中被鏈接使用。這與在shell中使用的主要區別在於你須要自行初始化SparkContext。而後使用的API就同樣了。
鏈接spark的過程在各個語言中不同,在java和scala中,只須要給你的工程添加個對於spark-core的Maven依賴。
在maven中央倉庫添加對spark的依賴。從maven repositoy中搜索 spark 咱們暫且添加1.2版本的spark
完成了應用和spark的鏈接,而後就是導入spark包而且建立SparkContext。首先你能夠經過建立一個SparkConf對象來配置你的應用。基於這個SparkConf建立一個SparkContext對象。
代碼以下: 說明見註釋
package test; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaSparkContext; public class Test { public static void main(String[] args) { // 初始化SparkContext SparkConf conf = new SparkConf().setMaster("local").setAppName("My App"); // local是集羣URL,是告訴spark如何鏈接到集羣上,咱們使用local這個特殊的值可讓spark運行在單機單線程上而無需鏈接到集羣。 // My App 指的是應用名。當鏈接到集羣時這個值能夠幫助你在集羣管理器的用戶界面中找到你的應用。 JavaSparkContext sc = new JavaSparkContext(conf); // 接下來能夠用sc建立各類rdd, 進行各類操做此處省略1000行。。。 System.out.println("blabla..."); // 關閉SparkContext sc.stop(); } }
我會在接下來的文章中繼續詳細講解spark的用法的。