Spark on Yarn叢集高可用搭建
阿新 • • 發佈:2019-01-24
軟體環境:
linux系統: CentOS6.7
Hadoop版本: 2.6.5
zookeeper版本: 3.4.8
主機配置:
一共m1, m2, m3這五部機, 每部主機的使用者名稱都為centos
192.168.179.201: m1
192.168.179.202: m2
192.168.179.203: m3
m1: Zookeeper, Namenode, DataNode, ResourceManager, NodeManager, Master
m2: Zookeeper, Namenode, DataNode, ResourceManager, NodeManager, Worker
m3: Zookeeper, DataNode, NodeManager, Worker
一.編譯Spark原始碼
參考資料:
spark原始碼編譯教程
http://blog.csdn.net/yanran1991326/article/details/46506595
1.安裝Maven: (Linux下,若使用Spark自帶的編譯器可跳過此步)
Maven教程:
http://wiki.jikexueyuan.com/project/maven/
1.1. 下載Maven安裝包
1.2. 解壓Maven到指定位置
1.3. 編輯/etc/profile檔案
export M2_HOME=/home/centos/soft/maven
PATH=$PATH:$M2_HOME/bin
1.4. 重新整理一下/etc/profile檔案
source /etc/profile
1.5. 檢驗是否安裝成功,輸入以下指令
mvn -v
1.6. 設定maven記憶體大小
(1)Linux下:
配置環境變數,編輯/etc/profile
檔案
export MAVEN_OPTS=-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m
(2)Windows下:
配置環境變數:
新建變數:MAVEN_OPTS
MAVEN_OPTS
的值設定成: -Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m
2.編譯spark原始碼:
spark原始碼下載官方地址:
http://spark.apache.org/downloads.html
spark原始碼編譯官方指南:
http://spark.apache.org/docs/1.5.0/building-spark.html
spark原始碼編譯教程:
http://blog.csdn.net/yanran1991326/article/details/46506595
2.1.下載spark原始碼
2.2.使用spark原始碼編譯: (推薦使用第一種方案, 因為第二種方案親測編譯成功後各種缺包)
2.2.1.方案一:使用maven編譯: Linux下 (推薦使用這種方法)
(1)編譯指令:
如果想生成一個用scala2.1.2
編譯的spark 部署包,則要先執行change-scala-version.sh
檔案: ./dev/change-scala-version.sh 2.10
(若要指定scala的編譯版本時, 必須先執行該指令)
mvn -Phadoop-2.6 -Pyarn -Dhadoop.version=2.6.5 -Dyarn.version=2.6.5 -Dscala-2.10 -DskipTests clean package
指令引數使用介紹:
–Phadoop-$系列: 打包時所用的Hadoop系列號,不加此引數時hadoop為pom.xml的預設系列。
-Dhadoop.version=$版本號: 打包時所用的Hadoop版本號,不加此引數時不可從HDFS上讀取資料。
–Pyarn: 是否支援Hadoop YARN,不加引數時為不支援yarn。
-Dyarn.version=$版本號: 是否支援Hadoop YARN,不加引數時為不支援yarn排程。
–Phive: 是否在Spark SQL中支援hive,不加此引數時為不支援hive。(若要使用Hive on Spark功能時, 不能新增次引數)
-Dscala-$版本號: 打包時所用的Scala系列號,不加此引數時Scala版本為pom.xml的預設版本, 在使用此函式之前必須先執行./dev/change-scala-version.sh 2.10指令,否則無效
-DskipTests: 是否在編譯的過程中略過測試,加此引數時為略過。
(2)編譯成功:
編譯成功後的Spark引用包的存放位置:
$Spark原始碼目錄/assembly/target/scala-2.10/spark-assembly-1.6.3-hadoop2.6.5.jar
該包的只是一個引用包, 應把tgz
解壓安裝的$SPARK_HOME/lib
目錄下的assembly
刪除, 然後將該包放入到$SPARK_HOME/lib
目錄下
2.2.2.方案二:使用spark原始碼包中自帶的make-distribution
編譯工具
(1)編譯指令:
先編譯Spark原始碼(若需要用到parquet功能,則帶上parquet-provided引數)
Spark2.0版本之前(hadoop版本可隨實際情況修改)
./make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.4,parquet-provided"
Spark2.0版本之後(hadoop版本可隨實際情況修改)
./dev/make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.7,parquet-provided"
(2)編譯成功
編譯成功後的Spark安裝包的存放位置:
$Spark原始碼目錄/spark-1.6.0-bin-hadoop2-without-hive-src.tgz
該包是一個安裝包, 用tar解壓出安裝即可, 不推薦使用
二.搭建Spark叢集
0.安裝準備
1.下載Scala
http://www.scala-lang.org/download/
2.下載Spark
http://spark.apache.org/downloads.html
1.叢集規劃(在m1上操作,然後在分發到其他主機)
Master m1
Slaves m1, m2, m3
2.解壓Scala,Spark安裝包
tar -zxvf scala-2.10.6/ -C /home/centos/soft/scala
tar -zxvf spark-1.6.0-bin-hadoop2.6/ -C /home/centos/soft/spark
3.配置環境變數
vi /etc/profile
## Spark
export SCALA_HOME=/home/centos/soft/scala
export SPARK_HOME=/home/centos/soft/spark
export CLASSPATH=$CLASSPATH:$SPARK_HOME/lib
export PATH=$PATH:$SCALA_HOME/bin:$SPARK_HOME/sbin:$SPARK_HOME/bin
source /etc/profile
4.拷貝hdfs-site.xml, yarn-site.xml, hive-site.xml檔案拷貝到spark的配置目錄下
cp /home/centos/soft/hadoop/etc/hadoop/hdfs-site.xml /home/centos/soft/spark/conf
cp /home/centos/soft/hadoop/etc/hadoop/yarn-site.xml /home/centos/soft/spark/conf
cp /home/centos/soft/hive/conf/hive-site.xml /home/centos/soft/spark/conf
5.編輯$/SPARK_HOME/conf/spark-env.sh檔案
Spark官方配置參考:
https://spark.apache.org/docs/1.2.0/configuration.html
Hive On Spark配置參考:
https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties#ConfigurationProperties-Spark
vi $SPARK_HOME/conf/spark-env.sh
export JAVA_HOME=/home/centos/soft/jdk1.7.0_67
export HADOOP_HOME=/home/centos/soft/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
export SCALA_HOME=/home/centos/soft/scala
export SPARK_HOME=/home/centos/soft/spark
export SPARK_LOCAL_DIRS=$SPARK_HOME/tmp ## spark相關的臨時檔案
export SPARK_DIST_CLASSPATH=$(/home/centos/soft/hadoop/bin/hadoop classpath)
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$HADOOP_HOME/lib:$SCALA_HOME/lib:$SPARK_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$SCALA_HOME/bin:$SPARK_HOME/bin:$SPARK_HOME/sbin
export SPARK_MASTER_IP=m1
export SPARK_MASTER_PORT=7077
export SPARK_MASTER_WEBUI_PORT=8080
export SPARK_WORKER_CORES=3 ## 允許Spark應用程式在每臺機器上使用的核心總數
export SPARK_WORKER_MEMORY=512m ## 允許Spark應用程式在每臺機器上使用的總記憶體量,例如1000m,2g(預設值:總記憶體為1 GB);請注意,每個應用程式的單獨記憶體都使用其spark.executor.memory屬性配置
export SPARK_WORKER_INSTANCES=1 ## 在每臺計算機上執行的工作程式例項數(預設值:1)。如果你有非常大的機器,並且想要多個Spark工作程序,你可以使它超過1。如果你這樣設定,確保顯式地設定SPARK_WORKER_CORES以限制每個工人的核心,否則每個工人將嘗試使用所有核心。
export SPARK_DAEMON_MEMORY=512m ## 要分配給Spark主伺服器和工作程式守護程式本身的記憶體(預設值:512m)。
export SPARK_EXECUTOR_CORES=1 ## 每個Executor使用的CPU核數,每個Exector使用的總核心spark.max.cores在spark-default.conf中設定
export SPARK_EXECUTOR_MEMORY=512m ## 每個Executor使用多大的記憶體
export SPARK_DRIVER_MEMORY=512m
export SPARK_YARN_AM_CORES=1
export SPARK_YARN_AM_MEMORY=512m
export SPARK_YARN_AM_WAITTIME=200ms
export SPARK_YARN_APP_NAME=Spark_On_Yarn
export SPARK_YARN_EXECUTOR_MEMORYOVERHEAD=75
export SPARK_TESTING_MEMORY=536870912
export SPARK_WORKER_DIR=$SPARK_HOME/logs/workerDir
export SPARK_LOG_DIR=$SPARK_HOME/logs/logDir
export SPARK_PID_DIR=$SPARK_HOME/logs/pidDir
export HIVE_SERVER2_THRIFT_PORT=10000
export HIVE_SERVER2_THRIFT_BIND_HOST=0.0.0.0
6.編輯$SPARK_HOME/conf/spark-default.conf檔案
vi $SPARK_HOME/conf/spark-default.conf
spark.master spark://master:7077
spark.shuffle.service.port 7337
spark.eventLog.enabled true
spark.eventLog.compress true
spark.eventlog.dir /home/centos/soft/spark/logs/spark.log
spark.serializer org.apache.spark.serializer.KryoSerializer
spark.driver.memory 5g
spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"
spark.sql.parquet.binaryAsString true
spark.sql.parquet.mergeSchema true
spark.sql.parquet.cacheMetadata false
spark.sql.hive.convertMetastoreParquet false
spark.dynamicAllocation.enabled true # 開啟動態資源分配
spark.dynamicAllocation.minExecutors 1 # 每個Application最小分配的executor數
spark.dynamicAllocation.maxExecutors 30 # 每個Application最大併發分配的executor數
spark.dynamicAllocation.schedulerBacklogTimeout 1s
spark.dynamicAllocation.sustainedSchedulerBacklogTimeout 5s
spark.scheduler.mode FAIR # 排程模式
spark.executor.instances 1 # standalone模式下限制每個Executor最大核心數
spark.cores.max 3 # Yarn模式下限制每個Executor最大核心數
7.實現Spark動態分配資源功能
- 將
$SPARK_HOME/conf/spark-default.conf
配置檔案中將spark.dynamicAllocation.enabled
配置項改為true
- 將
$SPARK_HOME/lib/spark-1.6.0-yarn-shuffle.jar
拷貝到每臺NodeManager
節點的${HADOOP_HOME}/share/hadoop/yarn/lib/
下
8.編輯$SPARK_HOME/conf/slaves檔案
m1
m2
m3
9.將安裝檔案分發到其他主機上
scp -r /home/centos/soft/scala m1:/home/centos/soft/
scp -r /home/centos/soft/scala m2:/home/centos/soft/
scp -r /home/centos/soft/scala m3:/home/centos/soft/
10.啟動spark叢集(注意: 啟動spark叢集之前,需先啟動YARN)
(1)在m1, m2上分別啟動YARN叢集
start-yarn.sh
(2)在WebUI上檢視啟動情況
m1:8088
(3)在m1主機上啟動主從節點:
start-master.sh ## 啟動主節點:
start-slaves.sh ## 啟動從節點:
(4)在WebUI上檢視啟動情況
m1:8080
11.測試例項
./bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --driver-memory 1g --executor-memory 1g --executor-cores 1 --queue thequeue lib/spark-assembly-1.6.0-hadoop2.6.0.jar 10