1. 程式人生 > >Windows Spark On YARN 提交任務到CDH叢集

Windows Spark On YARN 提交任務到CDH叢集

軟體版本:

IDE:Intellij IDEA 14,Java:1.7,Tomcat:7,CDH:5.8.0; Spark:1.6.0-cdh5.8.0-hadoop2.6.0-cdh5.8.0 ; Hadoop:hadoop2.6.0-cdh5.8.0;

部署環境:

1. 在Windows10 上啟動IDEA ,並啟動Tomcat,在Tomcat中使用Spark On YARN的方式呼叫封裝好的Spark演算法;

2. 呼叫的叢集使用CDH叢集(使用的是Cloudera官網下載的虛擬機器,所以是單節點,由於這個是單機版的所以把YARN的配置檔案改了下,改為使用YARN,而且虛擬機器還配置了靜態ip);

工程參考:

1. Web工程呼叫Spark叢集演算法,使用Spark On YARN的方式呼叫,參考

基於Spark ALS線上推薦系統 ,不過這個使用的是原生Spark及Hadoop安裝包進行叢集部署及工程配置的;(說白了就是不適合CDH叢集,如果適合的話,還寫這篇文章幹啥);

問題描述:

1.Classpath問題

 1. 參考基於Spark ALS線上推薦系統 中的配置進行呼叫CDH叢集執行任務,發現其ClassPath有問題;

具體表現為org.apache.hadoop.conf.Configuration類找不到,如下:


2. 使用Spark-submit的方式提交任務可以正常執行:

1) 其AM Launch Context如下:


2) 但是使用Web提交的時候對比發現,其AM Launch Context中的CLASSPATH對應不到,缺少了一些本地的jar包;如下:


發現後面跟的引數不一樣,也就是Classpath的問題了,怎麼新增呢?在生成Configuration的時候新增yarn.application.classpath即可,如下:

conf.set("yarn.application.classpath","/usr/lib/spark/lib/spark-assembly.jar:/usr/lib/hadoop/lib/*:/usr/lib/hadoop/*:/usr/lib/hadoop-hdfs/lib/*:/usr/lib/hadoop-hdfs/*:/usr/lib/hadoop-mapreduce/lib/*:/usr/lib/hadoop-mapreduce/*:/usr/lib/hadoop-yarn/lib/*:/usr/lib/hadoop-yarn/*:/usr/lib/hive/lib/*:/usr/lib/flume-ng/lib/*:/usr/lib/paquet/lib/*:/usr/lib/avro/lib/*");
這樣就不會再報Configuration類找不到了;

2. Windows & LInux問題

1. 參考上節修改完成後,使用Windows再次提交發現下面的問題:



2. 但是使用Linux部署TOmcat,卻是可以執行的;通過對比提交命令,如下:


上面是Linux提交的,下面是Windows提交的;

這就奇怪了,檢視其原始碼;

3. 檢視ApplicationMaster原始碼,檢視其args與arg的區別:

首先了解下Spark On YARN提交流程:Client –> ApplicationMaster ,所以也就是說是Client構造的引數,然後提交給ApplicationMaster。那看看其原始碼(org.apache.spark.deploy.yarn.Client):


發現Client 中構造的是確實是—arg,也就是說ApplicationMaster應該處理的也是arg引數,而非args引數,檢視ApplicationMaster(org.apache.spark.deploy.yarn.ApplicationMaster)原始碼:


其處理引數使用的是ApplicationMasterArguments,看ApplicationMasterArguments是怎麼處理引數的呢?


所以也就是說其是使用--args和--arg都是可以的,那為什麼單單Windows提交不行呢?

4. Windows --arg問題解決

通過對比Linux和Windows提交的Command引數,發現在--arg引數後面,如果使用Linux提交,那麼其後的引數被單引號引起來了,但是Windows提交的時候就沒有,這也就是說在Client構造--arg引數的時候,Windows和Linux是不一樣的,在Client原始碼843行中有這樣一句:

Seq("--arg", YarnSparkHadoopUtil.escapeForShell(arg))
也即是說YarnSparkHadoopUtil對Windows和Linux處理方式是不一樣的,檢視函式原始碼:


通過上面的修改,那麼Windows提交任務到YARN上就不會出現--arg引數notsupport的提示了;

5. 未知問題

表現,在主監控表現:


在日誌表現:


這就很奇怪了,啟動了3個executor,但是3個都不知道什麼原因失敗了,然後達到了3次最大失敗次數,然後就失敗了;

6. 怎麼解決未知問題:

這個還需要通過日誌來,首先說明有兩個Context,其一是AM Launch Context,其二是Executor Launch COntext,對比發現,Web提交的和Submit提交的,這兩個還是不一樣:


所以這裡還是要解決SPARK_DIST_CLASSPATH的問題,其實這個問題說簡單就很簡單,只需要在sparkConf裡面加個設定即可:

