手把手Spark集羣安裝配置及例子-多種模式

安裝前的準備

安裝好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

注意看此時的命令行和之前的區別:

  1. 添加了"--deploy-mode cluster" ,把運行模式改成了cluster
  2. 還添加了輸出文檔地址。這是因爲在這一次的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快速大數據分析》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章