1. 程式人生 > >Spark在Windows下執行,本地提交sp…

Spark在Windows下執行,本地提交sp…

【問題】Spark在windows能跑叢集模式嗎? 我認為是可以的,但是需要詳細瞭解cmd命令列的寫法。目前win下跑spark的單機模式是沒有問題的。 【關鍵點】spark啟動機制容易被windows的命令列cmd坑   1、帶空格、奇怪字元的安裝路徑,cmd不能識別。最典型的坑就是安裝在Program Files資料夾下的程式,因為Program和Files之間有個空格,所以cmd竟不能識別。之前就把JDK安裝在了Program Files下面,然後啟動spark的時候,總是提示我找不到JDK。我明明配置了環境變量了啊?這就是所謂了《已經配置環境變數,spark 仍然找不到Java》的錯誤問題。至於奇怪的字元,如感嘆號!,我經常喜歡用來將重要的資料夾排在最前面,但cmd命令提示符不能識別。   2、是否需要配置hadoop的路徑的問題——答案是需要用HDFS或者yarn就配,不需要用則不需配置。目前大多數的應用場景裡面,Spark大規模叢集基本安裝在Linux伺服器上,而自己用windows跑spark的情景,則大多基於學習或者實驗性質,如果我們所要讀取的資料檔案從本地windows系統的硬碟讀取(比如說d:\data\ml.txt),基本上不需要配置hadoop路徑。我們都知道,在編spark程式的時候,可以指定spark的啟動模式,而啟動模式有這麼三中(以python程式碼舉例):    (2.1)本地情況,conf = SparkConf().setMaster("local[*]") ——>也就是拿本機的spark來跑程式    (2.2)遠端情況,conf = SparkConf().setMaster("spark://remotehost:7077") ——>遠端spark主機    (2.3)yarn情況,conf = SparkConf().setMaster("yarn-client") ——>遠端或本地 yarn叢集代理spark 針對這3種情況,配置hadoop安裝路徑都有什麼作用呢?(2.1)本地的情況,直接拿本機安裝的spark來執行spark程式(比如d:\spark-1.6.2),則配不配製hadoop路徑取決於是否需要使用hdfs。java程式的情況就更為簡單,只需要匯入相應的hadoop的jar包即可,是否配置hadoop路徑並不重要。(2.2)的情況大體跟(2.1)的情況相同,雖然使用的遠端spark,但如果使用本地資料,則運算的元資料也是從本地上傳到遠端spark叢集的,無需配置hdfs。而(2.3)的情況就大不相同,經過我搜遍baidu、google、bing引擎,均沒找到SparkConf直接配置遠端yarn地址的方法,唯一的一個帖子介紹可以使用yarn://remote:8032的形式,則會報錯“無法解析 地址”。檢視Spark的官方說明,Spark其實是通過hadoop路徑下的etc\hadoop資料夾中的配置檔案來尋找yarn叢集
的: Ensure that HADOOP_CONF_DIR or YARN_CONF_DIR points to the directory which contains the (client side) configuration files for the Hadoop cluster. These configs are used to write to HDFS and connect to the YARN ResourceManager.   因此,需要使用yarn來執行spark的情況,在spark那配置好hadoop的目錄就尤為重要。後期經過虛擬機器的驗證,表明,只要windows本地配置的host地址等資訊與linux伺服器端相同(注意應更改hadoop-2/etc/hadoop 下各種資料夾的配置路徑,使其與windows本地一致),是可以直接在win下用yarn-client提交spark任務到遠端叢集的。參考的spark-env.cmd(注意是cmd而不是sh,需要自己在spark\conf資料夾下建立這個檔案)配置如下:
set HADOOP_HOME=D:\hadoop-2.7.2test
set HADOOP_CONF_DIR=D:\hadoop-2.7.2test\etc\hadoop set SPARK_YARN_USER_ENV="CLASSPATH=D:\hadoop-2.7.2test\etc\hadoop" set SPARK_MASTER_HOST=bigmaster set SPARK_WORKER_CORES=2 set SPARK_WORKER_MEMORY=1g
  3、是否需要配置環境變數的問題,若初次配置,可以考慮在IDE裡面配置,或者在程式本身用setProperty函式進行配置。因為配置windows下的hadoop、spark環境是個非常頭疼的問題,有可能路徑不對而導致無法找到相應要呼叫的程式。待實驗多次成功率提高以後,再直接配置windows的全域性環境變數不遲。   4、使用Netbeans這個IDE的時候,有遇到Netbeans不能清理構建的問題。原因,極有可能是匯入了重複的庫,spark裡面含有hadoop包,記得檢查衝突。同時,在清理構建之前,記得重新編譯一遍程式,再進行清理並構建。   5、經常遇到WARN YarnClusterScheduler: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources
資源不足無法執行的問題,新增conf.set("spark.executor.memory", "512m");語句進行資源限制。先前在虛擬機器跑spark,由於本身機子效能不高,給虛擬機器設定的記憶體僅僅2G,導致hadoop和spark雙開之後系統資源嚴重不足。因此可以縮小每個executor的運算規模。其他資源缺乏問題的解決方法參考http://blog.sina.com.cn/s/blog_4b1452dd0102wyzo.html