2013年8月12日 星期一

第一次玩Spark Shark 就上手 - Spark安裝篇




Shark 和 Spark 在安裝上充滿了彈性,有很多種組合方式,下圖就是Spark 和 Shark 可以搭配的安裝模式,與種類。

圖片來源:自行整理


Spark 如上圖所示,在運行上有好幾種模式:

1. 分散式模式:


1-1. 架構在Mesos上


而架構在Mesos 上又有分兩種模式:

1-1-1. fine-grained (Default)

根據官網的解釋,在Fine-grained模式下,每一個Spark task 就等於是一個Mesos Task ,所以可以在同一台機器上跑好幾個Spark Task,好處是方便動態調配資源,需要的時候再去啟動一個Task,缺點是啟動每一個Spark Task 會需要額外的資源花費,所以比較不適合需要low-latency 的application(像是互動式query 或是 web request)。


圖片來源:自行整理

1-1-2. coarse-grained

而跑在coarse-grained 模式下,每一台Mesos 所管理的機器上,只會啟動一組Spark Task,整體資源規劃是透過mesos 動態排程(dynamically schedule) 所屬的作小工作"mini-tasks",優點就是啟動每個工作所需的時間較少,但是需要這個Task必須事先就預留起來。 (這應該比較像Hadoop 事先就先規劃好每台機器有幾個 Job Tracker一樣?)



圖片來源:自行整理

1-2. 架構在YARN 上 (實驗性質)


架構再YARN上號稱跟架構再Mesos 上一樣簡單,但是我就沒有特別去研究的,有興趣的可以自行研究。


2. 單機模式


既然是第一次玩Spark 就上手,所以這篇文章會著重在第二種模式,也就是單機模式, 顧名思義不需要架構在Mesos或是YARN 的Cluster 上,也可以單獨運作於Hadoop 之外,單機就可以直接執行運算,在這個模式下就可以直接存取Local Disk 或是Hdfs(透過lib 去存取Hdfs),甚至是S3。不過要澄清一下,所謂的單機模式不代表只能跑一台,他同樣也是可以跑很多台變成Cluster 的形式,唯一的差別就是所有的slave worker 都是由Spark Master所控制(類似coarse-grained mode 每一台機器都預先裝好一組Spark worker)。

所有的Node 都是Master Node 透過ssh在控制,如下圖所示:


圖片來源:自行整理


安裝步驟



Pre-Requirement:

1. 安裝Java (這應該大家都會就跳過了)

2. 安裝Scala  (注意:目前Spark 0.7.3 版限定只能用scala-2.9.3)

# wget http://www.scala-lang.org/files/archive/scala-2.9.3.tgz
# tar xvf scala-2.9.3.tgz
# sudo mv scala-2.9.3 /usr/lib
# sudo ln -s /usr/lib/scala-2.9.3 /usr/lib/scala

設定Path 和 Scala home 編輯 /etc/profile.d/scala.sh

export SCALA_HOME=/usr/lib/scala
export PATH=$PATH:$SCALA_HOME/bin


3. 下載並安裝Spark

# wget http://spark-project.org/download/spark-0.7.3-prebuilt-cdh4.tgz
# tar zxvf spark-0.7.3-prebuilt-cdh4.tgz
# mv spark-0.7.3 /usr/lib/
# ln -s /usr/lib/spark-0.7.3 /usr/lib/spark

編輯~/.bashrc 加入spark home and path

export SPARK_HOME=/usr/lib/scala
export PATH=$PATH:$SPARK_HOME/bin

4.  設定成 Standalone Cluster 模式 (其他台機器也依照前面的三個步驟安裝)

我邊準備了三台VM要用來跑Cluster,分別是lab-hadoop-m1,lab-hadoop-m2,lab-hadoop-m3,預計讓m1 跑Spark Master,由於Spark 會透過ssh 去控制其他台機器,所以建議先設定讓lab-hadoop-m1這台機器不用輸入密碼,改使用private key 的方式登入其他機器。

4-1. 設定Private key 登入設定

