安裝前的準備
安裝好Fully-distributed Hadoop的集羣,安裝Hadoop教程參考:
https://blog.csdn.net/lucylove3943/article/details/80589422
我目前在6臺機子上搭了Hadoop-2.9.2,這是當前的配置:
Master Node: falcon-1
Slave Nodes: falcon-2, falcon-3, falcon-4, cat-2, cat-4
一些必要的安裝工作
主要是兩個東西:Scala 和 sbt。
Spark主要支持三種編程語言:scala, java, python. 其中scala是最主要的語言,sbt是用來打包scala程序的軟件,類似於maven之於Java。
安裝scala
我是在https://www.scala-lang.org/download/找到的scala下載地址。
我安裝的版本是scala-2.10.4,找到tgz包的下載鏈接後,在命令行輸入下述語句:
wget https://scala-lang.org/files/archive/scala-2.10.4.tgz
解壓這個包:
tar -xzvf scala-2.10.4.tgz
修改bashrc文檔:
vim ~/.bashrc
在文檔中添加如下內容:
export SCALA_HOME=/home/qianwen/scala-2.10.4
export PATH=$PATH:$SCALA_HOME/bin
就是把SPARK_HOME賦值爲當前scala的解壓路徑,然後添加path內容。如圖所示:
接着source該文件:
source ~/.bashrc
此時在命令行輸入以下命令,確認scala已經正確安裝:
scala -version
此時命令行中如果出現如下內容,則說明安裝成功:
安裝sbt
我參考了一篇博客,使用的是apt-get安裝的sbt。主要輸入以下四行命令:
echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823
sudo apt-get update
sudo apt-get install sbt
正式安裝Spark
下載spark
進入spark官網下載頁面:http://spark.apache.org/downloads.html
點擊如圖所示紅圈,進入spark-2.4.3的下載頁面:
複製上圖圈中鏈接,在命令行中輸入
wget http://apache.mirrors.pair.com/spark/spark-2.4.3/spark-2.4.3-bin-hadoop2.7.tgz
解壓該tgz包:
tar -xzvf spark-2.4.3-bin-hadoop2.7.tgz
進入spark配置文件夾,配置spark-env.sh文件:
cd spark-2.4.3-bin-hadoop2.7/conf/
cp spark-env.sh.template spark-env.sh
vim spark-env.sh
在裏面添加如下內容:
export SPARK_HOME=/home/qianwen/spark-2.4.3-bin-hadoop2.7
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export HADOOP_HOME=/home/qianwen/hadoop-2.9.2
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_HOME=$HADOOP_HOME
export SCALA_HOME=/home/qianwen/scala-2.10.4
SPARK_MASTER_IP=falcon-1
SPARK_LOCAL_DIRS=/home/qianwen/spark-2.4.3-bin-hadoop2.7
SPARK_CONF_DIR=/home/qianwen/spark-2.4.3-bin-hadoop2.7/conf
SPARK_DRIVE_MEMORY=2G
for file in $SPARK_HOME/jars/*.jar
do
export CLASSPATH=$CLASSPATH:$file
done
然後source該文件:
source spark-env.sh
然後修改slaves文件:
cp slaves.template slaves
vim slaves
然後把Hadoop裏配置的幾個slave nodes都加進去;
falcon-2
falcon-3
falcon-4
cat-2
cat-4
輸下述命令把配置好的spark發送到其他節點:
scp -r spark-2.4.3-bin-hadoop2.7 falcon-2:~
scp -r spark-2.4.3-bin-hadoop2.7 falcon-3:~
scp -r spark-2.4.3-bin-hadoop2.7 falcon-4:~
scp -r spark-2.4.3-bin-hadoop2.7 cat-2:~
scp -r spark-2.4.3-bin-hadoop2.7 cat-4:~
spark就這樣安裝好啦!
Spark例子
從易到難,我一共跑了以下幾個例子:
1. spark-shell
2.spark自帶例子,計算pi
3.wordcount client模式
4.wordcount spark yarn cluster模式
在跑例子前,先啓動spark。
然後回到spark主目錄,啓動spark:
sbin/start-all.sh
啓動成功後,在master node,也就是falcon-1上輸入
jps
在master node上,看到的進程中master就是spark的進程。
在slave節點上,輸入jps查看當前運行進程,其中worker是spark的進程。
(一)例子spark-shell
在命令行輸入下述命令,進入spark的shell命令行界面,執行基本spark操作:
bin/spark-shell
此時應出現如下界面:
注意到這裏出現了Spark context web UI available at http://falcon-1:4040。 可訪問這個鏈接查看spark任務和集羣的信息。
依次輸入以下命令:
val lines = sc.textFile("README.md");
讀取README.md中內容,存入RDD。
接着用下述命令計算README.md中一共有多少個單詞:
lines.count()
最後用下述命令,查看README.md中第一行的內容:
lines.first()
最後可通過Ctrl+D推出spark-shell
(二)spark自帶計算Pi的例子
在spark主目錄下輸入以下命令:
bin/run-example SparkPi 10 > Sparkpilog.txt
spark會開始執行任務,然後把結果輸出到Sparkpilog.txt, 可通過如下命令查看計算結果:
cat Sparkpilog.txt
(三)打包運行wordcount (yarn-client模式)
首先進入hadoop主目錄,啓動hadoop:
sbin/start-dfs.sh
sbin/start-yarn.sh
由於現在是用的yarn來做cluster管理,所以進入spark目錄,關閉spark的worker和master進程。
sbin/stop-all.sh
接着建一個文件夾spark_test,用來編輯wordcount代碼和打包:
mkdir spark_test
cd spark_text
新建WordCount.scala文件:
vim WordCount.scala
然後在裏面添加如下內容:
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
object WordCount {
def main(args: Array[String]) {
if (args.length < 1) {
System.err.println("Usage: <file>")
System.exit(1)
}
val conf = new SparkConf()
val sc = new SparkContext(conf)
val line = sc.textFile(args(0))
line.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_+_).collect().foreach(println)
sc.stop()
}
}
這個代碼是從命令行讀取輸入文件,然後最終結果是打印到控制檯。
下一步就是build代碼,build之前需要編輯build文檔,類似於maven裏的pom.xml:
vim build.sbt
添加以下內容:
name := "sparkScala"
version := "1.0"
scalaVersion := "2.10.4"
javacOptions ++= Seq("-source", "1.8", "-target", "1.8")
libraryDependencies += "org.apache.spark" % "spark-core_2.11" % "2.4.3" % "provided"
mainClass in Compile := Some("WordCount")
這裏的version我寫的是1.0,之後修改WordCount之後,可以相應的改成2.0,3.0之類的。
JavaOption,要填寫當前電腦安裝的Java版本。
ScalaVersion填寫scala的Version
對於libraryDependencies。spark-core後面的數字是這樣決定的:
首先進入spark主目錄中的jars目錄下:
cd jars
然後輸入如下內容:
ls * | grep "core"
然後再輸出中找到scala-score,後面的2.11和2.4.3都是根據這個來填的:
接着輸入如下命令build:
sbt package
成功後,輸入ls應該能看到當前目錄下多了project和target兩個文件夾
進入target/scala-2.10文件夾
cd target/scala-2.10/
可看到如下:
將這裏的sparkscala_2.10-1.0.jar複製到spark的主目錄下:
cp sparkscala_2.10-1.0.jar ~/spark-2.4.3-bin-hadoop2.7
下一步,把數據存在HDFS上。
回到hadoop主目錄,然後輸入如下命令在hdfs創建文件夾input:
cd ~/hadoop-2.9.2
bin/hdfs dfs -mkdir /input
然後我把本地存的一個文本文檔“beauty_and_beast.txt”放進了文件夾,然後回到spark目錄:
bin/hdfs dfs -put beauty_and_beast.txt /input
cd ~/spark-2.4.3-bin-hadoop2.7/
此時輸入如下命令,就能在spark上運行剛剛編寫的WordCount程序了:
bin/spark-submit --class WordCount --master spark://falcon-1:7077 sparkscala_2.10-1.0.jar hdfs://falcon-1:9000/input
此時運行的log會在控制檯輸出,並且程序結果也會打印在控制檯。
(四)wordcount cluster運行模式
例子上是默認的client模式,這個例子是cluster模式。運行命令行模式就是在最後submit的命令中加上“--deploy-mode cluster”。
兩個模式都運行在cluster上,數據也都是從hdfs讀取的。
區別在於,每個job的driver在哪裏,如果是client模式的話,driver就在提交job的node上。
如果是cluster模式的話,driver可能在任意一臺cluster中的node上。
相應的,driver中的log輸出一點也會不同。用client模式提交,log直接打印到控制檯,方便debug。
而對於cluster模式,log是放在了spark主目錄中work文件夾中。
——————————————————————————————————————————————————
廢話不多說,直接上例子。
打開spark_test中的WordCount.scala修改代碼:
cd ~/spark-2.4.3-bin-hadoop2.7/spark_test
vim WordCount.scala
改成如下內容:
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext._
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.FileSystem
object WordCount{
def main(args : Array[String]) {
val hadoopconf = new Configuration();
hadoopconf.setBoolean("fs.hdfs.impl.disable.cache", true);
val fileSystem = FileSystem.get(hadoopconf);
//spark configuration
val conf = new SparkConf().setAppName("WordCount");
val sc = new SparkContext(conf);
val wordcount=sc.textFile(args(0)).flatMap(_.split(" ")).map(word=>(word,1)).reduceByKey(_+_).saveAsTextFile(args(1));
println("Word Count program running results are successfully saved.");
}
}
下一步修改build.sbt文件:
vim build.sbt
把其中的version從1.0改成2.0:
name := "sparkScala"
version := "2.0"
scalaVersion := "2.10.4"
javacOptions ++= Seq("-source", "1.8", "-target", "1.8")
libraryDependencies += "org.apache.spark" % "spark-core_2.11" % "2.4.3" % "provided"
mainClass in Compile := Some("WordCount")
然後打包代碼:
sbt package
將最後的jar包複製到spark主目錄下,注意此時複製的是2.0版本的jar包:
cp target/scala-2.10/sparkscala_2.10-2.0.jar ~/spark-2.4.3-bin-hadoop2.7
值得注意的是,在這裏需要把jar包複製到所有的node中,不然在運行時會出現找不到jar包的錯誤:
cd ~/spark-2.4.3-bin-hadoop2.7
scp -r sparkscala_2.10-2.0.jar falcon-2:/home/qianwen/spark-2.4.3-bin-hadoop2.7/sparkscala_2.10-2.0.jar
scp -r sparkscala_2.10-2.0.jar falcon-3:/home/qianwen/spark-2.4.3-bin-hadoop2.7/sparkscala_2.10-2.0.jar
scp -r sparkscala_2.10-2.0.jar falcon-4:/home/qianwen/spark-2.4.3-bin-hadoop2.7/sparkscala_2.10-2.0.jar
scp -r sparkscala_2.10-2.0.jar cat-2:/home/qianwen/spark-2.4.3-bin-hadoop2.7/sparkscala_2.10-2.0.jar
scp -r sparkscala_2.10-2.0.jar cat-4:/home/qianwen/spark-2.4.3-bin-hadoop2.7/sparkscala_2.10-2.0.jar
接着就可以提交任務了:
bin/spark-submit --class WordCount --master yarn-cluster sparkscala_2.10-2.0.jar hdfs://falcon-1:9000/input hdfs://falcon-1:9000/output
注意看此時的命令行和之前的區別:
- 添加了"--deploy-mode cluster" ,把運行模式改成了cluster
- 還添加了輸出文檔地址。這是因爲在這一次的wordcount代碼中,我把最終結果saveAsTextFile了,並且地址設爲“args(1)”。
這一次的運行輸出非常簡潔:
值得注意的是,不管運行是成功還是失敗,運行輸出都會只有這麼少。具體的結果要去運行driver的node看log才能知道。所以cluster模式不適合用來做debug!!!
在我的cluster裏,運行該例子的node是falcon-3,在falcon-3的work文件夾中,有driver信息。
進入該文件夾,輸出stdout和stderr,就能看到程序是否運行成功:
可以看到我的例子已經運行成功了。所以現在在master node上的hdfs中,應該可以看到輸出結果:
cd ~/hadoop-2.9.2/
bin/hdfs dfs -ls /output
輸入如下命令查看結果:
bin/hdfs dfs -cat /output/part-00000
參考資料
https://www.jianshu.com/p/65a3476757a5 (這篇對於spark運行模式解釋非常詳細)
https://www.cnblogs.com/kwongtai/p/7226412.html
https://www.jianshu.com/p/5a46a3193ca0
http://wuchong.me/blog/2015/04/04/spark-on-yarn-cluster-deploy/
https://www.ibm.com/developerworks/cn/opensource/os-cn-spark-deploy1/index.html
http://www.voidcn.com/article/p-hbcbpcep-bpv.html
《spark快速大數據分析》