因爲最近學習大數據開發,spark做爲分佈式內存計算框架,當前十分火熱,所以做爲首選學習技術之一。Spark官方提供了三種集羣部署方案: Standalone, Mesos, Yarn。其中 Standalone 爲spark自己提供的集羣模式,搭建過程能夠參考官網,本文介紹Spark on Yarn集羣部署過程。使用3臺普通機器搭建Spark集羣,html
軟件環境:java
Ubuntu 16.04 LTSnode
Ubuntu 16.04 LTSlinux
CentOS7web
Scala-2.10.6apache
Hadoop-2.7.2ubuntu
spark-1.6.1-bin-hadoop2.6vim
Java-1.8.0_77centos
硬件環境:瀏覽器
一個Master節點
Intel® Core™ i5-2310 CPU @ 2.90GHz × 4
4G內存
300G硬盤
兩個Slave節點
Intel® Core™ i3-2100 CPU @ 3.10GHz × 4
4G內存
500G硬盤
本文下載安裝的軟件都放在 home 目錄下。
1. 主機hosts文件配置
在每臺主機上修改host文件
sudo vim /etc/hosts
218.199.92.227 fang-ubuntu1(Master)
218.199.92.226 fang-centos(Slave)
218.199.92.225 fang-Lenovo(Slave)
127.0.0.1 localhost
127.0.1.1 localhost
注:若此地未配置,或者未配置正確會致使集羣啓動不正常或者失敗(nodemanager did not stop gracefully after 5 seconds )
配置以後ping一下各機器名稱檢查是否生效,例如ssh fang@fang-centos。
2. 配置SSH 免密碼登陸
若是沒有安裝ssh,須要安裝Openssh server,命令爲sudo apt-get install openssh-server。
1) 在全部機器上都生成私鑰和公鑰
ssh-keygen -t rsa #一路回車
2) 須要讓機器間都能相互訪問,就把每一個機子上的id_rsa.pub發給master節點,傳輸公鑰能夠用scp來傳輸。
scp ~/.ssh/id_rsa.pub fang@fang-ubuntu1:~/.ssh/id_rsa.pub.slave1
3) 在master上,將全部公鑰加到用於認證的公鑰文件authorized_keys中
cat ~/.ssh/id_rsa.pub* >> ~/.ssh/authorized_keys
4) 將公鑰文件authorized_keys分發給每臺slave
scp ~/.ssh/authorized_keys fang@fang-centos:~/.ssh/
或者 ssh-copy-id -i ~/.ssh/id_rsa.pub t@slave2 分發公鑰(注意:目的ip後面不須要加具體路徑!)
5) 在每臺機子上驗證SSH無密碼登陸
在終端中輸入登陸命令,例如:ssh fang@fang-centos 若是直接登陸成功而不須要登陸密碼,則表示設置正確;若是登陸不成功,即仍然須要登陸密碼,則可能須要修改文件authorized_keys的權限。
注:.ssh 文件夾的權限必須爲700,authorized_keys文件權限必須爲600
使用以下命令改變文件夾權限:chmod 600 ~/.ssh/authorized_keys
四、設置文件和目錄權限:
設置authorized_keys權限
$ chmod 600 authorized_keys
設置.ssh目錄權限
$ chmod 700 -R .ssh
要保證.ssh和authorized_keys都只有用戶本身有寫權限。不然驗證無效。(今天就是遇到這個問題,找了很久問題所在),其實仔細想一想,這樣作是爲了避免會出現系統漏洞。
從官網下載最新版 Java,Spark官方說明 Java 只要是6以上的版本均可以,本文使用的是 jdk-8u91-linux-x64.tar.gz。
在下載目錄下直接解壓tar -zcvf jdk-8u91-linux-x64.tar.gz並複製文件到/usr/lib/jvm中,命令以下:
sudo cp -r jdk1.8.0_77 /usr/lib/jvm(若是沒有jvm文件夾,則手動建立一個),修改環境變量sudo vim /etc/profile,添加下列內容:
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_77
export JRE_HOME=$JAVA_HOME/jre
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
而後使環境變量生效,並驗證 Java 是否安裝成功
$ source /etc/profile #生效環境變量
$ java -version #若是打印出以下版本信息,則說明安裝成功
Spark官方要求 Scala 版本爲 2.10.x,注意不要下錯版本,我這裏下了 2.10.6一樣咱們在~/中解壓
tar -zcvf scala-2.10.6.tar.gz
再次修改環境變量sudo vim /etc/profile,添加如下內容:
export SCALA_HOME=/home/fang/scala-2.10.6
export PATH=$PATH:$SCALA_HOME/bin
一樣的方法使環境變量生效,並驗證 scala 是否安裝成功
$ source /etc/profile #生效環境變量
$ scala -version #若是打印出以下版本信息,則說明安裝成功。
從官網下載 hadoop2.7.2版本,在用戶根目錄解壓tar -zcvf hadoop-2.7.2.tar.gz
再次修改環境變量sudo vim /etc/profile,添加如下內容:
export HADOOP_HOME=/home/fang/hadoop-2.7.2
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export YARN_HOME=/home/fang/hadoop-2.7.2
export YARN_CONF_DIR=${YARN_HOME}/etc/hadoop
一樣的方法使環境變量生效
$ source /etc/profile #生效環境變量
注:有時候修改了/etc/profile文件,執行命令source以後仍是不能達到正常的效果,則須要從新機器,看問題是否能解決。
配置 Hadoop,cd ~/hadoop-2.7.2/etc/hadoop進入hadoop配置目錄,須要配置有如下7個文件:hadoop-env.sh,yarn-env.sh,slaves,core-site.xml,hdfs-site.xml,maprd-site.xml,yarn-site.xml。
在hadoop-env.sh中配置JAVA_HOME
# The java implementation to use.
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_77
在yarn-env.sh中配置JAVA_HOME
# some Java parameters
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_77
在slaves中配置slave節點的ip或者host,
fang-centos
fang-Lenovo
修改core-site.xml
fs.defaultFS:hadoop namenode地址
dfs.replication:副本數量
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://fang-ubuntu1:9000/</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/fang//hadoop-2.7.2/tmp</value>
</property>
</configuration>
修改hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>fang-ubuntu1:9001</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/fang/hadoop-2.7.2/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/fang/hadoop-2.7.2/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
</configuration>
修改mapred-site.xml
mapred 運行在yarn上
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
修改yarn-site.xml
yarn集羣配置
<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>fang-ubuntu1:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>fang-ubuntu1:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>fang-ubuntu1:8035</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>fang-ubuntu1:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>fang-ubuntu1:8088</value>
</property>
</configuration>
將配置好的hadoop-2.7.2文件夾分發給全部slaves節點
scp -r ~/hadoop-2.6.0 fang@fang-centos:~/
啓動 Hadoop
在 master節點上執行如下操做,就能夠啓動 hadoop 了。
cd ~/hadoop-2.7.2 #進入hadoop目錄
bin/hadoop namenode -format #格式化namenode
注:若格式化以後從新修改了配置文件,從新格式化以前須要刪除tmp,dfs,logs文件夾。
sbin/start-dfs.sh #啓動dfs 查看namenode:http://ip:50070/
sbin/start-yarn.sh #啓動yarn
驗證 Hadoop 是否安裝成功,能夠經過jps命令查看各個節點啓動的進程是否正常。
在 master 上應該有如下幾個進程:
在每一個slave上應該有如下幾個進程:
在瀏覽器中輸入 http://fang-ubuntu1:8088 ,能夠看到hadoop 的管理界面。
下載解壓,進入官方下載地址下載最新版 Spark。我下載的是 spark-1.6.1-bin-hadoop2.6.tar.gz。
在~/目錄下解壓,tar -zcvf spark-1.6.1-bin-hadoop2.6.tar.gz
配置 Spark
cd ~spark-1.6.1-bin-hadoop2.6/conf #進入spark配置目錄
cp spark-env.sh.template spark-env.sh #從配置模板複製
vim spark-env.sh #添加配置內容
在spark-env.sh末尾添加如下內容(這是個人配置,你能夠自行修改):
export SPARK_HOME=/home/fang/spark-1.6.1-bin-hadoop2.6
export SCALA_HOME=/home/fang/scala-2.10.6
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_77
export HADOOP_HOME=/home/fang/hadoop-2.7.2
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
:$HADOOP_HOME/sbin:$SCALA_HOME/bin
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$YARN_HOME/etc/hadoop
export SPARK_MASTER_IP=218.199.92.227
SPARK_LOCAL_DIRS=/home/fang/spark-1.6.1-bin-hadoop2.6
SPARK_DRIVER_MEMORY=1G
export SPARK_LIBARY_PATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
:$HADOOP_HOME/lib/native
注:在設置Worker進程的CPU個數和內存大小,要注意機器的實際硬件條件,若是配置的超過當前Worker節點的硬件條件,Worker進程會啓動失敗。
vim slaves在slaves文件下填上slave主機名:
slave1
slave2
將配置好的spark-1.6.1-bin-hadoop2.6文件夾分發給全部slaves吧
scp -r ~/spark-1.6.1-bin-hadoop2.6 fang@fang-cenos:~/
啓動Spark ,sbin/start-all.sh
驗證 Spark 是否安裝成功
主節點上啓動了Master進程:
在 slave 上啓動了Worker進程:
進入Spark的Web管理頁面:http://fang-ubuntu1:8080
本例以集羣模式運行SparkPi實例程序(deploy-mode 設置爲cluster)
./bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --driver-memory 1G --executor-memory 1G --executor-cores 1 lib/spark-examples-1.6.1-hadoop2.6.0.jar 40
任務提交時web界面
做業運行完成web界面
注意 Spark on YARN 支持兩種運行模式,分別爲yarn-cluster和yarn-client,yarn-cluster適用於生產環境;而yarn-client適用於交互和調試,由於能在客戶端終端看到程序輸出。客戶端模式實例和上面集羣模式運行過程相似,在此不在贅述。
部署結束後,提交spark工程,提示使用內置hadoop
「The pre-built 32-bit i386-Linux native hadoop library is available as part of the hadoop distribution and is located in the lib/native directory」
需本地從新編譯
從新checkout source code
svn checkout http://svn.apache.org/repos/asf/hadoop/common/tags/release-2.1.0-beta/
加上編譯native的選項,編譯時會根據當前的操做系統架構來生產相應的native庫
mvn package -Pdist,native -DskipTests -Dtar
再去native文件下查看全部的file type,已經都是64位版的了,替換線上文件,WARNING消除
代碼測試:
word count
1,先上傳一個文本文件
hadoop fs -put ./derby.log file
2,確認上傳成功?從hdfs下載文件
t@ubuntu:~/source/spark$ hadoop fs -get hdfs://192.168.1.166:9000/user/t/file derby.log
hdoop uri相關
hadoop hdfs uri詳解 1、hdfs基本命令: hadoop fs -cmd <args> 選項: cmd: 具體的操做,基本上與UNIX的命令行相同 args: 參數 2、hdfs資源uri格式: 用法:scheme://authority/path 選項: scheme–>協議名,file或hdfs authority–>namenode主機名 path–>路徑 範例:hdfs://localhost:54310/user/hadoop/test.txt 假設已經在/home/hadoop/hadoop-1.1.1/conf/core-site.xml裏配置了fs.default.name=hdfs://localhost:54310,則僅使用/user/hadoop/test.txt便可。hdfs默認工做目錄爲/user/$USER,$USER是當前的登陸用戶名。 3、hdfs命令範例 hadoop fs -mkdir /user/hadoop hadoop fs -ls /user hadoop fs -lsr /user(遞歸的) hadoop fs -put test.txt /user/hadoop(複製到hdfs://localhost:54310/user/hadoop目錄下,首先要建立當前目錄) hadoop fs -get /user/hadoop/test.txt .(複製test.txt文件到本地當前目錄下) hadoop fs -cat /user/hadoop/test.txt hadoop fs -tail /user/hadoop/test.txt(查看最後1000字節) hadoop fs -rm /user/hadoop/test.txt hadoop fs -help ls(查看ls命令的幫助文檔)