sparkConf.set("spark.yarn.appMasterEnv.SPARK_DIST_CLASSPATH","/usr/lib/spark/lib/spark-assembly.jar:/usr/lib/hadoop/lib/*:/usr/lib/hadoop/*:/usr/lib/hadoop-hdfs/lib/*:/usr/lib/hadoop-hdfs/*:/usr/lib/hadoop-mapreduce/lib/*:/usr/lib/hadoop-mapreduce/*:/usr/lib/hadoop-yarn/lib/*:/usr/lib/hadoop-yarn/*:/usr/lib/hive/lib/*:/usr/lib/flume-ng/lib/*:/usr/lib/paquet/lib/*:/usr/lib/avro/lib/*");
或者設定
System.setProperty("spark.yarn.appMasterEnv.SPARK_DIST_CLASSPATH","/usr/lib/spark/lib/spark-assembly.jar:/usr/lib/hadoop/lib/*:/usr/lib/hadoop/*:/usr/lib/hadoop-hdfs/lib/*:/usr/lib/hadoop-hdfs/*:/usr/lib/hadoop-mapreduce/lib/*:/usr/lib/hadoop-mapreduce/*:/usr/lib/hadoop-yarn/lib/*:/usr/lib/hadoop-yarn/*:/usr/lib/hive/lib/*:/usr/lib/flume-ng/lib/*:/usr/lib/paquet/lib/*:/usr/lib/avro/lib/*");
也可以;

再次提交任務,發現任務執行成功:


解決方案

1. 使用原生Spark Assembly jar包

我個人是之前知道的,使用原生 Spark Assembly jar包放在Web程式的lib目錄下面是可以呼叫CDH叢集的(CDH叢集上的HDFS上面放的Assembly jar包是CDH自己的);但是這個不適用這裡的情況,這裡使用的是Maven來構建專案,不能自己新增jar包,所以只能使用CDH提供的各種Spark的小jar包;那使用Spark原生Assembly jar包怎麼做呢?其實很簡單:把HDFS上面放的Assembly jar包改為Spark原生的即可!
如果使用Spark-submit提交,那麼其Name應該是com.fz.classification.LogisticRegression,而使用Web提交,其Name就是如上圖所示的;

2. 設定SPARK_DIST_CLASSPATH引數

參考上面的解決方案即可(個人認為這個是解決問題的答案,而非解決方案1)

總結:

1. Spark On YARN ,不能直接套用,針對CDH叢集或HDP叢集其一些表現和開源版本還是有不一樣的地方的;

2. 針對出現的問題,要思路清晰,需要了解其整體流程,這樣就可以去排查錯誤了;

3. 針對出現的問題,還可以通過對比驗證的方式來解決,比如Spark On YARN,可以試試Spark-submit的方式是否可以提交任務?如果可以提交任務,那麼使用Web提交和Spark-submit提交有什麼異同呢?把不一樣的地方給它整一樣了,是否問題就解決了呢?

分享,成長,快樂


腳踏實地,專注


轉載請註明blog地址:http://blog.csdn.net/fansy1990

相關推薦

Windows Spark On YARN 提交任務CDH叢集

軟體版本:IDE:Intellij IDEA 14,Java:1.7,Tomcat:7,CDH:5.8.0; Spark:1.6.0-cdh5.8.0-hadoop2.6.0-cdh5.8.0 ; Hadoop:hadoop2.6.0-cdh5.8.0;部署環境:1. 在Wi

Spark on Yarn提交任務緩慢

在使用 Spark on Yarn模式在叢集中提交任務的時候執行很緩慢,並且還報了一個WARN 使用叢集提交任務 ./bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ -

Spark on Yarn任務提交引數配置

當在YARN上執行Spark作業,每個Spark executor作為一個YARN容器執行。Spark可以使得多個Tasks在同一個容器裡面執行。 以下引數配置為例子 spark-submit --master yarn-cluster  / yarn-client 

記2018最後一次問題診斷-Spark on Yarn所有任務執行失敗

  2018的最後一個工作日,是在調式和診斷問題的過程中度過,原本可以按時下班,畢竟最後一天了,然鵝,確是一直苦苦掙扎。   廢話不多說,先描述一下問題:有一套大資料環境,是CDH版本的,總共4臺機子,我們的應用程式與大資料叢集之前已經整合完畢,除錯沒有問題,可以執行Spark任務。而與這個叢集整合是17年

spark on yarn任務提交緩慢解決

1.為什麼要讓執行時Jar可以從yarn端訪問spark2以後,原有lib目錄下的大JAR包被分散成多個小JAR包,原來的spark-assembly-*.jar已經不存在 每一次我們執行的時候,如果沒有指定 spark.yarn.archive or spark.yarn.jars Spark將在安裝路徑

