Spark歷險記之編譯和遠程任務提交


Spark簡介

Spark是加州大學伯克利分校AMP實驗室(Algorithms, Machines, and People Lab)開發通用內存並行計算框架。Spark在2013年6月進入Apache成為孵化項目,8個月后成為Apache頂級項目,速度之快足見過人之處,Spark以其先進的設計理念,迅速成為社區的熱門項目,圍繞着Spark推出了Spark SQL、Spark Streaming、MLLib和GraphX等組件,也就是BDAS(伯克利數據分析棧),這些組件逐漸形成大數據處理一站式解決平台。從各方面報道來看Spark抱負並非池魚,而是希望替代Hadoop在大數據中的地位,成為大數據處理的主流標准,不過Spark還沒有太多大項目的檢驗,離這個目標還有很大路要走。

Spark使用Scala語言進行實現,它是一種面向對象、函數式編程語言,能夠像操作本地集合對象一樣輕松地操作分布式數據集(Scala 提供一個稱為 Actor 的並行模型,其中Actor通過它的收件箱來發送和接收非同步信息而不是共享數據,該方式被稱為:Shared Nothing 模型)。在Spark官網上介紹,它具有運行速度快、易用性好、通用性強和隨處運行等特點。



環境介紹

序號 應用 說明
1 CDH Hadoop2.6 如果想跑在hadoop上,則需要安裝
2 JDK7 底層依賴
3 Scala2.11.7 底層依賴
4 Maven3.3.3 構建編譯打包
5 Ant1.9.5 構建編譯打包
6 Spark1.4.0 主角
7 Intillj IDEA 開發IDE
8 SBT scala-spark專屬打包構建工具
9 Centos6或Centos7 集群運行的Linux系統


這里Hadoop已經安裝完畢,並且能正常工作,Spark可以運行在Standalone模式上,所以假如你沒有Hadoop環境,當然也是可以使用的。 

1,下載scala : 
wget http://downloads.typesafe.com/scala/2.11.7/scala-2.11.7.tgz?_ga=1.103717955.215870088.1434449855 


2, 安裝scala , 解壓到某個目錄,並加入環境變量 
export SCALA_HOME=/ROOT/server/scala 
export PATH=$PATH:$SCALA_HOME/bin 

3,下載spark,這里推薦下載spark源碼,自己編譯所需對應的hadoop版本,雖然spark官網也提供了二進制的包! 
http://spark.apache.org/downloads.html 

4,編譯spark 
這里需要注意,默認的spark編譯,使用的是scala2.10的版本,一定要確保你所有使用的scala在大版本2.10.x范圍內一致,否則在某些情況下可能會出現莫名其妙的問題。 
我這里用的是spark1.4.0的版本,所以只能用scala2.11.x的版本,這就需要重新編譯spark了,另一個原因也需要和對應的haodop版本編譯對應。 

編譯步驟 
(1)將下載好的spark源碼解壓到某個目錄下 
(2)進入源碼目錄,分別執行如下命令 

設置使用scala那個版本編譯 
dev/change-version-to-2.11.sh 
maven打包,指定hadoop版本和scala版本 
mvn -Pyarn -Phadoop-2.6 -Dscala-2.11 -DskipTests clean package 
大概半小時候可編譯成功 






5,安裝spark 
請參考散仙以前的文章:http://qindongliang.iteye.com/blog/2224797 

6,spark測試的幾個命令: 

 

Java代碼

  1. standlone模式

  2. bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://Hadoop-1-231:7077 examples/target/spark-examples_2.11-1.4.0.jar 100

  3. yarn-cluster模式cluster

  4. bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn-cluster examples/target/spark-examples_2.11-1.4.0.jar 100

  5. yarn-client模式cluster

  6. bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn-client examples/target/spark-examples_2.11-1.4.0.jar 100



7,遠程任務提交

Spark集群一般都會部署在Linux上,而我們開發一般都會在windows上,那么我們想調試Spark程序,應該怎么做?

大多數的情況下,你都需要把你的程序打包成一個jar,然后上傳到Linux上,然后在執行測試,這樣非常麻煩,你頻繁改代碼
就意味着,你得不斷的打包,上傳,打包,上傳,這跟hadoop的調試是一樣的。

更簡潔的方式,就是直接在編譯器(這里推薦Intellj IDEA)里,開發,然后打包,直接在IDEA里以編程方式提交spark任務,這樣在開發期間相對就比較很高效了。

如何打包構建一個spark應用的程序 ?
(1)安裝使用maven 下載地址 https://maven.apache.org/
(2)安裝使用sbt 下載地址 http://www.scala-sbt.org/

這里推薦用sbt,專門針對scala項目的進行構建打包的

好吧,也許你需要一個demo來幫助你理解?

在IDEA中,創建一個Scala的SBT項目:

然后在build.sbt文件中,加入如下依賴:

Java代碼

  1. name := "spark2117"

  2. version := "1.0"

  3. scalaVersion := "2.11.7"

  4. libraryDependencies += "org.apache.hadoop" % "hadoop-client" % "2.6.0"

  5. libraryDependencies += "org.apache.spark" % "spark-core_2.11" % "1.4.0"

  6. libraryDependencies += "javax.servlet" % "javax.servlet-api" % "3.0.1"


一段簡單的代碼:




然后直接運行就能直接在windows上提交任務到Linux上的spark集群了

IDEA的控制台里會打印計算結果:




在Spark的8080監控頁面顯示如下:






8,遇到的問題:
IDEA里警告日志顯示:

Java代碼

  1. 15/08/04 19:33:09 WARN ReliableDeliverySupervisor: Association with remote system [akka.tcp://sparkMaster@h1:7077] has failed, address is now gated for [5000] ms. Reason is: [Disassociated].



Spark集群的Master機器的master的log日志顯示:

Java代碼

  1. java.io.InvalidClassException: scala.reflect.ClassTag$$anon$1;

  2. local class incompatible: stream classdesc serialVersionUID = -4937928798201944954,

  3. local class serialVersionUID = -8102093212602380348



服務器上log是准確的,它告訴我們有客戶端和服務端的序列化版本不一致,意思就是說,你的scala或者是hadoop的版本等跟服務器上的可能不一致,所以安裝時務必要確定所有的軟件版本號一致。

這個問題,我在stackoverflow上提問了2天,都沒人知道,最后各種瘋狂的找資料才發現就是軟件版本不一致導致的,真是大意失荊州了,解鈴還須系鈴人!



最后歡迎大家掃碼關注微信公眾號:我是攻城師(woshigcs),我們一起學習,進步和交流!(woshigcs) 
本公眾號的內容是有關搜索和大數據技術和互聯網等方面內容的分享,也是一個溫馨的技術互動交流的小家園,有什么問題隨時都可以留言,歡迎大家來訪! 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM