本文主要講解spark 環境的搭建
主機配置 4核8線程,主頻3.4G,16G內存
虛擬環境: VMWare
虛擬環境系統:Ubuntu 14.10
虛擬機運行環境:
- jdk-1.7.0_79(64bit)
- hadoop-2.6.0.tar.gz
- scala-2.10.4.tar
- spark-1.5.0-bin -hadoop-2.6.0.tgz
(一)樣本虛擬機的搭建
1)虛擬機安裝ubuntu,每個分配3G內存,完成后后輸入如下命令來獲得root權限:
#sudo passwd
2)ubuntu下源的更改:
#sudo gedit /etc/apt/sources.list
找到一個還用的源替換掉 /etc/apt/sources.list中原來的內容
執行更新:
#sudo apt-get update
3)安裝ssh,以便遠程登錄
ssh-client : 本機作為客戶機通過ssh鏈接遠程的服務器
ssh-server:本機作為遠程服務器,可以被客戶機鏈接
#sudo apt-get install ssh-client
注意上述命令可能出現問題 “依賴 :openssh-client (= 1:6.6p1-2ubuntu1)”
使用 這條命令即可解決: #sudo apt-get install ssh-client= 1:6.6p1-2ubuntu1
接下來安裝#sudo apt-get install ssh-server (或者 apt-get install openssh-server)
4)查看ssh服務是否啟動
#ps -e |grep ssh
顯現出sshd 則說明安裝成功
5)更新vim
#sudo apt-get remove vim
#sudo apt-get install vim
6)修改/etc/ssh/sshd_config 文件,使得本機允許遠程連接,現在即可通過putty,xshell等連接該機
# Authentication:
LoginGraceTime 120
PermitRootLogin yes
StrictModes yes
7)修改host主機名
#vi /etc/hostname 將該文件該為spark1
然后 #vi /ect/hosts 改成與上述文件相同的名字
重啟 #hostname 查看是否生效
8)注意虛擬機的網絡設置為橋接
#ifconfig 可來查看網絡狀態
9)根據求查看是否需要固定IP
設置靜態IP方法如下:
#sudo vim /etc/network/interfaces
#修改如下部分:
auto eth0
iface eth0 inet static
address 192.168.0.117
gateway 192.168.0.1 #這個地址你要確認下 網關是不是這個地址
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
因為以前是dhcp解析,所以會自動分配dns服務器地址,而一旦設置為靜態ip后就沒有自動獲取到的dns服務器了,設置靜態IP地址后,再重啟后就無法解析域名。想重新設置一下DNS,有兩個辦法:
- 通過/etc/network/interfaces,在它的最后增加一句:
dns-nameservers 8.8.8.8
8.8.8.8是Google提供的DNS服務,這里只是舉一個例子,你也可以改成電信運營商的DNS。重啟后DNS就生效了。
- 通過修改:
/etc/resolvconf/resolv.conf.d/base(這個文件默認是空的)
在里面插入:
nameserver 8.8.8.8
nameserver 8.8.4.4
如果有多個DNS就一行一個,修改好保存,然后執行resolvconf -u再看/etc/resolv.conf,最下面就多了2行:
nameserver 8.8.8.8
nameserver 8.8.4.4
可以看到我們的設置已經加上了,然后再ping一個域名,當時就可以解析了,無需重啟。
以上測試在我這里測試可想行不通,最后還是沒有修改,完全是橋接,DHCP自動獲取的,好在學校內部重啟后IP地址是不變的,所以暫時先這樣了,以后變了再改
10)關閉防火牆 #ufw disable
11)安裝jdk
下載對應版本的JDK,切記X64為64位系統X86_64為64位系統,否則為32位
解壓tar -zxvf jdk1.7.0_79 -C /usr/lib
配置環境變量 #vi /etc/priofile ,添加如下字段
export JAVA_HOME=/usr/lib/jdk1.7.0_79
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
使改動生效 source /etc/profile
驗證 java-version
12)安裝scala
方法類似於java,上傳scala2.10.4包,解壓,#tar -zxvf scala-2.10.4.tgz -C /usr/lib/scala
到/etc/profile里配置路徑:
export SCALA_HOME=/usr/lib/scala/scala-2.10.4
export PATH=$PATH:${SCALA_HOME}/bin
輸入如下命令使得配置生效#source /etc/profile
驗證 #scala -version
13)克隆該樣本機,克隆出4個備份,然后分別配置每個機器的主機名與IP地址。
改玩后自行測試看每個機器是否正確
14)設置ssh免密碼連接(注意公鑰匯總的命名)
這里參考http://www.cnblogs.com/shishanyuan/p/4701510.html
15)下載hadoop-2.6.0_x64.tar.gz包 ,將該包解壓到/app/hadoop/文件夾下,並在切換到#cd /app/hadoop/hadoop-2.6.0/,創建三個文件夾#mkdir tmp #mkdir name #mkdir data
16)接下來要配置hadoop環境變量
首先切換到 #cd /app/hadoop/hadoop-2.6.0/etc/hadoop,打開如下文件#vi hadoop-env.sh,加入如下路徑:
export JAVA_HOME=/usr/lib/ivm/jdk1.7.0_79
export PATH=$PATH:/app/hadoop/hadoop-2.6.0/bin
配置好后輸入# source hadoop-env.sh使得配置生效,接下來#hadoop version測試是否配置成功。
17)配置yarn-env.sh
在/app/hadoop/hadoop-2.6.0/etc/hadoop打開配置文件yarn-env.sh
#cd /app/hadoop/hadoop-2.6.0/etc/hadoop
#sudo vi yarn-env.sh
加入配置內容,設置JAVA_HOME路徑
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_79
使用source yarn-env.sh使之生效
18)配置core-site.xml
<configuration> <property> <name>fs.default.name</name> <value>hdfs://spark1:9000</value> </property> <property> <name>fs.defaultFS</name> <value>hdfs://spark1:9000</value> </property> <property> <name>io.file.buffer.size</name> <value>131072</value> </property> <property> <name>hadoop.tmp.dir</name> <value>file:/app/hadoop/hadoop-2.6.0/tmp</value> <description>Abase for other temporary directories.</description> </property> <property> <name>hadoop.proxyuser.hduser.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.hduser.groups</name> <value>*</value> </property> </configuration>
19)配置hdfs-site.xml
<configuration> <property> <name>dfs.namenode.secondary.http-address</name> <value>spark1:9001</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/app/hadoop/hadoop-2.6.0/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/app/hadoop/hadoop-2.6.0/data</value> </property> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> </configuration>
20)配置mapred-site.xml,一般情況下,只有一個mapred-site.xml.template ,# cp mapred-site.xml.template mapred-site.xml復制出來一份即可:
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>spark1:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>spark1:19888</value> </property> </configuration>
21)配置yarn-site.xml
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>spark1:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>spark1:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>spark1:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>spark1:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>spark1:8088</value> </property> </configuration>
22)配置slaves
#vi slaves
在slaves里加入:
spark1
spark2
spark3
spark4
23)用scp分別向各個節點分發配置好的hadoop
在個個slave里建立對應的文件目錄 /app/hadoop/, spark1切換到/app/hadoop目錄下
# scp hadoop-2.6.0 root@spark2:/app/hadoop
# scp hadoop-2.6.0 root@spark3:/app/hadoop
# scp hadoop-2.6.0 root@spark4:/app/hadoop
24)格式化namenode
#cd /app/hadoop/hadoop-2.6.0
#hadoop namenode -format
25)啟動hdfs
$cd /app/hadoop/hadoop-2.6.0/sbin
$./start-dfs.sh
啟動hdfs時候,報如下錯誤:Error: Cannot find configuration directory: /etc/hadoop,則應該在 /etc/profile里加入如下配置:
#hadoop
export HADOOP_HOME=/app/hadoop/hadoop-2.6.0
export YARN_HOME=/app/hadoop/hadoop-2.6.0
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
並且#source etc/profile 使得其生效
若slave中部分datanode沒啟動,則#./stop-all.sh,然后刪除所有節點中的tmp,name,data三個文件夾,重新建立新的空文件夾
格式化namenode #hadoop namenode -format,現在啟動應該正常了!
26)驗證hdfs是否成功啟動
#jps ,此時在spark1上面運行的進程有:NameNode、SecondaryNameNode和DataNode

