Spark的知識點不少,決定分多P來慢慢講🤣,比較關鍵的RDD算子其實已經寫了大半,奈何內容仍是太多了就不和這篇扯皮的放一塊兒了。java
老套路,咱們點開官網來see see先吧
node
把這句話翻譯一下
python
spark是在Hadoop基礎上的改進,是 UC Berkeley AMP lab 所開源的類 Hadoop MapReduce 的通用的並行計算框架,Spark 基於 mapReduce 算法實現的分佈式計算,它擁有 Hadoop MapReduce 所具備的優勢。web
但不一樣於MapReduce的是Job中間輸出和結果能夠保存在內存中,從而再也不須要讀寫 HDFS,所以Spark能更好地適用於數據挖掘與機器學習等須要迭代的mapReduce的算法。可是它僅僅只是涉及到計算,並無涉及到數據的存儲,後期須要使用spark對接外部的數據源,好比 Hadoop 中的 HDFS。算法
其實就是官網主頁如下的內容sql
把內容丟到百度翻譯中去
shell
先無論什麼DAG調度,查詢優化···等等諸如此類的專業術語,就看那張柱形圖那個百來倍速度咱們就知道它很快就是了,MapReduce 須要 110s 的事情它 0.9s 就完成了apache
大概能夠分爲兩個方面vim
1.基於內存:mapreduce任務在計算的時候,每個job的輸出結果會落地到磁盤,後續有其餘的job須要依賴於前面job的輸出結果,這個時候就須要進行大量的磁盤io操做,性能就比較低。而spark任務在計算的時候,job的輸出結果能夠保存在內存中,後續有其餘的job須要依賴於前面job的輸出結果,這個時候就直接從內存中獲取,避免了磁盤io操做,因此性能就得以提高。服務器
2.進程與線程方面:mapreduce任務以進程的方式運行在yarn集羣中,好比程序中有100個MapTask,一個task就須要一個進程,這些task要運行就須要開啓100個進程。
spark任務以線程的方式運行在進程中,好比程序中有100個MapTask,後期一個task就對應一個線程,這裏就不在是進程,這些task須要運行,這裏若是極端一點:只須要開啓1個進程,在這個進程中啓動100個線程就能夠了。進程中能夠啓動不少個線程,而開啓一個進程與開啓一個線程須要的時間和調度代價是不同。開啓一個進程須要的時間遠遠大於開啓一個線程。
這個就沒有啥好展開的了,就是能夠經過 java/scala/python/R/SQL 等不一樣語言快速去編寫 spark 程序
其實能夠理解爲 Spark 已經造成了本身的一個生態,其內部包含了許多模塊
SparkSQL:經過sql去作離線分析
SparkStreaming:解決實時計算用的
Mlib:機器學習的算法庫
Graphx:圖計算方面的
複製代碼
spark程序就是一個計算邏輯程序,這個任務要運行就須要計算資源(內存、cpu、磁盤),哪裏能夠給當前這個任務提供計算資源,就能夠把spark程序提交到哪裏去運行
它會執行客戶端寫好的main方法,它會構建一個名叫 SparkContext 對象。該對象 是全部spark程序的執行入口
給 Spark 程序提供外部計算資源的服務,通常來講有如下3種
正常來講咱們都會使用 Yarn 去進行管理
Master是整個spark集羣的老大,負責任務資源的分配。也就是 Spark 集羣中負責幹活的小弟,是負責任務計算的節點
Executor 是一個進程,它會在worker節點啓動該進程(計算資源)
spark任務是以task線程的方式運行在worker節點對應的executor進程中
一筆帶過。簡單點來講就是下好安裝包丟到服務器,解壓下來去到conf文件夾 vim spark-env.sh,配一下 Java 的環境變量和 zookeeper,而後 vim slaves 去配置 worker 節點。而後修改 Spark 的環境變量而且分發到 worker 中,而後 source /etc/profile 便可。
須要注意的是咱們通常爲了 Spark 集羣的高可用會有多個master(Hadoop HA的套路),通常來講會這樣配置
#配置zk相關信息
export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=node1:2181,node2:2181,node3:2181
-Dspark.deploy.zookeeper.dir=/spark"
複製代碼
上面其實就是 -D 而後帶上3個參數,參數和參數之間用空格隔開便可
spark.deploy.recoveryMode 是高可用方案依賴於zookeeper進行恢復,第二個 spark.deploy.zookeeper.url 指定了zookeeper的地址,第三個 spark.deploy.zookeeper.dir 是指這個zookeeper節點負責接收 Spark 產生的元數據(目錄就是一個字符串)
先啓動zk再啓動spark集羣
能夠在任意一臺服務器來執行(條件:須要任意2臺機器之間實現ssh免密登陸)
$SPARK_HOME/sbin/start-all.sh
在哪裏啓動這個腳本,就在當前該機器啓動一個Master進程
整個集羣的worker進程的啓動由slaves文件控制
後期能夠在其餘機器單獨再啓動master
$SPARK_HOME/sbin/start-master.sh
複製代碼
若是部署成功,是能夠經過
http://master主機名:8080
複製代碼
來訪問一個web界面的,各類各樣的集羣信息都能看獲得,大體包括
整個spark集羣的詳細信息
整個spark集羣總的資源信息
整個spark集羣已經使用的資源信息
整個spark集羣還剩的資源信息
整個spark集羣正在運行的任務信息
整個spark集羣已經完成的任務信息
複製代碼
補充一句,備用的master節點的話,status 的值就會是 standby
上面的信息英文都不難理解,這裏就不一一說明了。
在高可用模式下,整個spark集羣就有不少個master,其中只有一個master被zk選舉成活着的master,其餘的多個master都處於standby,同時把整個spark集羣的元數據信息經過zk中節點進行保存。
後期若是活着的master掛掉。首先zk會感知到alive的master掛掉,下面開始在多個處於standby中的master進行選舉,再次產生一個alive的master,這個alive的master會 讀取保存在zk節點中的spark集羣元數據信息 ,恢復到上一次master的狀態。整個過程在恢復的時候經歷過了不少個不一樣的階段,每一個階段都須要必定時間,最終恢復到上個alive的master的轉態,整個恢復過程通常須要1-2分鐘。
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://node1:7077 \
--executor-memory 1G \
--total-executor-cores 2 \
examples/jars/spark-examples_2.11-2.3.3.jar \
10
複製代碼
參數說明:
--class:指定包含main方法的主類
--master:指定spark集羣master地址
--executor-memory:指定任務在運行的時候須要的每個executor內存大小
--total-executor-cores: 指定任務在運行的時候須要總的cpu核數
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://node1:7077,node2:7077,node3:7077 \
--executor-memory 1G \
--total-executor-cores 2 \
examples/jars/spark-examples_2.11-2.3.3.jar \
10
複製代碼
其實沒有太多的變化。spark集羣中有不少個master,並不知道哪個master是活着的master,即便你知道哪個master是活着的master,它也有可能下一秒就掛掉,這裏就能夠把全部master都羅列出來
--master spark://node1:7077,node2:7077,node3:7077
複製代碼
後期程序會輪詢整個master列表,最終找到活着的master,而後向它申請計算資源,最後運行程序。
···
原本也是打算寫一個scala的,可是想到這東西也不算難,並且你們也能夠經過各種的搜索引擎去學習,因此就丟到草稿裏面了(其實就是懶了沒寫完😂)
這篇其實只是一個概念入門,下一篇咱們開始扯 RDD 。有興趣的朋友可持續關注哦!公衆號:說出你的願望吧