准備
1、hadoop已部署(若沒有可以參考:Centos7安裝Hadoop2.7),集群情況如下(IP地址與之前文章有變動):
hostname | IP地址 | 部署規划 |
node1 | 172.20.0.2 | NameNode、DataNode |
node2 | 172.20.0.3 | DataNode |
node3 | 172.20.0.4 | DataNode |
2、官網下載安裝包:spark-2.4.4-bin-hadoop2.7.tgz(推薦去清華大學或中科大的開源鏡像站)。
3、spark將部署在三台都已存在的路徑/mydata,配置環境變量:
export SPARK_HOME=/mydata/spark-2.4.4 export PATH=${SPARK_HOME}/bin:${SPARK_HOME}/sbin:$PATH
本地模式
在機器node1解壓spark-2.4.4-bin-hadoop2.7.tgz到/mydata,並重命名文件夾為/mydata/spark-2.4.4。
跟hadoop文章保持一致,下面執行一個spark版的wordcount任務(Python版本):
shell> vim 1.txt # 創建一個文件,寫入一些內容
hadoop hadoop
hbase hbase hbase
spark spark spark spark
shell> spark-submit $SPARK_HOME/examples/src/main/python/wordcount.py 1.txt # 向spark提交wordcount任務,統計1.txt中的單詞及其數量,結果如下
spark: 4
hbase: 3
hadoop: 2
spark是一個計算引擎,查看文件wordcount.py可以看到實現同樣的功能,其代碼量遠小於mapreduce,大大降低了大數據的開發難度。
Standalone模式
可以翻譯成獨立模式,由spark自帶的集群來完成除了存儲以外的工作;下面先在node1上進行配置:
spark的配置文件位於 $SPARK_HOME/conf:
從 spark-env.sh.template 拷貝一個 spark-env.sh
從 slaves.template 拷貝一個slaves
# 文件名 spark-env.sh SPARK_MASTER_HOST=node1 SPARK_LOCAL_DIRS=/mydata/data/spark/scratch SPARK_WORKER_DIR=/mydata/data/spark/work SPARK_PID_DIR=/mydata/data/pid SPARK_LOG_DIR=/mydata/logs/spark
# 文件名 slaves
node1
node2
node3
由於 $SPARK_HOME/sbin 下的start-all.sh和stop-all.sh與hadoop沖突,建議進行重命名:
shell> mv start-all.sh spark-start-all.sh shell> mv stop-all.sh spark-stop-all.sh
配置完成后將spark程序文件拷貝到其他兩台:
shell> scp -qr /mydata/spark-2.4.4/ root@node2:/mydata/ shell> scp -qr /mydata/spark-2.4.4/ root@node3:/mydata/
然后在node1啟動集群:
shell> spark-start-all.sh
node1上用jps命令驗證進程 | Master、Worker |
node2上用jps命令驗證進程 | Worker |
node3上用jps命令驗證進程 | Worker |
可以通過瀏覽器訪問 http://node1:8080/ :
下面把上一節的文件1.txt多復制一份為2.txt,然后都放到hdfs上,最后通過spark集群執行wordcount任務:
shell> cp 1.txt 2.txt
shell> hdfs dfs -mkdir /tmp/wc/
shell> hdfs dfs -put 1.txt 2.txt /tmp/wc/
shell> spark-submit --master spark://node1:7077 $SPARK_HOME/examples/src/main/python/wordcount.py hdfs://node1:9000/tmp/wc/*
shell> spark-submit --master spark://node1:7077 $SPARK_HOME/examples/src/main/python/pi.py 9 # 順帶測試一個計算圓周率的任務,最后的數字9表示分片(partitions)數量,輸出結果類似這樣:Pi is roughly 3.137564
在 http://node1:8080/ 上可以看到執行的任務:
Yarn模式
實際使用中,通常是讓spark運行於已存在的集群,比如利用hadoop自帶的yarn來進行資源調度。
spark on yarn不需要spark的集群,所以停掉它:
shell> spark-stop-all.sh
配置很簡單,只需要有這個環境變量即可:
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
不過,為了方便查看歷史記錄和日志,這里要配置 spark history server ,並且與hadoop的jobhistory聯系起來:
進入目錄 $SPARK_HOME/conf,從spark-defaults.conf.template拷貝一個spark-defaults.conf:
# 文件名 spark-defaults.conf spark.eventLog.enabled true spark.eventLog.dir hdfs://node1:9000/spark/history spark.history.fs.logDirectory hdfs://node1:9000/spark/history spark.yarn.historyServer.allowTracking true spark.yarn.historyServer.address node1:18080
進入目錄 $HADOOP_HOME/etc/hadoop,在 yarn-site.xml 中添加一下內容:
# 文件名 yarn-site.xml <property> <name>yarn.log.server.url</name> <value>http://node1:19888/jobhistory/logs/</value> </property>
在hdfs創建必要的路徑:
shell> hdfs dfs -mkdir -p /spark/history
將hadoop和spark的配置同步更新到其他所有節點(勿忘)。
下面在node1重啟yarn,並且啟動spark history server:
shell> stop-yarn.sh
shell> start-yarn.sh
shell> start-history-server.sh # 啟動后通過jps可以看到多出一個HistoryServer
執行下面的命令,通過yarn及cluster模式執行wordcount任務:
shell> spark-submit --master yarn --deploy-mode cluster $SPARK_HOME/examples/src/main/python/wordcount.py hdfs://node1:9000/tmp/wc/*
瀏覽器訪問 http://node1:18080/ 可以看到spark的history:
點擊 App ID 進入,然后定位到 Executors ,找到 Executor ID 為driver的,查看它的stdout或stderr:
即可看到日志和計算結果:
同樣,可以通過yarn命令訪問日志:
shell> yarn logs -applicationId [application id]
over