Spark on yarn--幾種提交叢集執行spark程式的方式

今天看了spark的yarn配置,本來想著spark在hadoop叢集上啟動之後,還需要配置spark才能讓yarn來管理和排程spark的資源,原來啟動master和worker之後就會讓yarn來

大資料之Spark(八)--- Spark閉包處理,Spark的應用的部署模式,Spark叢集的模式,啟動Spark On Yarn模式,Spark的高可用配置

一、Spark閉包處理 ------------------------------------------------------------ RDD,resilient distributed dataset,彈性(容錯)分散式資料集。 分割槽列表,fun

Spark On Yarn任務超時監控-Shell

最近在用spark跑任務,發現有些任務實際已經執行完成,但是就是佔用資源,結束不了,用shell寫了個yarn上application耗時監控指令碼,超時自動殺掉。 #!/bin/bash #current_time=`date +'%Y-%m-%d %H:%M:%S'`

spark on yarn cluster模式提交作業,一直處於ACCEPTED狀態,改了Client模式後就正常了

1. 提交spark作業到yarn,採用client模式的時候作業可以執行,但是採用cluster模式的時候作業會一直初一accept狀態。 背景:這個測試環境的資源比較小,提交作業後一直處於accept狀態,所以把作業的配置也設定的小。 submit 語句: spark

spark用程式提交任務yarn

因為spark文件中只介紹了兩種用指令碼提交到yarn的例子,並沒有介紹如何通過程式提交yarn,但是我們的需求需要這樣。網上很難找到例子,經過幾天摸索,終於用程式提交到yarn成功,下面總結一下。 先介紹官網提交的例子,我用的是spark 0.9.0 hadoop

spark-on-yarn作業提交緩慢優化

 spark on yanr方式執行計算作業,發現作業提交緩慢 根據日誌,提交緩慢主要在兩個過程: 一、uploading file太慢 17/05/09 10:13:28 INFO yarn.Client: Uploading resource file:/opt/c

Spark on Yarn任務執行的日誌收集

Spark on yarn 環境:基於CDH的大資料元件平臺。 yarn服務有resource manager和node manager組成,在yarn上執行的任務,由一個ApplicationMaster和多個container組成。 Spark 執行由一個drive

Spark On Yarn提交Spark應用程式到Yarn

Spark On Yarn模式配置非常簡單,只需要下載編譯好的Spark安裝包,在一臺帶有Hadoop Yarn客戶端的機器上解壓,簡單配置之後即可使用。 要把Spark應用程式提交到Yarn執行,首先需要配置HADOOP_CONF_DIR或者YARN_C

spark on yarn圖形化任務監控利器:History-server幫你理解spark任務執行過程

在spark on yarn任務進行時,大家都指導用4040埠監控(預設是,設定其他或者多個任務同時會遞增等例外); 辣麼,任務結束了,還要看圖形化介面,那就要開history-server了。CDH安裝spark on yarn的時候,就自動安裝了history的例項。

ecplise提交JOB到spark on yarn/standalone

以前我通常是把scala或者java程式打包,這樣在釋出的時候可以結合傳統運維的jekins釋出規則,只需要運維手動點擊發布即可,不需要每次手動釋出。 最近我手動使用ecplise來提交JOB,碰到一些問題做個記錄: 1. ecplise提交JOB到spark on yarn 下面是

spark遠端debug之除錯spark on yarn 程式(基於CDH平臺,1.6.0版本)

簡介 由於spark有多種執行模式,遠端除錯的時候,雖然大體步驟相同,但是還是有小部分需要注意的地方,這裡記錄一下除錯執行在spark on yarn模式下的程式。 環境準備 需要完好的Hadoop,spark叢集,以便於提交spark on yarn程式。我這裡是基

spark-submit提交任務叢集

1.引數選取 當我們的程式碼寫完,打好jar,就可以通過bin/spark-submit 提交到叢集,命令如下: ./bin/spark-submit \    --class <main-class>   --master <master-url>

Spark Standalone與Spark on YARN的幾種提交方式

  不多說,直接上乾貨! Spark Standalone的幾種提交方式 別忘了先啟動spark叢集!!! spark-shell用於除錯,spark-submit用於生產。 1.spark-shell client [[email protected] spark-1

Spark on yarn Intellij ide 安裝,編譯,打包,叢集執行 詳解

說明:已經安裝好hadoop2.2.0 完全分佈,scala,spark已安裝好,環境配置完畢;主機為hadoop-master,hadoop-slave 一.intellij 安裝(centos6.5系統) 步驟一。 1.將上述兩個安裝

Spark on Yarn叢集高可用搭建

軟體環境: linux系統: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主機配置: 一共m1, m2, m3這五部機, 每部主機的使用者名稱都為centos 192.168.179.20