spark2-spark4上運行的有DataNode

25)啟動yarn
#cd /app/hadoop/hadoop-2.6.0/sbin
#./start-yarn.sh
此時在spark1上的進程有:NameNode、SecondaryNameNode、DataNode、NodeManager和ResourceManager

spark2-spark4上的進程有:DataNode NodeManager
至此,hadoop安裝已經完成!!!接下來就是spark的安裝!
27)跑一下hadoop附帶的例子來測試是否安裝成功,下面以wordcount為例。
28)首先到spark官網下載hadoop2.6對應的安裝包,spark1.5.0-bin-hadoop2.6.tgz,上傳到/ooon,解壓縮# tar -zxvf spark1.5.0-bin-hadoop2.6.tgz -C /app/hadoop,切換到spark主目錄,#cd /app/hadoop/spark-1.5.0-bin-hadoop-2.6.0
29)配置spark的環境變量, 打開配置文件/etc/profile, 定義SPARK_HOME並把spark路徑加入到PATH參數中
SPARK_HOME=/app/hadoop/spark-1.5.0
PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
30)配置conf/spark-env.sh
# conf/
#cp spark-env.sh.template spark-env.sh
#vi spark-env.sh
在最后介入如下內容:
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_79
export SPARK_MASTER_IP=spark1 (注意這里有個坑,若是你的IDE環境搭建在spark1以外的機器上,這里最好直接寫成spark1的IP172.21.75.100,血淚史)
export SPARK_MASTER_PORT=7077
export SPARK_WORKER_CORES=1
export SPARK_WORKER_INSTANCES=1
export SPARK_WORKER_MEMORY=1g
source spark-env.sh使得配置生效。
31)配置slaves,如下

32)scp分發到各個節點
#cd /app/hadoop
#scp -r spark-1.5.0-bin-hadoop-2.6.0 root@spark2:/app/hadoop
#scp -r spark-1.5.0-bin-hadoop-2.6.0 root@spark3:/app/hadoop
#scp -r spark-1.5.0-bin-hadoop-2.6.0 root@spark3:/app/hadoop
接下來啟動spark
#cd sbin
#./start-all.sh
spark1的進程有:

spark2-spark4的進程有:

現在spark也裝好了!!!
33)在瀏覽器中輸入地址172.21.75.102:8080,可以看到集群的狀態

34)驗證客戶端連接
進入hadoop1節點,進入spark的bin目錄,使用spark-shell連接集群
$cd /app/hadoop/spark-1.1.0/bin
$./spark-shell --master spark://spark1:7077 --executor-memory 500m
在命令中只指定了內存大小並沒有指定核數,所以該客戶端將占用該集群所有核並在每個節點分配500M內存, 下圖可見其分配情況

現在,我們已經通過spark-shell連接到了集群,現在就可以運行一下spark的示例wordcount
35)運行wordcound
首先上傳數據到hdfs,#hadoop fs -mkdir -p /usr/hadoop/testdata
$./spark-shell --master spark://spark1:7077 --executor-memory 512m --driver-memory 500m
接下來在shark-shell里鍵入如下代碼執行wordcount的計算
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)
結果如下:Array[(String, Int)] = Array(("",100), (the,7), (</property>,6), (<property>,6), (under,3), (in,3), (License,3), (this,2), (-->,2), (file.,2))
35)最后需要注意的是學校的IP變化后的處理
除了 /etc/hosts 需要處理外,另外 spark-env.sh 也需要制定spark-master 的IP
source spark-env.sh使得配置生效。
