【spark】spark-2.4.4的安裝與測試

4.2.1 下載並安裝sparkjava

 

 


下載文件名:spark-2.4.4-bin-without-hadoop.tgzpython

[hadoop@hadoop01 ~]$ tar -zxvf spark-2.4.4-bin-without-hadoop.tgz


4.2.2 配置linux環境變量linux

[hadoop@hadoop01 ~]$ gedit ~/.bash_profile
[hadoop@hadoop01 ~]$ source ~/.bash_profile
新加入:
#spark
export SPARK_HOME=/home/hadoop/spark-2.4.4-bin-without-hadoop
export PATH=$PATH:$SPARK_HOME/bin


4.2.3 配置spark-env.sh變量環境web

[hadoop@hadoop01 conf]$ cp spark-env.sh.template spark-env.sh
[hadoop@hadoop01 conf]$ gedit spark-env.sh
加入:
export JAVA_HOME=/usr/java/jdk1.8.0_131
export SCALA_HOME=/home/hadoop/scala-2.13.1
export SPARK_MASTER_IP=192.168.1.100
export HADOOP_HOME=/home/hadoop/hadoop-3.2.0
export HADOOP_CONF_DIR=/home/hadoop/hadoop-3.2.0/etc/hadoop
export SPARK_DIST_CLASSPATH=$(/home/hadoop/hadoop-3.2.0/bin/hadoop classpath) #不添加,就會報錯

注:由於咱們下載是不帶hadoop依賴jar的spark版本,因此須要在spark配置中指定hadoop的classpathdocker

配置文件spark-env.sh:
### in conf/spark-env.sh ###

# If 'hadoop' binary is on your PATH
export SPARK_DIST_CLASSPATH=$(hadoop classpath)

# With explicit path to 'hadoop' binary export SPARK_DIST_CLASSPATH=$(/path/to/hadoop/bin/hadoop classpath)

# Passing a Hadoop configuration directory
export SPARK_DIST_CLASSPATH=$(hadoop --config /path/to/configs classpath)

 

4.2.4 修改slaves文件shell

[hadoop@hadoop01 conf]$ cp slaves.template slaves
[hadoop@hadoop01 conf]$ gedit slaves
加入:
hadoop02
hadoop03


4.2.5 拷貝到其餘節點
scp -r ~/spark-2.4.4-bin-without-hadoop hadoop02:~/
scp -r ~/spark-2.4.4-bin-without-hadoop hadoop03:~/

4.2.6 啓動spark

4.2.6.1 直接啓動express

