【注】該系列文章以及使用到安裝包/測試數(shù)據(jù) 可以在《傾情大奉送--Spark入門實戰(zhàn)系列》獲取1、編譯SparkSpark可以通過SBT和Maven兩種方式進行編譯,再通過make-distribution.sh腳本生成部署包。SBT編譯需要安裝git工具,而Maven安裝則需要maven工具,兩種方式均需要在聯(lián)網(wǎng)下進行,通過比較發(fā)現(xiàn)SBT編譯速度較慢(原因有可能是1、時間不一樣,SBT是白天編譯,Maven是深夜進行的,獲取依賴包速度不同 2、maven下載大文件是多線程進行,而SBT是單進程),Maven編譯成功前后花了3、4個小時。 1.1 編譯Spark(SBT)1.1.1 安裝git并編譯安裝1. 從如下地址下載git安裝包 http://www.onlinedown.net/softdown/169333_2.htm https://www./pub/software/scm/git/ 如果linux是CentOS操作系統(tǒng)可以通過:yum install git直接進行安裝 由于從https獲取內(nèi)容,需要安裝curl-devel,可以從如下地址獲取 http:///linux/rpm2html/search.php?query=curl-devel 如果linux是CentOS操作系統(tǒng)可以通過:yum install curl-devel直接進行安裝 2. 上傳git并解壓縮 把git-1.7.6.tar.gz安裝包上傳到/home/hadoop/upload目錄中,解壓縮然后放到/app目錄下 $cd /home/hadoop/upload/ $tar -xzf git-1.7.6.tar.gz $mv git-1.7.6 /app $ll /app 3. 編譯安裝git 以root用戶進行在git所在路徑編譯安裝git #yum install curl-devel #cd /app/git-1.7.6 #./configure #make #make install 4. 把git加入到PATH路徑中 打開/etc/profile把git所在路徑加入到PATH參數(shù)中 export GIT_HOME=/app/git-1.7.6 export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin:$GIT_HOME/bin 重新登錄或者使用source /etc/profile使參數(shù)生效,然后使用git命令查看配置是否正確 1.1.2 下載Spark源代碼并上傳1. 可以從如下地址下載到spark源代碼: http://spark./downloads.html http://d3kbcqa49mib13./spark-1.1.0.tgz git clone https://github.com/apache/spark.git 把下載好的spark-1.1.0.tgz源代碼包使用1.1.3.1介紹的工具上傳到/home/hadoop/upload 目錄下 2. 在主節(jié)點上解壓縮 $cd /home/hadoop/upload/ $tar -xzf spark-1.1.0.tgz 3. 把spark-1.1.0改名并移動到/app/complied目錄下 $mv spark-1.1.0 /app/complied/spark-1.1.0-sbt $ls /app/complied 1.1.3 編譯代碼編譯spark源代碼的時候,需要從網(wǎng)上下載依賴包,所以整個編譯過程機器必須保證在聯(lián)網(wǎng)狀態(tài)。編譯執(zhí)行如下腳本: $cd /app/complied/spark-1.1.0-sbt $sbt/sbt assembly -Pyarn -Phadoop-2.2 -Pspark-ganglia-lgpl -Pkinesis-asl -Phive 整個編譯過程編譯了約十幾個任務,重新編譯N次,需要幾個甚至十幾個小時才能編譯完成(主要看下載依賴包的速度)。 1.2 編譯Spark(Maven)1.2.1 安裝Maven并配置參數(shù)在編譯前最好安裝3.0以上版本的Maven,在/etc/profile配置文件中加入如下設置: export MAVEN_HOME=/app/apache-maven-3.0.5 export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin:$GIT_HOME/bin 1.2.2 下載Spark源代碼并上傳1. 可以從如下地址下載到spark源代碼: http://spark./downloads.html http://d3kbcqa49mib13./spark-1.1.0.tgz git clone https://github.com/apache/spark.git 把下載好的spark-1.1.0.tgz源代碼包使用1.1.3.1介紹的工具上傳到/home/hadoop/upload 目錄下 2. 在主節(jié)點上解壓縮 $cd /home/hadoop/upload/ $tar -xzf spark-1.1.0.tgz 3. 把spark-1.1.0改名并移動到/app/complied目錄下 $mv spark-1.1.0 /app/complied/spark-1.1.0-mvn $ls /app/complied 1.2.3 編譯代碼編譯spark源代碼的時候,需要從網(wǎng)上下載依賴包,所以整個編譯過程機器必須保證在聯(lián)網(wǎng)狀態(tài)。編譯執(zhí)行如下腳本: $cd /app/complied/spark-1.1.0-mvn $export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m" $mvn -Pyarn -Phadoop-2.2 -Pspark-ganglia-lgpl -Pkinesis-asl -Phive -DskipTests clean package 整個編譯過程編譯了約24個任務,整個過程耗時1小時45分鐘。 1.3 生成Spark部署包在Spark源碼根目錄下有一個生成部署包的腳本make-distribution.sh,可以通過執(zhí)行如下命令進行打包 ./make-distribution.sh [--name] [--tgz] [--with-tachyon] <maven build options> l --name NAME和--tgz 結(jié)合可以生成spark-$VERSION-bin-$NAME.tgz 的部署包,不加此參數(shù)時NAME 為hadoop 的版本號 l --tgz在根目錄下生成 spark-$VERSION-bin.tgz ,不加此參數(shù)時不生成tgz 文件,只生成/dist 目錄 l --with-tachyon 是否支持內(nèi)存文件系統(tǒng)Tachyon ,不加此參數(shù)時不支持tachyon 例子: 1. 生成支持yarn 、hadoop2.2.0 、hive 的部署包: ./make-distribution.sh --tgz --name 2.2.0 -Pyarn -Phadoop-2.2 -Phive 2. 生成支持yarn 、hadoop2.2.0 、hive 、ganglia 的部署包: ./make-distribution.sh --tgz --name 2.2.0 -Pyarn -Phadoop-2.2 -Pspark-ganglia-lgpl -P hive 1.3.1 生成部署包使用如下命令生成Spark部署包,由于該腳本默認在JDK1.6進行,在開始時會進行詢問是否繼續(xù),只要選擇Y即可 $cd /app/complied/spark-1.1.0-mvn/ $./make-distribution.sh --tgz --name 2.2.0 -Pyarn -Phadoop-2.2 -Pspark-ganglia-lgpl -P hive
生成Spark部署包編譯了約24個任務,用時大概1小時38分鐘。
1.3.2 查看生成結(jié)果生成在部署包位于根目錄下,文件名類似于spark-1.1.0-bin-2.2.0.tgz。 2、安裝Spark2.1 上傳并解壓Spark安裝包1.我們使用上一步驟編譯好的spark-1.1.0-bin-2.2.0.tgz文件作為安裝包(也可以從網(wǎng)上下載native文件夾或者打包好的64位hadoop安裝包),使用"Spark編譯與部署(上)"中1. 3.1介紹的工具上傳到/home/hadoop/upload 目錄下 2. 在主節(jié)點上解壓縮 $cd /home/hadoop/upload/ $tar -xzf spark-1.1.0-bin-2.2.0.tgz 3. 把spark改名并移動到/app/hadoop目錄下 $mv spark-1.1.0-bin-2.2.0 /app/hadoop/spark-1.1.0 $ll /app/hadoop 2.2 配置/etc/profile1. 打開配置文件/etc/profile $sudo vi /etc/profile 2. 定義SPARK_HOME并把spark路徑加入到PATH參數(shù)中 SPARK_HOME=/app/hadoop/spark-1.1.0 PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin 2.3 配置conf/slaves1. 打開配置文件conf/slaves $cd /app/hadoop/spark-1.1.0/conf $sudo vi slaves 2. 加入slave配置節(jié)點 hadoop1 hadoop2 hadoop3 2.4 配置conf/spark-env.sh1. 打開配置文件conf/spark-env.sh $cd /app/hadoop/spark-1.1.0/conf $cp spark-env.sh.template spark-env.sh $sudo vi spark-env.sh 2. 加入Spark環(huán)境配置內(nèi)容,設置hadoop1為Master節(jié)點 export SPARK_MASTER_IP=hadoop1 export SPARK_MASTER_PORT=7077 export SPARK_WORKER_CORES=1 export SPARK_WORKER_INSTANCES=1 export SPARK_WORKER_MEMORY=512M 2.5 向各節(jié)點分發(fā)Spark程序1. 進入hadoop1機器/app/hadoop目錄,使用如下命令把spark文件夾復制到hadoop2和hadoop3機器 $cd /app/hadoop $scp -r spark-1.1.0 hadoop@hadoop2:/app/hadoop/ $scp -r spark-1.1.0 hadoop@hadoop3:/app/hadoop/ 2. 在從節(jié)點查看是否復制成功 2.6 啟動Spark$cd /app/hadoop/spark-1.1.0/sbin $./start-all.sh 2.7 驗證啟動此時在hadoop1上面運行的進程有:Worker和Master 此時在hadoop2和hadoop3上面運行的進程有只有Worker 通過 netstat -nlt 命令查看hadoop1節(jié)點網(wǎng)絡情況 在瀏覽器中輸入 http://hadoop1:8080(需要注意的是要在網(wǎng)絡設置中把hadoop*除外,否則會到外網(wǎng)DNS解析,出現(xiàn)無法訪問的情況) 既可以進入Spark集群狀態(tài)頁面 2.8 驗證客戶端連接進入hadoop1節(jié)點,進入spark的bin目錄,使用spark-shell連接集群 $cd /app/hadoop/spark-1.1.0/bin $spark-shell --master spark://hadoop1:7077 --executor-memory 500m 在命令中只指定了內(nèi)存大小并沒有指定核數(shù),所以該客戶端將占用該集群所有核并在每個節(jié)點分配500M內(nèi)存 3、Spark測試3.1 使用Spark-shell測試這里我們測試一下在Hadoop中大家都知道的WordCout程序,在MapReduce實現(xiàn)WordCout需要Map、Reduce和Job三個部分,而在Spark中甚至一行就能夠搞定。下面就看一下是如何實現(xiàn)的: 3.1.1 啟動HDFS$cd /app/hadoop/hadoop-2.2.0/sbin $./start-dfs.sh 通過jps觀察啟動情況,在hadoop1上面運行的進程有:NameNode、SecondaryNameNode和DataNode hadoop2和hadoop3上面運行的進程有:NameNode和DataNode 3.1.2 上傳數(shù)據(jù)到HDFS中把hadoop配置文件core-site.xml文件作為測試文件上傳到HDFS中 $hadoop fs -mkdir -p /user/hadoop/testdata $hadoop fs -put /app/hadoop/hadoop-2.2.0/etc/hadoop/core-site.xml /user/hadoop/testdata 3.1.3 啟動Spark$cd /app/hadoop/spark-1.1.0/sbin $./start-all.sh 3.1.4 啟動Spark-shell在spark客戶端(這里在hadoop1節(jié)點),使用spark-shell連接集群 $cd /app/hadoop/spark-1.1.0/bin $./spark-shell --master spark://hadoop1:7077 --executor-memory 512m --driver-memory 500m 3.1.5 運行WordCount腳本下面就是WordCount的執(zhí)行腳本,該腳本是scala編寫,以下為一行實現(xiàn): scala>sc.textFile("hdfs://hadoop1:9000/user/hadoop/testdata/core-site.xml").flatMap(_.split(" ")).map(x=>(x,1)).reduceByKey(_+_).map(x=>(x._2,x._1)).sortByKey(false).map(x=>(x._2,x._1)).take(10) 為了更好看到實現(xiàn)過程,下面將逐行進行實現(xiàn): scala>val rdd=sc.textFile("hdfs://hadoop1:9000/user/hadoop/testdata/core-site.xml") scala>rdd.cache() scala>val wordcount=rdd.flatMap(_.split(" ")).map(x=>(x,1)).reduceByKey(_+_) scala>wordcount.take(10) scala>val wordsort=wordcount.map(x=>(x._2,x._1)).sortByKey(false).map(x=>(x._2,x._1)) scala>wordsort.take(10) 詞頻統(tǒng)計結(jié)果如下: Array[(String, Int)] = Array(("",100), (the,7), (</property>,6), (<property>,6), (under,3), (in,3), (License,3), (this,2), (-->,2), (file.,2)) 3.1.6 觀察運行情況通過http://hadoop1:8080查看Spark運行情況,可以看到Spark為3個節(jié)點,每個節(jié)點各為1個內(nèi)核/512M內(nèi)存,客戶端分配3個核,每個核有512M內(nèi)存。 通過點擊客戶端運行任務ID,可以看到該任務在hadoop2和hadoop3節(jié)點上運行,在hadoop1上并沒有運行,主要是由于hadoop1為NameNode和Spark客戶端造成內(nèi)存占用過大造成 3.2 使用Spark-submit測試從Spark1.0.0開始,Spark提供了一個易用的應用程序部署工具bin/spark-submit,可以完成Spark應用程序在local、Standalone、YARN、Mesos上的快捷部署。該工具語法及參數(shù)說明如下: Usage: spark-submit [options] <app jar | python file> [app options] Options: --master MASTER_URL spark://host:port, mesos://host:port, yarn, or local. --deploy-mode DEPLOY_MODE driver運行之處,client運行在本機,cluster運行在集群 --class CLASS_NAME 應用程序包的要運行的class --name NAME 應用程序名稱 --jars JARS 用逗號隔開的driver本地jar包列表以及executor類路徑 --py-files PY_FILES 用逗號隔開的放置在Python應用程序 PYTHONPATH上的.zip, .egg, .py文件列表 --files FILES 用逗號隔開的要放置在每個executor工作目錄的文件列表 --properties-file FILE 設置應用程序?qū)傩缘奈募胖梦恢?,默認是conf/spark-defaults.conf --driver-memory MEM driver內(nèi)存大小,默認512M --driver-java-options driver的java選項 --driver-library-path driver的庫路徑Extra library path entries to pass to the driver --driver-class-path driver的類路徑,用--jars 添加的jar包會自動包含在類路徑里 --executor-memory MEM executor內(nèi)存大小,默認1G
Spark standalone with cluster deploy mode only: --driver-cores NUM driver使用內(nèi)核數(shù),默認為1 --supervise 如果設置了該參數(shù),driver失敗是會重啟
Spark standalone and Mesos only: --total-executor-cores NUM executor使用的總核數(shù)
YARN-only: --executor-cores NUM 每個executor使用的內(nèi)核數(shù),默認為1 --queue QUEUE_NAME 提交應用程序給哪個YARN的隊列,默認是default隊列 --num-executors NUM 啟動的executor數(shù)量,默認是2個 --archives ARCHIVES 被每個executor提取到工作目錄的檔案列表,用逗號隔開 3.2.1 運行腳本1該腳本為Spark自帶例子,在該例子中個計算了圓周率π的值,以下為執(zhí)行腳本: $cd /app/hadoop/spark-1.1.0/bin $./spark-submit --master spark://hadoop1:7077 --class org.apache.spark.examples.SparkPi --executor-memory 512m ../lib/spark-examples-1.1.0-hadoop2.2.0.jar 200 參數(shù)說明(詳細可以參考上面的參數(shù)說明): l --master Master所在地址,可以有Mesos、Spark、YARN和Local四種,在這里為Spark Standalone集群,地址為spark://hadoop1:7077 l --class應用程序調(diào)用的類名,這里為org.apache.spark.examples.SparkPi l --executor-memory 每個executor所分配的內(nèi)存大小,這里為512M l 執(zhí)行jar包 這里是../lib/spark-examples-1.1.0-hadoop2.2.0.jar l 分片數(shù)目 這里數(shù)目為200 3.2.2 觀察運行情況通過觀察Spark集群有3個Worker節(jié)點和正在運行的1個應用程序,每個Worker節(jié)點為1內(nèi)核/512M內(nèi)存。由于沒有指定應用程序所占內(nèi)核數(shù)目,則該應用程序占用該集群所有3個內(nèi)核,并且每個節(jié)點分配512M內(nèi)存。 根據(jù)每個節(jié)點負載情況,每個節(jié)點運行executor并不相同,其中hadoop1的executor數(shù)目為0。而hadoop3執(zhí)行executor數(shù)為10個,其中5個EXITED狀態(tài),5個KILLED狀態(tài)。 3.2.3 運行腳本2該腳本為Spark自帶例子,在該例子中個計算了圓周率π的值,區(qū)別腳本1這里指定了每個executor內(nèi)核數(shù)據(jù),以下為執(zhí)行腳本: $cd /app/hadoop/spark-1.1.0/bin $./spark-submit --master spark://hadoop1:7077 --class org.apache.spark.examples.SparkPi --executor-memory 512m --total-executor-cores 2 ../lib/spark-examples-1.1.0-hadoop2.2.0.jar 200 參數(shù)說明(詳細可以參考上面的參數(shù)說明): l --master Master所在地址,可以有Mesos、Spark、YARN和Local四種,在這里為Spark Standalone集群,地址為spark://hadoop1:7077 l --class應用程序調(diào)用的類名,這里為org.apache.spark.examples.SparkPi l --executor-memory 每個executor所分配的內(nèi)存大小,這里為512M l --total-executor-cores 2 每個executor分配的內(nèi)核數(shù) l 執(zhí)行jar包 這里是../lib/spark-examples-1.1.0-hadoop2.2.0.jar l 分片數(shù)目 這里數(shù)目為200
3.2.4 觀察運行情況通過觀察Spark集群有3個Worker節(jié)點和正在運行的1個應用程序,每個Worker節(jié)點為1內(nèi)核/512M內(nèi)存。由于指定應用程序所占內(nèi)核數(shù)目為2,則該應用程序使用該集群所有2個內(nèi)核。 |
|
來自: 土心園 > 《hadoop hbase》