官方介紹: linux
Apache Spark™ is a fast and general engine for large-scale data processing.web
Spark Introduce算法
Run programs up to 100x faster than Hadoop MapReduce in memory, or 10x faster on disk.sql
Apache Spark has an advanced DAG execution engine that supports acyclic data flow and in-memory computing.shell
Write applications quickly in Java, Scala, Python, R.apache
Spark offers over 80 high-level operators that make it easy to build parallel apps. And you can use it interactively from the Scala, Python and R shells.vim
Combine SQL, streaming, and complex analytics.瀏覽器
Spark powers a stack of libraries including SQL and DataFrames, MLlib for machine learning, GraphX, and Spark Streaming. You can combine these libraries seamlessly in the same application.緩存
Spark是UC Berkeley AMP lab (加州大學伯克利分校的AMP實驗室)所開源的,後貢獻給Apache。是一種快速、通用、可擴展的大數據分析引擎。它是不斷壯大的大數據分析解決方案家族中備受關注的明星成員,爲分佈式數據集的處理提供了一個有效框架,並以高效的方式處理分佈式數據集。Spark集批處理、實時流處理、交互式查詢、機器學習與圖計算於一體,避免了多種運算場景下須要部署不一樣集羣帶來的資源浪費。目前,Spark社區也成爲大數據領域和Apache軟件基金會最活躍的項目之一,其活躍度甚至遠超曾經只能望其項背的Hadoop。安全
一個Hadoop job一般都是這樣的:
1)從HDFS讀取輸入數據;
2)在Map階段使用用戶定義的mapper function,而後把結果Spill到磁盤;
3)在Reduce階段,從各個處於Map階段的機器中讀取Map計算的中間結果,使用用戶定義的reduce function,一般最後把結果寫回HDFS。
Hadoop的問題在於,一個Hadoop job會進行屢次磁盤讀寫,好比寫入機器本地磁盤,或是寫入分佈式文件系統中(這個過程包含磁盤的讀寫以及網絡傳輸)。考慮到磁盤讀取比內存讀取慢了幾個數量級,因此像Hadoop這樣高度依賴磁盤讀寫的架構就必定會有性能瓶頸。
此外,在實際應用中咱們一般須要設計複雜算法處理海量數據,並且不是一個Hadoop job能夠完成的。好比機器學習領域,須要大量使用迭代的方法訓練機器學習模型。而像Hadoop的基本模型就只包括了一個Map和 一個Reduce階段,想要完成複雜運算就須要切分出無數單獨的Hadoop jobs,並且每一個Hadoop job都是磁盤讀寫大戶,這就讓Hadoop顯得力不從心。
隨着業界對大數據使用愈來愈深刻,你們都呼喚一個更強大的處理框架,可以真正解決更多複雜的大數據問題。
2009年,美國加州大學伯克利分校的AMPLab設計並開發了名叫Spark的大數據處理框架。真如其名,Spark像燎原之火,迅猛佔領大數據處理框架市場。
Spark沒有像Hadoop同樣使用磁盤讀寫,而轉用性能高得多的內存存儲輸入數據、處理中間結果、和存儲最終結果。在大數據的場景中,不少計算都有循環往復的特色,像Spark這樣容許在內存中緩存輸入輸出,上一個job的結果立刻能夠被下一個使用,性能天然要比Hadoop MapReduce好得多。
一樣重要的是,Spark提供了更多靈活可用的數據操做,好比filter、join以及各類對key value pair的方便操做,甚至提供了一個通用接口,讓用戶根據須要開發定製的數據操做。
此外,Spark自己做爲平臺也開發了streaming處理框架spark streaming、SQL處理框架Dataframe、機器學習庫MLlib和圖處理庫GraphX。如此強大,如此開放,基於Spark的操做,應有盡有。
Hadoop的MapReduce爲何不使用內存存儲?
是歷史緣由。當初MapReduce選擇磁盤,除了要保證數據存儲安全之外,更重要的是當時企業級數據中心購買大容量內存的成本很是高,選擇基於內存的架構並不現實;如今Spark真的遇上了好時候,企業能夠輕鬆部署多臺大內存機器,內存大到能夠裝載全部要處理的數據。
軟件版本:
jdk-8u65-linux-x64.tar.gz
spark-2.0.1-bin-hadoop2.7.tgz
安裝和配置好JDK。
上傳和解壓Spark安裝包。
進入Spark安裝目錄下的conf目錄,複製conf spark-env.sh.template文件爲spark-env.sh,而後編輯此文件,命令以下:
cp conf spark-env.sh.template spark-env.sh vim spark-env.sh
增長以下內容:
SPARK_LOCAL_IP=spark01
如上圖:整個模版文件都是註銷的語句,因此這條語句能夠添加到任何位置。
「=」後面填寫的時服務器地址,這裏使用了主機名的形式,固然須要在/etc/hosts文件中增長映射關係。
保存退出,那麼單機模式的Spark就配置好了。
在Spark的bin目錄下執行以下命令:
sh spark-shell --master=local
或者
./spark-shell
啓動後,以下圖,證實啓動成功:
發現打印消息,有以下字樣:
Spark context Web UI available at http://192.168.75.150:4040
後面的http地址是Spark的Web管理界面的訪問地址,web界面以下:
Spark context available as 'sc' (master = local, app id = local-1490336686508).
上述語句說明了Spark提供了環境對象sc。
Spark session available as 'spark'.
Spark提供了會話獨享spark。
準備三臺服務器,分別命名爲spark0一、spark0二、spark03,三臺的配置信息基本相同,這裏以spark01爲例。將三臺服務器之間的免密登陸提早作好。
安裝jdk,配置環境變量。
上傳解壓spark安裝包。
進入spark安裝目錄的conf目錄,進行相關文件的配置。
進入Spark安裝目錄下的conf目錄,複製conf spark-env.sh.template文件爲spark-env.sh,而後編輯此文件,命令以下:
cp conf spark-env.sh.template spark-env.sh vim spark-env.sh
此文件爲啓動文件,主要配置本機ip、數據存放目錄、以及jdk的環境變量。
配置示例:
#本機ip地址 SPARK_LOCAL_IP=spark01 #spark的shuffle中間過程會產生一些臨時文件,此項指定的是其存放目錄,不配置默認是在 /tmp目錄下 SPARK_LOCAL_DIRS=/home/software/spark-2.0.1-bin-hadoop2.7/tmp export JAVA_HOME=/home/software/jdk1.8
在conf目錄下,編輯slaves文件,主要配置的集羣中執行任務的服務器ip。
配置示例:
spark01 spark02 spark03
配置完後,將spark目錄遠程拷貝至其餘服務器,並更改spark-env.sh的SPARK_LOCAL_IP配置。
拷貝命令以下:
scp -r spark-2.0.1-bin-hadoop2.7 root@spark02:/home/software/spark-2.0.1-bin-hadoop2.7 scp -r spark-2.0.1-bin-hadoop2.7 root@spark03:/home/software/spark-2.0.1-bin-hadoop2.7
分別編輯spark0二、spark03上的spark-env.sh文件中SPARK_LOCAL_IP的值,改爲對應節點的主機名或者ip。
想使那臺服務器成爲master就進入到那臺服務的spark安裝目錄的bin目錄執行以下命令,此命令會啓動整個集羣的服務,不須要單獨啓動每一個服務器的服務:
sh start-all.sh
經過jps查看各機器進程,若是啓動成功,每臺機器會有以下的進程:
01:Master +Worker
02:Worker
03:Worker
經過瀏覽器訪問管理界面:http://192.168.75.11:8080
經過spark shell鏈接spark集羣,進入spark的bin目錄執行以下命令便可進入使用:
sh spark-shell.sh --master spark://192.168.75.11:7077
①讀取本地
sc.textFile("/root/work/words.txt")
默認讀取本機數據,這種方式須要在集羣的每臺機器上的對應位置上都一份該文件,浪費磁盤。
②讀取HDFS
因此應該經過hdfs存儲數據,讀取方式以下:
sc.textFile("hdfs://hadoop01:9000/mydata/words.txt")
也能夠在spark-env.sh中配置選項HADOOP_CONF_DIR,配置爲hadoop的etc/hadoop的地址,使默認訪問的是hdfs的路徑。若是修改默認地址是hdfs地址,則若是想要訪問文件系統中的文件,須要指明協議爲file,讀取方式以下:
sc.text("file:///xxx/xx")