準(zhǔn)備工作:
- 準(zhǔn)備三臺機(jī)器,master01,master02(HA),slave01,slave02
- hadoop集群,zookeeper集群搭建完成
- spark-2.1.1-bin-hadoop2.7.tgz安裝包
一、配置Spark【Standalone】
1.解壓安裝包到指定位置
tar -xf spark-2.1.1-bin-hadoop2.7.tgz -C ~/Hadoop
2.配置conf目錄下的slaves和spark-env.sh
[bigdata@master01 hadoop]$ cd ~/hadoop/spark-2.1.1-bin-hadoop2.7/conf
# 將slaves.template復(fù)制為slaves
[bigdata@master01 conf]$ cp slaves.template slaves
# 將spark-env.sh.template復(fù)制為spark-env.sh
[bigdata@master01 conf]$ cp spark-env.sh.template spark-env.sh
修改slave文件
slave01
slave02
修改spark-env.sh文件,添加一下內(nèi)容:
SPARK_MASTER_HOST=master01
SPARK_MASTER_PORT=7077
3.配置sbin目錄下的spark-config.sh,加入如下配置:
export JAVA_HOME=XXXX
4.將配置好的Spark文件拷貝到其他節(jié)點(diǎn)上
[bigdata@master01 conf]$ scp slaves bigdata@slave01:~/hadoop/spark-2.1.1-bin-hadoop2.7/conf
[bigdata@master01 conf]$ scp slaves bigdata@slave02:~/hadoop/spark-2.1.1-bin-hadoop2.7/conf
[bigdata@master01 conf]$ scp spark-env.sh bigdata@slave01:~/hadoop/spark-2.1.1-bin-hadoop2.7/conf
[bigdata@master01 conf]$ scp spark-env.sh bigdata@slave02:~/hadoop/spark-2.1.1-bin-hadoop2.7/conf
# xsync腳本參考:http://www.itdecent.cn/p/124033fd3519
[bigdata@master01 sbin]$ xsync /home/bigdata/Hadoop/spark-2.1.1-bin-hadoop2.7/sbin/spark-config.sh
5.啟動(dòng)Spark集群
[bigdata@master01 spark-2.1.1-bin-hadoop2.7]$ sbin/start-all.sh
Spark管理界面查看集群狀態(tài)(主節(jié)點(diǎn)):http://master01:8080/
二、配置Job History Server【Standalone】
1.配置spark-default.conf
[bigdata@master01 ~]$ cd ~/hadoop/spark-2.1.1-bin-hadoop2.7/conf
[bigdata@master01 conf]$ cp spark-default.conf.template spark-default.conf
修改spark-default.conf文件,開啟Log,【注意:HDFS上的目錄需要提前存在】,加入如下內(nèi)容:
spark.eventLog.enabled true
spark.eventLog.dir hdfs://master01:9000/historyserverforSpark
spark.eventLog.compress true
2.修改spark-env.sh文件,添加如下配置:
export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=4000
-Dspark.history.retainedApplications=3
-Dspark.history.fs.logDirectory=hdfs://master01:9000/historyserverforSpark"
3.在hadoop配置文件hdfs-site.xml中添加如下配置,關(guān)閉hdfs寫入權(quán)限驗(yàn)證,否則報(bào)錯(cuò)org.apache.hadoop.security.AccessControlException
<!-- 解決spark存在Hadoop HDFS的寫入權(quán)限問題 -->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
4.將配置好的Spark文件拷貝到其他節(jié)點(diǎn)上
[bigdata@master01 conf]$ scp spark-default.conf bigdata@slave01:~/hadoop/spark-2.1.1-bin-hadoop2.7/conf
[bigdata@master01 conf]$ scp spark-default.conf bigdata@slave02:~/hadoop/spark-2.1.1-bin-hadoop2.7/conf
# xsync腳本參考:http://www.itdecent.cn/p/124033fd3519
[bigdata@master01 conf]$ xsync /home/bigdata/Hadoop/spark-2.1.1-bin-hadoop2.7/conf/spark-env.sh
5.啟動(dòng)過程
- 啟動(dòng)HDFS,并在hdfs上創(chuàng)建historyserverforSpark目錄
hadoop fs -mkdir -p /historyserverforSpark - 啟動(dòng)Spark
[bigdata@master01 spark-2.1.1-bin-hadoop2.7]$ sbin/start-all.sh
- 啟動(dòng)Job History Server
[bigdata@master01 spark-2.1.1-bin-hadoop2.7]$ sbin/start-history-server.sh
三、配置Spark HA【Standalone】
解決Master節(jié)點(diǎn)存在單點(diǎn)故障
1.啟動(dòng)至少兩個(gè)Master節(jié)點(diǎn)來實(shí)現(xiàn)高可靠,配置方式比較簡單:

2.Spark集群規(guī)劃:master01,master02是Master;slave01,slave02,slave03是Worker
3.安裝配置Zookeeper集群,并啟動(dòng)Zookeeper集群
4.停止spark所有服務(wù),修改配置文件spark-env.sh,在該配置文件中注釋掉SPARK_MASTER_HOST并添加如下配置:
export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=zk1,zk2,zk3
-Dspark.deploy.zookeeper.dir=/spark"
5.在 master01節(jié)點(diǎn)上修改spark-env.sh配置文件,將配置文件同步到所有節(jié)點(diǎn)
6.在master01上執(zhí)行sbin/start-all.sh腳本,啟動(dòng)集群并啟動(dòng)第一個(gè)master節(jié)點(diǎn),然后在master02上執(zhí)行sbin/start-master.sh啟動(dòng)第二個(gè)master節(jié)點(diǎn)
7.程序中spark集群的訪問地址需要改成:
spark://master01:port1,master02:port2
四、配置Spark【Yarn】
1.修改Hadoop配置下的yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master01</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--是否啟動(dòng)一個(gè)線程檢查每個(gè)任務(wù)正使用的物理內(nèi)存量,如果任務(wù)超出分配值,則直接將其殺掉,默認(rèn)是true -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<!--是否啟動(dòng)一個(gè)線程檢查每個(gè)任務(wù)正使用的虛擬內(nèi)存量,如果任務(wù)超出分配值,則直接將其殺掉,默認(rèn)是true -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
2.修改Spark-env.sh 添加:
HADOOP_CONF_DIR=/home/bigdata/hadoop/hadoop-2.7.3/etc/hadoop
YARN_CONF_DIR=/home/bigdata/hadoop/hadoop-2.7.3/etc/hadoop
3.啟動(dòng)spark history server
五、spark程序初試
1.執(zhí)行第一個(gè)spark程序(standalone)
# 該算法是利用蒙特·卡羅算法求PI
[bigdata@master01 spark-2.1.1-bin-hadoop2.7]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://master01:7077 \
--executor-memory 1G \
--total-executor-cores 2 \
/home/honey/hadoop/spark-2.1.1-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.1.1.jar \
100
參數(shù)說明:
--master spark://master01:7077 指定Master的地址
--executor-memory 1G 指定每個(gè)executor可用內(nèi)存為1G
--total-executor-cores 2 指定每個(gè)executor使用的cup核數(shù)為2個(gè)
2.執(zhí)行第一個(gè)spark程序(yarn)
[bigdata@master01 spark-2.1.1-bin-hadoop2.7]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
/home/honey/hadoop/spark-2.1.1-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.1.1.jar \
100
3.Spark應(yīng)用提交
bin/spark-submit腳本啟動(dòng)應(yīng)用. 這個(gè)腳本負(fù)責(zé)設(shè)置spark使用的classpath和依賴,支持不同類型的集群管理器和發(fā)布模式:
./bin/spark-submit \
--class <main-class>
--master <master-url> \
--deploy-mode <deploy-mode> \
--conf <key>=<value> \
... # other options
<application-jar> \
[application-arguments]
一些常用選項(xiàng):
--class: 你的應(yīng)用的啟動(dòng)類 (如 org.apache.spark.examples.SparkPi)
--master: 集群的master URL (如 spark://23.195.26.187:7077)
--deploy-mode: 是否發(fā)布你的驅(qū)動(dòng)到worker節(jié)點(diǎn)(cluster) 或者作為一個(gè)本地客戶端 (client) (default: client)*
--conf: 任意的Spark配置屬性, 格式key=value. 如果值包含空格,可以加引號“key=value”. 缺省的Spark配置
application-jar: 打包好的應(yīng)用jar,包含依賴. 這個(gè)URL在集群中全局可見。
application-arguments: 傳給main()方法的參數(shù)
4.啟動(dòng)Spark shell
bin/spark-shell \
--master spark://master01:7077 \
--executor-memory 2g \
--total-executor-cores 2
如果啟動(dòng)spark shell時(shí)沒有指定master地址,但是也可以正常啟動(dòng)spark shell和執(zhí)行spark shell中的程序,其實(shí)是啟動(dòng)了spark的local模式,該模式僅在本機(jī)啟動(dòng)一個(gè)進(jìn)程,沒有與集群建立聯(lián)系。
Spark Shell中已經(jīng)默認(rèn)將SparkContext類初始化為對象sc。用戶代碼如果需要用到,則直接應(yīng)用sc即可
5.在Spark shell中編寫WordCount程序
- 啟動(dòng)hdfs
- 將Spark目錄下的RELEASE文件上傳一個(gè)文件到hdfs://master01:9000/RELEASE
hadoop dfs -put ./RELEASE /
- 在Spark shell中用scala語言編寫spark程序
scala> sc.textFile("hdfs://master01:9000/RELEASE").flatMap(_.split(" "))
.map((_,1)).reduceByKey(_+_).saveAsTextFile("hdfs://master01:9000/out")
- 使用hdfs命令查看結(jié)果
hadoop dfs -cat hdfs://master01:9000/out/p*
sc是SparkContext對象,該對象時(shí)提交spark程序的入口
textFile(hdfs://master01:9000/RELEASE)是hdfs中讀取數(shù)據(jù)
flatMap(_.split(" "))先map在壓平
map((_,1))將單詞和1構(gòu)成元組
reduceByKey(_+_)按照key進(jìn)行reduce,并將value累加
saveAsTextFile("hdfs:// master01:9000/out")將結(jié)果寫入到hdfs中
