在Hadoop集羣的基礎上搭建Sparkhtml
1、環境準備java
在搭建Spark環境以前必須搭建Hadoop平臺,儘管之前的一些博客上說在單機的環境下使用本地FS不用搭建Hadoop集羣,但是在新版spark的安裝之中,咱們必須肯定SPARK_DIST_CLASSPATH這個環境變量的值,而這個值偏偏就是Hadoop目錄中的classpath,由於這個緣由,我在搭建的過程當中吃了不少的苦,但願你們引覺得戒。如今讓咱們準備一下安裝spark的實驗環境:web
筆者安裝得出的結論:shell
使用 Ubuntu16.04.4+(openjdk8/jdk1.8.x)+(scala2.11.x)+hadoop2.9.0+(spark2.3.0/spark2.2.1) 成功安裝並能夠運行;
2、開始安裝
對於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集羣。apache
2.一、安裝Scalabash
首先咱們從官網下載相應的最高支持版本,在這裏筆者下載的是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中,咱們加入以下內容:ssh
export SCALA_HOME=/home/grid/scala export PATH=$PATH:$SCALA_HOME/bin
更新使環境變量生效:分佈式
source ~/.bashrc
而後咱們能夠測試一下,注意到下圖出現了cat找不到文件或目錄,這就是使用openjdk8的弊端,因此建議你們最好使用jdk1.8版本。ide
scala
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在單機上的運行水平。
3、使用基本的spark命令
下面的內容大部分來自於官網,你們能夠看一下,由於官網會根據不一樣的版原本變化,我如今的內容或者在您看的時候已經改變了不少。
3.一、建立數據集
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
// First item in this Dataset
在spark-shell運行的過程當中,咱們也能夠從網址http://h1:4040來查看運行的狀況!
3.二、Spark SQL, DataFrames and Datasets Guide
4、搭建徹底分佈式的spark系統
在上面的示例中咱們其實並無用到hdfs,換句話說,咱們並無實現分佈式的spark架構,下面讓咱們繼續進行配置完成分佈式內存計算平臺的搭建。
4.一、繼續修改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.二、修改slaves文件
在這裏首先咱們將slaves.template複製爲slaves,能夠保留原來的文件,或者直接重命名。而後加入從節點(worker)
h2 h3
4.三、向其餘節點複製並運行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來訪問咱們的頁面:
5、總結
關於spark的功能和各個模塊,還有不少不少,咱們能夠參考官網的例子來嘗試和學習,回想一下本身學習的方法確實有一些須要改進的,就好比說學習一個新知識,新東西,我習慣於從已有的別人的總結去找,而不習慣從官網上去查找,這一點是很是差的學習習慣,除此以外,我對於一些知識仍是有一些遺忘和生疏的部分,對於Linux命令的掌握仍是須要更加深入和深刻才行。同時也但願個人筆記可以幫助到有着一樣需求的人!