在Hadoop集群的基礎上搭建Spark
一、環境准備
在搭建Spark環境之前必須搭建Hadoop平台,盡管以前的一些博客上說在單機的環境下使用本地FS不用搭建Hadoop集群,可是在新版spark的安裝之中,我們必須確定SPARK_DIST_CLASSPATH這個環境變量的值,而這個值恰恰就是Hadoop目錄中的classpath,因為這個原因,我在搭建的過程中吃了很多的苦,希望大家引以為戒。現在讓我們准備一下安裝spark的實驗環境:
- Ubuntu Kylin16.04.4
- 安裝java環境,在我的測試中最好使用jdk1.8及其以上的,或者openjdk8及其以上的,便於Scala安裝;
- 安裝ssh,無論單機還是集群,都最好安裝;
- 搭建Hadoop集群,單機/偽分布式也可以;
- 安裝Scala,我安裝的是,要注意最新的版本不支持hadoop的最新版本,必須清楚;
- 安裝spark3.0最新版本;
筆者安裝得出的結論:
使用 Ubuntu16.04.4+(openjdk8/jdk1.8.x)+(scala2.11.x)+hadoop2.9.0+(spark2.3.0/spark2.2.1) 成功安裝並可以運行;
二、開始安裝
對於Hadoop集群的安裝,大家可以查看我的《在Ubuntu Kylin15.04中配置Hadoop單機/偽分布式系統經驗分享》和《手把手教你使用VirtualBox搭建含有三個虛擬節點的Hadoop集群》,其中有着詳細的步驟和方法,建議最好直接就使用Ubuntu Kylin16.04.4,這樣我們的版本就很同步了,其次,我的實驗環境大部分都是最新環境或者次新環境,對於大家有着更好的借鑒意義,比如在這里我的JAVA版本使用的是JDK1.8或者openjdk-8-jdk,openjdk-8-jre,關於這兩者的安裝過程,大家可以查看我之前的博文,或者查看《》獲得JDK1.8的安裝過程;對於Hadoop集群,我用的是Hadoop2.9.0,已經是穩定版中的最新版了;對於Scala我使用的scala-2.11.12.tgz ,是僅次於最新版的版本,因為spark3.0只支持到這個版本,所以,我們不能使用scala的最新版本。這里假定我們已經安裝了java,ssh,hadoop集群。
2.1、安裝Scala
首先我們從官網下載相應的最高支持版本,在這里筆者下載的是Scala2.11.12,隨着發展肯定會有更高的支持版本,讀者注意使用。下載之后,我們看是解壓,配置環境變量,然后使用。大家注意這里的一句話,那就是我們必須使用java 8及其以上版本的!
cd ~/Downloads ls #注意,這里解壓的目錄視情況而定,如果讀者是新創建了一個用戶,只供本用戶使用,那么我建議存放在下面的目錄,否則可以存放在/usr/local目錄下! sudo tar -zxvf ./scala-2.11.12.tgz -C /home/grid/ #重命名 sudo mv ../scala-2.11.12 ../scala #修改權限 sudo chown -R grid:hadoop ../scala
#修改環境變量
sudo gedit ~/.bashrc
在.bashrc中,我們加入如下內容:
export SCALA_HOME=/home/grid/scala export PATH=$PATH:$SCALA_HOME/bin
更新使環境變量生效:
source ~/.bashrc
然后我們可以測試一下,注意到下圖出現了cat找不到文件或目錄,這就是使用openjdk8的弊端,所以建議大家最好使用jdk1.8版本。
scala
2.2、安裝Spark
之后我們安裝Spark,在這里有幾個版本我們都可以用,比如說我嘗試過spark-2.3.0-bin-without-hadoop.tgz和spark-2.2.1-bin-without-hadoop.tgz,在我們上面的配置中都沒有問題。大家要學會查看官網上面的安裝配置,比如spark2.3.0,里面就明確說過這一句話:
Spark runs on Java 8+, Python 2.7+/3.4+ and R 3.1+. For the Scala API, Spark 2.3.0 uses Scala 2.11.
You will need to use a compatible Scala version (2.11.x).
Note that support for Java 7, Python 2.6 and old Hadoop versions before 2.6.5 were removed as of Spark 2.2.0.
Support for Scala 2.10 was removed as of 2.3.0.
如果我們沒有看到這句話,沒有使用java 8+或者Scala2.11.x,那么失敗是不可避免的,就算是安裝成功了,在使用某個特殊的功能的時候還是會出現問題的。官網永遠都是最值得我們去看的一手資料,有的內容適合於當時的版本,但是在新的版本中已經發生了質變,各種命名和習慣都不一樣了,這個時候我們就不能按照原來的博客上說的來了,這點真的很重要,在下面我們也可以看到。
在這里,我們下載最新版本的spark-2.3.0-bin-without-hadoop.tgz,對於hadoop集群的任何版本都適合,這樣我們就不用去糾結是不是版本不兼容的問題了,然后同樣的我們需要解壓,命名,修改權限,最后修改環境變量。
cd ~/Downloads
sudo tar -zxvf spark-2.3.0-bin-without-hadoop.tgz -C /home/grid/
sudo mv ../spark-2.3.0-bin-without-hadoop ../spark
sudo chown -R grid:hadoop ../spark
sudo gedit ~/.bashrc
在環境變量中加入:
export SPARK_HOME=/home/grid/spark export PATH=$PATH:$SPARK_HOME/bin
然后修改使得環境變量生效:
source ~/.bashrc
有的教程中到了這一步就萬事大吉了,直接去睡覺了,我真的很奇怪為什么有那么多不認真的人呢,因為這個原因,讓我花了幾乎一下午的時間去尋找原因,最終竟然發現是因為還沒有配置完成而一直出現如下的報錯,這個錯誤讓我郁悶的吐血呀,網上很少有關於這個錯誤的解釋的,就算是有也是詞不達意,別的地方出現的,沒辦法,我開始想是不是因為我安裝的是openjdk8而產生的?於是我卸載了這個版本,又下載了jdk1.8.x,結果問題依舊出現,再加上我的多次修改使得整個系統變得亂七八糟,后來我在想是不是因為我安裝的spark2.3.0版本太高了,官方沒有發現這個問題?結果我降低為2.2.1問題依舊出現,然后我在想是不是因為Scala和jdk的版本不匹配,為此我特意查了一下scala的官網,官網上明確指出需要jdk1.8及其以上的,我也是這樣做的呀,百思不得其解,在網上找資料,還是沒辦法解決,當時的那種崩潰感真的是讓人難以忍受呀,我們的時間都是寶貴的,所以我希望那些寫博客的人至少要保持着對廣大的看眾負責的態度來寫文章吧,不然的話就不要發表了,因為這真的是在浪費大家的時間同時也是在顯示自己的弱智!好了,我就不再吐糟了,繼續寫下去,最終我在一個網站上發現了后續的安裝步驟,總算是告別了這種困擾,根本就不是版本的問題。
最重要的配置,繼續配置環境變量:
接下來我們需要配置spark安裝目錄下的環境變量,在環境變量中和hadoop進行庫文件的關聯!
cd ~/spark/conf sudo mv spark-env.sh.template spark-env.sh sudo gedit spark-env.sh
在文件的結尾我們添加:
export SPARK_DIST_CLASSPATH=$(/home/grid/hadoop/bin/hadoop classpath)
然后我們在任意目錄執行spark-shell看一下:
此時,我們的spark才算搭建完成,當然了我們還可以有更多的配置,比如說我們在剛剛的文件spark-env.sh中,我們還可以加入很多的描述信息和控制信息,在conf目錄下還有很多的模板,我們都可以重命名之后拿來使用,這樣我們的集群就更加有生命力了。在這里我們暫時不討論spark和hadoop結合來運行程序,先讓我們看一下spark在單機上的運行水平。
三、使用基本的spark命令
下面的內容大部分來自於官網,大家可以看一下,因為官網會根據不同的版本來變化,我現在的內容或者在您看的時候已經改變了很多。
3.1、創建數據集
Datasets can be created from Hadoop InputFormats (such as HDFS files) or by transforming other Datasets.
Let’s make a new Dataset from the text of the README file in the Spark source directory。
在這里我們不從hdfs上讀取,而是直接從本地文件系統中讀取,因此需要使用file協議。
val textFile = spark.read.textFile("file://home/grid/spark/README.md")// Number of items in this Dataset
textFile.count()
textFile.first() // First item in this Dataset
在spark-shell運行的過程中,我們也可以從網址http://h1:4040來查看運行的情況!
3.2、Spark SQL, DataFrames and Datasets Guide
四、搭建完全分布式的spark系統
在上面的示例中我們其實並沒有用到hdfs,換句話說,我們並沒有實現分布式的spark架構,下面讓我們繼續進行配置完成分布式內存計算平台的搭建。
4.1、繼續修改spark-env.sh文件
在該文件中,我們加入本機(主節點)的IP(主機名),然后配置一下web頁面顯示的端口,因為spark默認的是8080,可能被其他的程序占用,比如這里我們隨意設定一個端口12345。
export SPARK_DIST_CLASSPATH=$(/home/grid/hadoop/bin/hadoop classpath) export STANDALONE_SPARK_MASTER_HOST=h1 export SPARK_MASTER_IP=$STANDALONE_SPARK_MASTER_HOST export SPARK_MASTER_WEBUI_PORT=12345
4.2、修改slaves文件
在這里首先我們將slaves.template復制為slaves,可以保留原來的文件,或者直接重命名。然后加入從節點(worker)
h2 h3
4.3、向其他節點復制並運行spark
保存之后,我們將這些文件復制到其他節點,使用scp命令,並且我們需要在其他節點的~/.bashrc中加入scala和spark的全局變量,這樣我們的系統搭建算是告一段落了。
scp -r ~/scala grid@h2:/home/grid/ scp -r ~/spark grid@h2:/home/grid/ scp -r ~/scala grid@h3:/home/grid/ scp -r ~/spark grid@h3:/home/grid/
之后我們在主節點的spark目錄下的sbin目錄中使用如下命令來運行master和worker,注意在hdfs中我們就有start-all.sh,在這里我們作為區分直接使用:
./start-all.sh
jps一下:
我們還可以使用h1:12345來訪問我們的頁面:
五、總結
關於spark的功能和各個模塊,還有很多很多,我們可以參考官網的例子來嘗試和學習,回想一下自己學習的方法確實有一些需要改進的,就比如說學習一個新知識,新東西,我習慣於從已有的別人的總結去找,而不習慣從官網上去查找,這一點是非常差的學習習慣,除此之外,我對於一些知識還是有一些遺忘和生疏的部分,對於Linux命令的掌握還是需要更加深刻和深入才行。同時也希望我的筆記能夠幫助到有着同樣需求的人!