[hadoop@hadoop01 spark-2.4.4-bin-without-hadoop]$ sbin/start-all.sh
第一次啓動報錯:
進程顯示:failed to launch: nice -n 0 /home/hadoop/spark-2.4.4-bin-without-hadoop/bin/spark-class org.apache.spark.deploy.master.Master --host hadoop01 --port 7077 --webui-port 808
查看spark目錄下logs:
Spark Command: /usr/java/jdk1.8.0_131/bin/java -cp /home/hadoop/spark-2.4.4-bin-without-hadoop/conf/:/home/hadoop/spark-2.4.4-bin-without-hadoop/jars/*:/home/hadoop/hadoop-3.2.0/etc/hadoop/ -Xmx1g org.apache.spark.deploy.master.Master --host hadoop01 --port 7077 --webui-port 8080
========================================
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/Logger
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
    at java.lang.Class.getMethod0(Class.java:3018)
    at java.lang.Class.getMethod(Class.java:1784)
    at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: org.slf4j.Logger
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 7 more

解決辦法:在spark-env.sh末尾添加「export SPARK_DIST_CLASSPATH=$(/home/hadoop/hadoop-3.2.0/bin/hadoop classpath)」

再次啓動spark:apache

[hadoop@hadoop01 spark-2.4.4-bin-without-hadoop]$ sbin/start-all.sh
starting org.apache.spark.deploy.master.Master, logging to /home/hadoop/spark-2.4.4-bin-without-hadoop/logs/spark-hadoop-org.apache.spark.deploy.master.Master-1-hadoop01.out
hadoop03: starting org.apache.spark.deploy.worker.Worker, logging to /home/hadoop/spark-2.4.4-bin-without-hadoop/logs/spark-hadoop-org.apache.spark.deploy.worker.Worker-1-hadoop03.out
hadoop02: starting org.apache.spark.deploy.worker.Worker, logging to /home/hadoop/spark-2.4.4-bin-without-hadoop/logs/spark-hadoop-org.apache.spark.deploy.worker.Worker-1-hadoop02.out
[hadoop@hadoop01 spark-2.4.4-bin-without-hadoop]$ jps
29200 NodeManager
28595 DataNode
29059 ResourceManager
28804 SecondaryNameNode
30564 Master
28424 NameNode
30777 Jps
[hadoop@hadoop01 spark-2.4.4-bin-without-hadoop]$ ssh hadoop02
Last login: Wed Oct  2 11:21:48 2019 from hadoop01
[hadoop@hadoop02 ~]$ jps
19905 Worker
20098 Jps
18922 DataNode
19054 NodeManager
[hadoop@hadoop02 ~]$ ssh hadoop03
Last login: Tue Oct  1 15:58:07 2019 from hadoop02
[hadoop@hadoop03 ~]$ jps
18896 Jps
17699 DataNode
17829 NodeManager
18694 Worker


注1:經過jps看見三個節點有Master和Worker的進程,其中Master是spark的主控進程
注2:另外須要注意的是spark的啓動命令與hadoop的同樣,因此啓動hadoop和spark的時候須要明確指定目錄,如:hadoop-3.2.0/sbin/start-all.sh 或者spark2.4.4/sbin/start-all.sh

4.2.6.2 經過spark提供的web接口查看系統狀態,各節點均可以:
http://http://192.168.1.100:8080/
http://http://192.168.1.101:8081/
http://http://192.168.1.102:8081/


4.2.7 中止sparkbash

[hadoop@hadoop01 spark-2.4.4-bin-without-hadoop]$ sbin/stop-all.sh
hadoop02: stopping org.apache.spark.deploy.worker.Worker
hadoop03: stopping org.apache.spark.deploy.worker.Worker
stopping org.apache.spark.deploy.master.Master
[hadoop@hadoop01 spark-2.4.4-bin-without-hadoop]$ jps
29200 NodeManager
28595 DataNode
29059 ResourceManager
28804 SecondaryNameNode
28424 NameNode
31112 Jps


4.2.8 spark的簡單使用

4.2.8.1 執行示例程序
在 ./examples/src/main 目錄下有一些 Spark 的示例程序,有 Scala、Java、Python、R 等語言的版本。咱們能夠先運行一個示例程序 SparkPi(即計算 π 的近似值),執行以下命令:
注:執行時會輸出很是多的運行信息,輸出結果不容易找到,能夠經過 grep 命令進行過濾(命令中的 2>&1 能夠將全部的信息都輸出到 stdout 中,不然因爲輸出日誌的性質,仍是會輸出到屏幕中):session

[hadoop@hadoop01 spark-2.4.4-bin-without-hadoop]$ ./bin/run-example SparkPi 2>&1 | grep "Pi is roughly"
Pi is roughly 3.135075675378377

Python 版本的 SparkPi, 則須要經過 spark-submit 運行:

[hadoop@hadoop01 spark-2.4.4-bin-without-hadoop]$ ./bin/spark-submit examples/src/main/python/pi.py 2>&1 | grep "Pi is roughly"
Pi is roughly 3.144580


4.2.8.2 進入shell模式:

[hadoop@hadoop01 jars]$ spark-shell
2019-10-02 21:05:49,292 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Spark context Web UI available at http://hadoop01:4040
Spark context available as 'sc' (master = local[*], app id = local-1570021558420).
Spark session available as 'spark'.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.4.4
      /_/
         
Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_131)
Type in expressions to have them evaluated.
Type :help for more information.

scala> 


附:

【轉】Spark集羣三種部署模式的區別

Spark最主要資源管理方式按排名爲Hadoop Yarn, Apache Standalone 和Mesos。在單機使用時,Spark還能夠採用最基本的local模式。目前Apache Spark支持三種分佈式部署方式,分別是standalone、spark on mesos和 spark on YARN,其中,第一種相似於MapReduce 1.0所採用的模式,內部實現了容錯性和資源管理,後兩種則是將來發展的趨勢,部分容錯性和資源管理交由統一的資源管理系統完成:讓Spark運行在一個通用的資源管理系統之上,這樣能夠與其餘計算框架,好比MapReduce,公用一個集羣資源,最大的好處是下降運維成本和提升資源利用率(資源按需分配)。本文將介紹這三種部署方式,並比較其優缺點。 1. Standalone模式即獨立模式,自帶完整的服務,可單獨部署到一個集羣中,無需依賴任何其餘資源管理系統。從必定程度上說,該模式是其餘兩種的基礎。借鑑Spark開發模式,咱們能夠獲得一種開發新型計算框架的通常思路:先設計出它的standalone模式,爲了快速開發,起初不須要考慮服務(好比master/slave)的容錯性,以後再開發相應的wrapper,將stanlone模式下的服務原封不動的部署到資源管理系統yarn或者mesos上,由資源管理系統負責服務自己的容錯。目前Spark在standalone模式下是沒有任何單點故障問題的,這是藉助zookeeper實現的,思想相似於Hbase master單點故障解決方案。將Spark standalone與MapReduce比較,會發現它們兩個在架構上是徹底一致的: 1)  都是由master/slaves服務組成的,且起初master均存在單點故障,後來均經過zookeeper解決(Apache MRv1的JobTracker仍存在單點問題,但CDH版本獲得瞭解決); 2) 各個節點上的資源被抽象成粗粒度的slot,有多少slot就能同時運行多少task。不一樣的是,MapReduce將slot分爲map slot和reduce slot,它們分別只能供Map Task和Reduce Task使用,而不能共享,這是MapReduce資源利率低效的緣由之一,而Spark則更優化一些,它不區分slot類型,只有一種slot,能夠供各類類型的Task使用,這種方式能夠提升資源利用率,可是不夠靈活,不能爲不一樣類型的Task定製slot資源。總之,這兩種方式各有優缺點。  2. Spark On Mesos模式這是不少公司採用的模式,官方推薦這種模式(固然,緣由之一是血緣關係)。正是因爲Spark開發之初就考慮到支持Mesos,所以,目前而言,Spark運行在Mesos上會比運行在YARN上更加靈活,更加天然。目前在Spark On Mesos環境中,用戶可選擇兩種調度模式之一運行本身的應用程序(可參考Andrew Xia的「Mesos Scheduling Mode on Spark」): 1)   粗粒度模式(Coarse-grained Mode):每一個應用程序的運行環境由一個Dirver和若干個Executor組成,其中,每一個Executor佔用若干資源,內部可運行多個Task(對應多少個「slot」)。應用程序的各個任務正式運行以前,須要將運行環境中的資源所有申請好,且運行過程當中要一直佔用這些資源,即便不用,最後程序運行結束後,回收這些資源。舉個例子,好比你提交應用程序時,指定使用5個executor運行你的應用程序,每一個executor佔用5GB內存和5個CPU,每一個executor內部設置了5個slot,則Mesos須要先爲executor分配資源並啓動它們,以後開始調度任務。另外,在程序運行過程當中,mesos的master和slave並不知道executor內部各個task的運行狀況,executor直接將任務狀態經過內部的通訊機制彙報給Driver,從必定程度上能夠認爲,每一個應用程序利用mesos搭建了一個虛擬集羣本身使用。 2)   細粒度模式(Fine-grained Mode):鑑於粗粒度模式會形成大量資源浪費,Spark On Mesos還提供了另一種調度模式:細粒度模式,這種模式相似於如今的雲計算,思想是按需分配。與粗粒度模式同樣,應用程序啓動時,先會啓動executor,但每一個executor佔用資源僅僅是本身運行所需的資源,不須要考慮未來要運行的任務,以後,mesos會爲每一個executor動態分配資源,每分配一些,即可以運行一個新任務,單個Task運行完以後能夠立刻釋放對應的資源。每一個Task會彙報狀態給Mesos slave和Mesos Master,便於更加細粒度管理和容錯,這種調度模式相似於MapReduce調度模式,每一個Task徹底獨立,優勢是便於資源控制和隔離,但缺點也很明顯,短做業運行延遲大。3. Spark On YARN模式這是一種頗有前景的部署模式。但限於YARN自身的發展,目前僅支持粗粒度模式(Coarse-grained Mode)。這是因爲YARN上的Container資源是不能夠動態伸縮的,一旦Container啓動以後,可以使用的資源不能再發生變化,不過這個已經在YARN計劃中了。 spark on yarn 的支持兩種模式: 1) yarn-cluster:適用於生產環境; 2) yarn-client:適用於交互、調試,但願當即看到app的輸出 yarn-cluster和yarn-client的區別在於yarn appMaster,每一個yarn app實例有一個appMaster進程,是爲app啓動的第一個container;負責從ResourceManager請求資源,獲取到資源後,告訴NodeManager爲其啓動container。yarn-cluster和yarn-client模式內部實現仍是有很大的區別。若是你須要用於生產環境,那麼請選擇yarn-cluster;而若是你僅僅是Debug程序,能夠選擇yarn-client。總結: 這三種分佈式部署方式各有利弊,一般須要根據實際狀況決定採用哪一種方案。進行方案選擇時,每每要考慮公司的技術路線(採用Hadoop生態系統仍是其餘生態系統)、相關技術人才儲備等。上面涉及到Spark的許多部署模式,究竟哪一種模式好這個很難說,須要根據你的需求,若是你只是測試Spark Application,你能夠選擇local模式。而若是你數據量不是不少,Standalone 是個不錯的選擇。當你須要統一管理集羣資源(Hadoop、Spark等),那麼你能夠選擇Yarn或者mesos,可是這樣維護成本就會變高。 · 從對比上看,mesos彷佛是Spark更好的選擇,也是被官方推薦的 · 但若是你同時運行hadoop和Spark,從兼容性上考慮,Yarn是更好的選擇。 · 若是你不只運行了hadoop,spark。還在資源管理上運行了docker,Mesos更加通用。 · Standalone對於小規模計算集羣更適合!

相關文章
相關標籤/搜索