使用 ssh-keygen 產生key pair時會詢問你一組密碼(實際上你可以偷懶使用空白密碼),然後再透過ssh-copy-id這個tool 幫你把key 傳到其他台機器

# ssh-keygen -t rsa -f ~/.ssh/id_rsa -b 4096 -C “iamcomment”
# ssh-copy-id -i .ssh/id_rsa.pub root@lab-hadoop-m2
# ssh-copy-id -i .ssh/id_rsa.pub root@lab-hadoop-m3

4-2. 設定slave

編輯/usr/lib/spark/conf/slaves 這個檔案,輸入slave 的ip或是hostname,因為我m1那台機器上也想跑一個spark worker所以我的設定如下:

localhost
lab-hadoop-m1
lab-hadoop-m2

4-3. 設定/usr/lib/spark/conf/spark-env.sh ,根據你的需求去設定裡面的內容,請參考cluster-launch-scriptsconfiguration

#!/usr/bin/env bash

# This file contains environment variables required to run Spark. Copy it as
# spark-env.sh and edit that to configure Spark for your site. At a minimum,
# the following two variables should be set:
# - SCALA_HOME, to point to your Scala installation, or SCALA_LIBRARY_PATH to
#   point to the directory for Scala library JARs (if you install Scala as a
#   Debian or RPM package, these are in a separate path, often /usr/share/java)
# - MESOS_NATIVE_LIBRARY, to point to your libmesos.so if you use Mesos
#
# If using the standalone deploy mode, you can also set variables for it:
# - SPARK_MASTER_IP, to bind the master to a different IP address
# - SPARK_MASTER_PORT / SPARK_MASTER_WEBUI_PORT, to use non-default ports
# - SPARK_WORKER_CORES, to set the number of cores to use on this machine
# - SPARK_WORKER_MEMORY, to set how much memory to use (e.g. 1000m, 2g)
# - SPARK_WORKER_PORT / SPARK_WORKER_WEBUI_PORT
# - SPARK_WORKER_INSTANCES, to set the number of worker instances/processes
#   to be spawned on every slave machine

SPARK_MASTER_WEBUI_PORT=8082
SPARK_WORKER_MEMORY=1g


5. 啟動Spark Cluster

啟動所有Master 和 Slave(Worker)

/usr/lib/spark/bin/spark-all.sh

如果沒有意外,就會看到以下訊息,Master在lab-hadoop-m1啟動,然後Slave 分別在lab-hadoop-m2,lab-hadoop-m3 啟動
starting spark.deploy.master.Master, logging to /usr/lib/spark-0.7.3/bin/../logs/spark-root-spark.deploy.master.Master-1-lab-hadoop-m1.out
Master IP: lab-hadoop-m1
cd /usr/lib/spark-0.7.3/bin/.. ; /usr/lib/spark/bin/start-slave.sh 1 spark://lab-hadoop-m1:7077
localhost: starting spark.deploy.worker.Worker, logging to /usr/lib/spark-0.7.3/bin/../logs/spark-root-spark.deploy.worker.Worker-1-lab-hadoop-m1.out
lab-hadoop-m3: starting spark.deploy.worker.Worker, logging to /usr/lib/spark-0.7.3/bin/../logs/spark-root-spark.deploy.worker.Worker-1-lab-hadoop-m3.out
lab-hadoop-m2: starting spark.deploy.worker.Worker, logging to /usr/lib/spark-0.7.3/bin/../logs/spark-root-spark.deploy.worker.Worker-1-lab-hadoop-m2.out


6. 測試Spark 是否安裝順利

在/usr/lib/spark 裡面執行以下指令

./run spark.examples.SparkLR local[2]


如果有跑出以下結果,代表安裝順利

Final w: (5816.075967498865, 5222.008066011391, 5754.751978607454, 3853.1772062206846, 5593.565827145932, 5282.387874201054, 3662.9216051953435, 4890.78210340607, 4223.371512250292, 5767.368579668863)


7. 檢視Web 管理介面

在瀏覽器輸入lab-hadoop-m1的ip,port 8020,應該就可以看到以下畫面



好Spark 裝好了,接下來就換Shark~

延伸閱讀:

[1] Shark 的實驗筆記

張貼留言