(1) 準備工作
在正式介紹之前,先要以下軟硬件準備:
軟件準備:
Eclipse Juno版本(4.2版本),可以直接點擊這裏下載:Eclipse 4.2
Scala 2.9.3版本,Window安裝程序可以直接點擊這裏下載:Scala 2.9.3
Eclipse Scala IDE插件,可直接點擊這裏下載:Scala IDE(for Scala 2.9.x and Eclipse Juno)
硬件準備
裝有Linux或者Windows操作系統的機器一臺
(2) 構建Spark集成開發環境
我是在windows操作系統下操作的,流程如下:
步驟1:安裝scala 2.9.3:直接點擊安裝即可。
步驟2:將Eclipse Scala IDE插件中features和plugins兩個目錄下的所有文件拷貝到Eclipse解壓後對應的目錄中
步驟3:重新啓動Eclipse,點擊eclipse右上角方框按鈕,如下圖所示,展開後,點擊“Other….”,查看是否有“Scala”一項,有的話,直接點擊打開,否則進行步驟4操作。
步驟4:在Eclipse中,依次選擇“Help” –> “Install New Software…”,在打開的卡里填入http://download.scala-ide.org/sdk/e38/scala29/stable/site,並按回車鍵,可看到以下內容,選擇前兩項進行安裝即可。(由於步驟3已經將jar包拷貝到eclipse中,安裝很快,只是疏通一下)安裝完後,重複操作一遍步驟3便可。
(3) 使用Scala語言開發Spark程序
在eclipse中,依次選擇“File” –>“New” –> “Other…” –> “Scala Wizard” –> “Scala Project”,創建一個Scala工程,並命名爲“SparkScala”。
右擊“SaprkScala”工程,選擇“Properties”,在彈出的框中,按照下圖所示,依次選擇“Java Build Path” –>“Libraties” –>“Add External JARs…”,導入文章“Apache Spark學習:將Spark部署到Hadoop 2.2.0上”中給出的
assembly/target/scala-2.9.3/目錄下的spark-assembly-0.8.1-incubating-hadoop2.2.0.jar,這個jar包也可以自己編譯spark生成,放在spark目錄下的assembly/target/scala-2.9.3/目錄中。
跟創建Scala工程類似,在工程中增加一個Scala Class,命名爲:WordCount,整個工程結構如下:
WordCount就是最經典的詞頻統計程序,它將統計輸入目錄中所有單詞出現的總次數,Scala代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import
org.apache.spark. _ import
SparkContext. _ object
WordCount { def
main(args :
Array[String]) { if
(args.length ! =
3
){ println( "usage
is org.test.WordCount <master> <input> <output>" ) return } val
sc =
new
SparkContext(args( 0 ),
"WordCount" , System.getenv( "SPARK_HOME" ),
Seq(System.getenv( "SPARK_TEST_JAR" ))) val
textFile =
sc.textFile(args( 1 )) val
result =
textFile.flatMap(line = >
line.split( "\\s+" )) .map(word
= >
(word, 1 )).reduceByKey( _
+ _ ) result.saveAsTextFile(args( 2 )) } } |
在Scala工程中,右擊“WordCount.scala”,選擇“Export”,並在彈出框中選擇“Java” –> “JAR File”,進而將該程序編譯成jar包,可以起名爲“spark-wordcount-in-scala.jar”,我導出的jar包下載地址是 spark-wordcount-in-scala.jar。
該WordCount程序接收三個參數,分別是master位置,HDFS輸入目錄和HDFS輸出目錄,爲此,可編寫run_spark_wordcount.sh腳本:
# 配置成YARN配置文件存放目錄
export YARN_CONF_DIR=/opt/hadoop/yarn-client/etc/hadoop/
SPARK_JAR=./assembly/target/scala-2.9.3/spark-assembly-0.8.1-incubating-hadoop2.2.0.jar \
./spark-class org.apache.spark.deploy.yarn.Client \
–jar spark-wordcount-in-scala.jar \
–class WordCount \
–args yarn-standalone \
–args hdfs://hadoop-test/tmp/input \
–args hdfs:/hadoop-test/tmp/output \
–num-workers 1 \
–master-memory 2g \
–worker-memory 2g \
–worker-cores 2
需要注意以下幾點:WordCount程序的輸入參數通過“-args”指定,每個參數依次單獨指定,第二個參數是HDFS上的輸入目錄,需要事先創建好,並上傳幾個文本文件,以便統計詞頻,第三個參數是HDFS上的輸出目錄,動態創建,運行前不能存在。
直接運行run_spark_wordcount.sh腳本即可得到運算結果。
在運行過程中,發現一個bug,org.apache.spark.deploy.yarn.Client有一個參數“–name”可以指定應用程序名稱:
但是使用過程中,該參數會阻塞應用程序,查看源代碼發現原來是個bug,該Bug已提交到Spark jira上:
1
2
3
4
5
6
7
8
9
10
11
12
|
//
位置:new-yarn/src/main/scala/org/apache/spark/deploy/yarn/ClientArguments.scala case
( "--queue" )
::
value ::
tail = > amQueue
=
value args
=
tail case
( "--name" )
::
value ::
tail = > appName
=
value args
=
tail //漏了這行代碼,導致程序阻塞 case
( "--addJars" )
::
value ::
tail = > addJars
=
value args
=
tail |
因此,大家先不要使用“–name”這個參數,或者修復這個bug,重新編譯Spark。
(4) 使用Java語言開發Spark程序
方法跟普通的Java程序開發一樣,只要將Spark開發程序包spark-assembly-0.8.1-incubating-hadoop2.2.0.jar作爲三方依賴庫即可。
(5) 總結
初步試用Spark On YARN過程中,發現問題還是非常多,使用起來非常不方便,門檻還是很高,遠不如Spark On Mesos成熟。
轉載自:http://dongxicheng.org/framework-on-yarn/spark-eclipse-ide/