1. 程式人生 > 實用技巧 >大資料學習16_Spark叢集搭建以及入門案例執行

大資料學習16_Spark叢集搭建以及入門案例執行

Spark

Spark是什麼

  • Apache Spark 是一個快速的, 多用途的叢集計算系統, 相對於 Hadoop MapReduce 將中間結果儲存在磁碟中, Spark 使用了記憶體儲存中間結果, 能在資料尚未寫入硬碟時在記憶體中進行運算.
  • Spark 只是一個計算框架, 不像 Hadoop 一樣包含了分散式檔案系統和完備的排程系統, 如果要使用 Spark, 需要搭載其它的檔案系統和更成熟的排程系統
  • Spark 產生之前, 已經有非常成熟的計算系統存在了, 例如 MapReduce, 這些計算系統提供了高層次的API, 把計算執行在叢集中並提供容錯能力, 從而實現分散式計算.雖然這些框架提供了大量的對訪問利用計算資源的抽象, 但是它們缺少了對利用分散式記憶體的抽象, 這些框架多個計算之間的資料複用就是將中間資料寫到一個穩定的檔案系統中(例如HDFS), 所以會產生資料的複製備份, 磁碟的I/O以及資料的序列化, 所以這些框架在遇到需要在多個計算之間複用中間結果的操作時會非常的不高效.而這類操作是非常常見的, 例如迭代式計算, 互動式資料探勘, 圖計算等.
  • 認識到這個問題後, 學術界的 AMPLab 提出了一個新的模型, 叫做RDDs.RDDs是一個可以容錯且並行的資料結構, 它可以讓使用者顯式的將中間結果資料集儲存在內中, 並且通過控制資料集的分割槽來達到資料存放處理最優化.同時RDDs也提供了豐富的 API 來操作資料集.

Spark的優點

  • Spark 是為了解決 MapReduce 等過去的計算系統無法在記憶體中儲存中間結果的問題
  • Spark 的核心是 RDDs, RDDs 不僅是一種計算框架, 也是一種資料結構
  • Spark 的在記憶體時的執行速度是 Hadoop MapReduce 的100倍
  • 基於硬碟的運算速度大概是 Hadoop MapReduce 的10倍
  • Spark 實現了一種叫做 RDDs 的 DAG 執行引擎, 其資料快取在記憶體中可以進行迭代處理
  • Spark 支援 Java, Scala, Python, R, SQL 等多種語言的API.
  • Spark 支援超過80個高階運算子使得使用者非常輕易的構建平行計算程式
  • Spark 可以使用基於 Scala, Python, R, SQL的 Shell 互動式查詢.
  • Spark 提供一個完整的技術棧, 包括 SQL執行, Dataset命令式API, 機器學習庫MLlib, 圖計算框架GraphX, 流計算SparkStreaming
  • 使用者可以在同一個應用中同時使用這些工具, 這一點是劃時代的

Spark和Hadoop的異同

Spark 叢集搭建

這裡是將Spark搭建在Hadoop的yarn叢集中,採用spark的版本是2.2.0的,下載的時候要和Hadoop的版本對應。我的Hadoop版本是2.7.5的。

下載連結:https://archive.apache.org/dist/spark/spark-2.2.0/spark-2.2.0-bin-hadoop2.7.tgz

解壓移動

解壓 Spark 安裝包

tar xzvf spark-2.2.0-bin-hadoop2.7.tgz

移動 Spark 安裝包

mv spark-2.2.0-bin-hadoop2.7.tgz /export/servers/spark

修改配置檔案

修改配置檔案`spark-env.sh`, 以指定執行引數

cp spark-env.sh.template spark-env.sh vi spark-env.sh

將以下內容複製進配置檔案末尾

# 指定 Java Home export JAVA_HOME=/export/servers/jdk1.8.0 (和jdk版本對應)

# 指定 Spark Master 地址 export SPARK_MASTER_HOST=node01 export SPARK_MASTER_PORT=7077

修改配置檔案slaves, 以指定從節點為止, 從在使用sbin/start-all.sh啟動叢集的時候, 可以一鍵啟動整個叢集所有的 Worker

cp slaves.template slaves vi slaves

檔案末尾新增

node02 node03

分發和執行

將 Spark 安裝包分發給叢集中其它機器

cd /export/servers scp -r spark root@node02:$PWD scp -r spark root@node03:$PWD

啟動 Spark Master 和 Slaves, 以及 HistoryServer

cd /export/servers/spark sbin/start-all.sh sbin/start-history-server.sh

高可用配置

對於 Spark Standalone 叢集來說, 當 Worker 排程出現問題的時候, 會自動的彈性容錯, 將出錯的 Task 排程到其它 Worker 執行

但是對於 Master 來說, 是會出現單點失敗的, 為了避免可能出現的單點失敗問題, Spark 提供了兩種方式滿足高可用

  • 使用 Zookeeper 實現 Masters 的主備切換

  • 使用檔案系統做主備切換

進入spark-env.sh所在目錄, 開啟 vi 編輯

編輯spark-env.sh, 新增 Spark 啟動引數, 並去掉 SPARK_MASTER_HOST 地址,內容如下:

 1 # 指定 Java Home
 2 export JAVA_HOME=/export/servers/jdk1.8.0_141
 3 
 4 # 指定 Spark Master 地址
 5 # export SPARK_MASTER_HOST=node01
 6 export SPARK_MASTER_PORT=7077
 7 
 8 # 指定 Spark History 執行引數
 9 export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=4000 -Dspark.history.retainedApplications=3 -Dspark.history.fs.logDirectory=hdfs://node01:8020/spark_log"
10 
11 # 指定 Spark 執行時引數
12 export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=node01:2181,node02:2181,node03:2181 -Dspark.deploy.zookeeper.dir=/spark"

配置完之後在進行一次分發即可。

啟動檢視是否配置成功

node01上啟動整個叢集

sbin/start-all.sh sbin/start-history-server.sh

node02上單獨再啟動一個 Master

sbin/start-master.sh

在node01啟動master

在node02再一次啟動一個master

在Web UI介面檢視狀態

可以看到node01是啟用狀態,node02是備用狀態

入門案例執行

Spark自帶的蒙特卡洛演算法求圓周率的值;

jar包路徑如下

bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://node01:7077,node02:7077,node03:7077 \
--executor-memory 1G \
--total-executor-cores 2 \
/export/servers/spark/examples/jars/spark-examples_2.11-2.2.0.jar \
100

執行結果

這樣就可以證明Spark完全搭建完成!!!