1. 程式人生 > >spark1.6.0+Hadoop2.6.0+Scala-2.11.7 搭建分散式叢集

spark1.6.0+Hadoop2.6.0+Scala-2.11.7 搭建分散式叢集

昨天又搗鼓了一下,網上有些寫得很不錯的教程,自己經過嘗試後覺得需要整理一下。
spark的執行模式有多種(見官網和Spark的Standalone模式安裝部署):

  • local(本地模式):常用於本地開發測試,本地還分為local單執行緒和local-cluster多執行緒;
  • standalone(叢集模式):典型的Mater/slave模式,不過也能看出Master是有單點故障的;Spark支援ZooKeeper來實現 HA
  • on yarn(叢集模式): 執行在 yarn 資源管理器框架之上,由 yarn 負責資源管理,Spark 負責任務排程和計算
  • on mesos(叢集模式): 執行在 mesos 資源管理器框架之上,由 mesos 負責資源管理,Spark 負責任務排程和計算
  • on cloud(叢集模式):比如 AWS 的 EC2,使用這個模式能很方便的訪問 Amazon的 S3;Spark 支援多種分散式儲存系統:HDFS 和 S3

本文主要記錄的是基於standalone的方式和基於叢集的方式。

1 用虛擬機器搭建Hadoop分散式叢集

虛擬機器安裝
由於主要的實驗室環境是Ubuntu系統的伺服器,記憶體大約為64G,使用的虛擬機器為virtualbox,在官網下載,安裝步驟略。注意,請用相同的使用者名稱建立,這會為後面省去很多麻煩。
這裡寫圖片描述
主從機互ping
隨後將兩個guest機配置成slave1和slave2,host機作為master,這裡主要需要注意的是通訊問題。
要讓彼此都ping通,有一點小技巧,我是參照這個教程來做的。

https://2buntu.com/articles/1513/accessing-your-virtualbox-guest-from-your-host-os/
簡言之,在預設NAT的模式下,guest是可以直接訪問host的,也可以互相訪問,但是host不能訪問guest,不過通過新增host-only networks,再在guest端新增對應的介面卡,host和guest就在同一個網段了。
將它們對應的ip都新增到各自的/etc/hosts檔案中。
無密碼登陸
在ping通後,我們希望可以無密碼登陸,具體要做的事情是從機分別將公鑰發給主機,然後主機綜合所有的公鑰(包括它自己的),將authorized_keys複製到slave1和slave2的~/.ssh
目錄下。如果要從圖形介面觀看這個資料夾,由於它是隱藏的,可以按ctrl+H鍵顯示出來。
操作流程:
1) 安裝ssh : sudo apt-get install openssh-server
安裝完成後使用ssh命令登陸本機 ssh localhost
2)
exit # 退出剛才的 ssh localhost
cd ~/.ssh/ # 若沒有該目錄,請先執行一次ssh localhost
ssh-keygen -t rsa # 會有提示,都按回車就可以
3) 在從機slave1和slave2上重複這個步驟,隨後利用scp傳輸:
在slave1上:scp id_rsa.pub [email protected]:~/.ssh/id_rsa.pub.slave1
在slave2上:scp id_rsa.pub [email protected]:~/.ssh/id_rsa.pub.slave2
在master上:

cat id_rsa.pub >> authorized_keys
cat id_rsa.pub.slave1 >> authorized_keys
cat id_rsa.pub.slave2 >> authorized_keys

隨後將master的公鑰資訊authorized_keys複製到slave1和slave2對應目錄下,就可以實現無密碼登陸了。
修改master、slave1、slave2的配置檔案
詳細的修改策略可以參考:
http://www.powerxing.com/install-hadoop/
注意不能完全照搬,這裡我打算將master既作為主節點,又作為計算節點,所以修改slaves為:
master
slave1
slave2
同時三臺機器上的’dfs.replication’值設定為3,就是說資料會有3份備份。

測試Hadoop分散式叢集環境
首先確保每臺機器的JAVA_HOME都已經準確設定了,就可以按照教程測試了。
測試步驟請同樣參考 http://www.powerxing.com/install-hadoop/

2 Spark叢集的搭建

安裝scala,並設定SCALA_HOME,在3臺機器上都做同樣配置。
由於我一開始下載的版本是2.11.7所以我自己重新編譯了一下。
在官網下載:http://spark.apache.org/downloads.html
Scala 2.11 users should download the Spark source package and build with Scala 2.11 support.

./dev/change-scala-version.sh 2.11
./build/mvn -Pyarn -Phadoop-2.6 -Dscala-2.11 -DskipTests clean package

配置Spark的執行環境,將spark-env.sh.template模板檔案複製成spark-env.sh,然後填寫相應需要的配置內容
具體的說明可見相應template中註釋掉的內容
export SPARK_MASTER_IP=master
export SPARK_MASTER_PORT=7077
export SPARK_WORKER_CORES=1
export SPARK_WORDER_INSTANCES=1
export SPARK_WORKER_MEMORY=5g
或者參考:
https://taoistwar.gitbooks.io/spark-operationand-maintenance-management/content/spark_install/spark_standalone_configuration.html

修改該conf/slaves檔案,寫入各節點的主機名,master本身也作為工作節點:
master
slave1
slave2

啟動叢集,首先啟動hadoop叢集,簡單的方式就是在

~/hadoop/sbin/start-all.sh

在master上jps可以看到:
namenode
nodemanager
resourcemanager
secondarynamenode
datanode
隨後啟動spark叢集

~/spark/sbin/start-all.sh

此時會多出
worker
master

3. Intellij

附上一段work的原始碼

/**
  * Created by singleton on 4/8/16.
  */
import scala.math.random
import org.apache.spark._
object RemoteDebug {
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("Spark Pi").setMaster("spark://master:7077")
      .setJars(List("/home/singleton/GraduateWorkshop/SparkRemote/out/artifacts/SparkRemote_jar/SparkRemote.jar"))
    val spark = new SparkContext(conf)
    val slices = if (args.length > 0) args(0).toInt else 2
    val n = 100000 * slices
    val count = spark.parallelize(1 to n, slices).map { i =>
      val x = random * 2 - 1
      val y = random * 2 - 1
      if (x * x + y * y < 1) 1 else 0
    }.reduce(_ + _)
    println("Pi is roughly " + 4.0 * count / n)
    spark.stop()
  }
}

相關推薦

no