spark on yarn

spark on yarn

軟件安裝

當前環境

hadoop環境搭建參考:hadoop集羣安裝

  • hadoop2.6
  • spark-2.2.0-bin-hadoop2.6.tgz
  • scala-2.11.12

安裝scala

tar -zxvf scala-2.11.12.tgz

vi /etc/profile

添加以下內容

export SCALA_HOME=/home/hadoop/app/scala
export PATH=$PATH:$SCALA_HOME/bin

使配置生效

source /etc/profile

查看scala版本號

scala -version

注意: 用root賬戶修改完變量後,需要重新打開ssh鏈接,配置才能生效

安裝spark

tar -zvf spark-2.2.0-bin-without-hadoop.tgz

vi /etc/profile

添加以下內容

export SPARK_HOME=/home/hadoop/app/spark2.2.0
export PATH=$PATH:$SPARK_HOME/bin

修改spark環境變量

cp spark-env.sh.template spark-env.sh

vi conf/spark-evn.sh

添加以下內容

SPARK_DRIVER_MEMORY=512m
SPARK_DIST_CLASSPATH=$(/home/hadoop/app/hadoop-2.6.0/bin/hadoop classpath)
SPARK_LOCAL_DIRS=/home/hadoop/app/spark2.2.0
export SPARK_MASTER_IP=192.168.10.125

export JAVA_HOME=/home/app/jdk8
export SCALA_HOME=/home/hadoop/app/scala
export HADOOP_HOME=/home/hadoop/app/hadoop
export HADOOP_CONF_DIR=/home/hadoop/app/hadoop/etc/hadoop
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$SCALA_HOME/bin

使配置變量生效

source /etc/profile

配置slaves

vi slaves

node3
node4

將配置文件下發到從節點

scp slaves hadoop@node3:/home/hadoop/app/spark2.2.0/conf
scp slaves hadoop@node4:/home/hadoop/app/spark2.2.0/conf
scp spark-env.sh hadoop@node3:/home/hadoop/app/spark2.2.0/conf
scp spark-env.sh hadoop@node4:/home/hadoop/app/spark2.2.0/conf

啓動

# 啓動zookeeper,可能存在選舉延遲,可多執行幾次./zkServer.sh status查看啓動結果
./runRemoteCmd.sh "/home/hadoop/app/zookeeper/bin/zkServer.sh start" zookeeper
# 在node2節點上執行,啓動HDFS
sbin/start-dfs.sh
# 在node2節點上執行,啓動YARN
sbin/start-yarn.sh 
# 在node4節點上面執行,啓動resourcemanager
sbin/yarn-daemon.sh start resourcemanager
# 在node2上啓動spark
sbin/start-all.sh

關閉

# 關閉spark
sbin/stop-all.sh
# 在node4上執行
sbin/yarn-daemon.sh stop resourcemanager
# 在node2上執行
sbin/stop-yarn.sh 
# 在node2上執行
sbin/stop-dfs.sh
# 關閉zookeeper
runRemoteCmd.sh "/home/hadoop/app/zookeeper/bin/zkServer.sh stop" zookeeper

查看啓動情況

jps

# hdfs進程
1661 NameNode
1934 SecondaryNameNode
1750 DataNode

# yarn進程
8395 ResourceManager
7725 NameNode

# namenode HA
8256 DFSZKFailoverController
7985 JournalNode

# zookeeper進程
1286 QuorumPeerMain

# spark進程
2551 Master
2641 Worker

管理界面

hadoop:  http://node2:8088/
nameNode: http://node2:50070/
nodeManager:  http://node2:8042/
spark master:  http://node2:8080/
spark worker:  http://node2:8081/
spark jobs:  http://node2:4040/

運行示例

Spark-shell

vi test.text# 在文件中添加 hello spark
hdfs dfs -mkdir /test # 創建文件夾
hdfs dfs -put test.txt /test # 上傳文件到hdfs
hdfs dfs -ls /test # 查看是否上傳成功
./bin/spark-shell
sc.textFile("hdfs://node2:9000/test/test.txt") # 從hdfs上獲取文件
sc.first() # 獲取文件的第一行數據

Run application locally(Local模式)

./bin/spark-submit --class org.apache.spark.examples.SparkPi --master local[4] /home/hadoop/app/spark2.2.0/examples/jars/spark-examples_2.11-2.2.0.jar

Run on a Spark standalone cluster(Standalone模式,使用Spark自帶的簡單集羣管理器)

./bin/spark-submit
--class org.apache.spark.examples.SparkPi
--master spark://node2:7077
--executor-memory 512m
--total-executor-cores 4
/home/hadoop/app/spark2.2.0/examples/jars/spark-examples_2.11-2.2.0.jar 10

Run on yarn(YARN模式,使用YARN作爲集羣管理器)

./bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode client examples/jars/spark-examples*.jar 10

注意事項

HADOOP_CONF_DIR=/home/hadoop/app/hadoop/etc/hadoop

確保 HADOOP_CONF_DIR 或者 YARN_CONF_DIR 指向包含 Hadoop 集羣的(客戶端)配置文件的目錄。這些配置被用於寫入 HDFS 並連接到 YARN ResourceManager 。此目錄中包含的配置將被分發到 YARN 集羣,以便 application(應用程序)使用的所有的所有 containers(容器)都使用相同的配置。如果配置引用了 Java 系統屬性或者未由 YARN 管理的環境變量,則還應在 Spark 應用程序的配置(driver(驅動程序),executors(執行器),和在客戶端模式下運行時的 AM )。

SPARK_DIST_CLASSPATH=$(/home/hadoop/app/hadoop-2.6.0/bin/hadoop classpath)

Pre-build with user-provided Hadoop: 屬於“Hadoop free”版,不包含hadoop的jar等,這樣,下載到的Spark,可應用到任意Hadoop 版本。但是需要在spark的spar-evn.sh中指定配置hadoop的安裝路徑。

spark-submit

如果用戶的應用程序被打包好了,它可以使用 bin/spark-submit 腳本來啓動。這個腳本負責設置 Spark 和它的依賴的 classpath,並且可以支持 Spark 所支持的不同的 Cluster Manager 以及 deploy mode(部署模式):

./bin/spark-submit \
  --class <main-class> \
  --master <master-url> \
  --deploy-mode <deploy-mode> \
  --conf <key>=<value> \
  ... # other options
  <application-jar> \
  [application-arguments]

一些常用的 options(選項)有 :

  • --class: 您的應用程序的入口點(例如。 org.apache.spark.examples.SparkPi)
  • --master: standalone模式下是集羣的 master URL,on yarn模式下值是yarn
  • --deploy-mode: 是在 worker 節點(cluster) 上還是在本地作爲一個外部的客戶端(client) 部署您的 driver(默認: client)
  • --conf: 按照 key=value 格式任意的 Spark 配置屬性。對於包含空格的 value(值)使用引號包 “key=value” 起來。
  • application-jar: 包括您的應用以及所有依賴的一個打包的 Jar 的路徑。該 URL 在您的集羣上必須是全局可見的,例如,一個 hdfs:// path 或者一個 file:// 在所有節點是可見的。
  • application-arguments: 傳遞到您的 main class 的 main 方法的參數,如果有的話。

異常處理

執行腳本

./bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode client /home/hadoop/app/spark2.2.0/examples/jars/spark-examples_2.11-2.2.0.jar

報錯信息一

Application application_1537990303043_0001 failed 2 times due to AM Container for appattempt_1537990303043_0001_000002 exited with  exitCode: -103
Diagnostics: 
Container [pid=2344,containerID=container_1537990303043_0001_02_000001] is running beyond virtual memory limits. 
Current usage: 74.0 MB of 1 GB physical memory used; 
2.2 GB of 2.1 GB virtual memory used. Killing container.

問題原因

虛擬機物理內存設置的是1G,則對應虛擬內存最大爲1*2.1=2.1GB,實際使用了2.2[此處疑問:爲什麼就使用了2.2,單個任務默認分配1024M,加上一個任務的Container默認1024M導致嗎?],所以需要擴大虛擬內存的比例,或者限制container和task的大小,或者關閉掉對虛擬內存的檢測。

解決方法

修改yarn-site.xml文件,新增以下內容,詳情原因請參考:YARN 內存參數詳解

  <property>
      <name>yarn.nodemanager.vmem-pmem-ratio</name>
      <value>3</value>
      <description>虛擬內存和物理內存比率,默認爲2.1</description>
  </property>
  <property>
    <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
    <description>不檢查虛擬內存,默認爲true</description>
  </property>

報錯二

Exception in thread "main" org.apache.spark.SparkException: Yarn application has already ended! It might have been killed or unable to launch application master.
	at org.apache.spark.scheduler.cluster.YarnClientSchedulerBackend.waitForApplication(YarnClientSchedulerBackend.scala:85)
	at org.apache.spark.scheduler.cluster.YarnClientSchedulerBackend.start(YarnClientSchedulerBackend.scala:62)
	at org.apache.spark.scheduler.TaskSchedulerImpl.start(TaskSchedulerImpl.scala:173)
	at org.apache.spark.SparkContext.<init>(SparkContext.scala:509)
	at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2509)
	at org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:909)
	at org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:901)
	at scala.Option.getOrElse(Option.scala:121)
	at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:901)
	at org.apache.spark.examples.SparkPi$.main(SparkPi.scala:31)
	at org.apache.spark.examples.SparkPi.main(SparkPi.scala)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:755)
	at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:180)
	at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:205)
	at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:119)
	at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
18/09/04 17:01:43 INFO util.ShutdownHookManager: Shutdown hook called

問題原因

以上報錯是在僞集羣上運行時報錯信息,具體報錯原因未知,在切換到真正的集羣環境後無此報錯

配置鏈接

hadoop

zookeeper

spark

env

tools

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