1. 程式人生 > 實用技巧 >Zeppelin-在flink和spark叢集的安裝

Zeppelin-在flink和spark叢集的安裝

Zeppelin-在flink和spark叢集的安裝

該教程主要面向Zeppelin的入門者。不需要太多的關於 Linux, git, 或其它工具的基礎知識。如果你按照這裡的方法逐項執行,就可以將 Zeppelin 正常執行起來。

安裝Zeppelin為Flink/Spark叢集模式

本教程假定使用者有一個新的機器環境 (物理機或virtual均可, 最小安裝Ubuntu 14.04.3 Server)

注意:虛擬機器的大小至少16GB,以免出現磁碟空間不夠導致安裝失敗。

軟體要求

採用最小安裝, 下面幾個程式需要在安裝Zeppelin、Flink 和 Spark之前安裝:

  • git
  • openssh-server
  • OpenJDK 7
  • Maven 3.1+

安裝 git, openssh-server和 OpenJDK 7 可以使用apt 包管理器來完成。

git

命令列鍵入:

sudo apt-get install git

openssh-server

sudo apt-get install openssh-server

OpenJDK 7

sudo apt-get install openjdk-7-jdk openjdk-7-jre-lib

使用Ubuntu 16.04: 安裝openjdk-7必須加上 repository(Source),如下:

sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-7-jdk openjdk-7-jre-lib

Maven 3.1+

Zeppelin 要求 maven 版本 3.x以上。該版本在系統庫中為 2.x, 因此 maven 需要手動安裝。

首先,清除現存的 maven各個版本:

sudo apt-get purge maven maven2

下載 maven 3.3.9 二進位制軟體:

wget "http://www.us.apache.org/dist/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz"

解壓縮並放到/usr/local目錄:

tar -zxvf apache-maven-3.3.9-bin.tar.gz
sudo mv ./apache-maven-3.3.9 /usr/local

建立一個符號連結,在/usr/bin中:

sudo ln -s /usr/local/apache-maven-3.3.9/bin/mvn /usr/bin/mvn

安裝 Zeppelin

這裡提供一個Zeppelin的原始碼安裝快速步驟,詳細步驟請閱讀Zeppelin Installation Guide

命令列,Clone Zeppelin 原始碼:

git clone https://github.com/apache/zeppelin.git

進入 Zeppelin 根目錄:

cd zeppelin

打包 Zeppelin:

mvn clean package -DskipTests -Pspark-1.6 -Dflink.version=1.1.3 -Pscala-2.10

-DskipTests跳過 build tests。

-Pspark-1.6指定maven採用 Spark 1.6進行構建。因為 Zeppelin有自己的Spark interpreter,版本必須與連線的Spark服務保持一致。

-Dflink.version=1.1.3指定 maven 採用Flink 版本 1.1.3進行構建。

--Pscala-2.10指定 maven 使用 Scala v2.10進行構建。

注意:你可以包含額外的build flags,如:-Ppyspark-Psparkr。詳細的參考:the build section of github for more details.

注意:你可以構建任何在Zeppelin Profile中可用的Spark版本,關鍵是要選擇一致的版本進行構建。

注意:關於build失敗. 安裝過Zeppe超過30次,我可以告訴你,有時候構建失敗找不出原因。在沒有編輯任何程式碼的情況下,可能因為某些原因build就失敗了。很多時候,maven試圖下載時失敗。

如果構建失敗,下面是一些解決方法的提示:

- 檢視 logs.

- 重試 (再次執行mvn clean package -DskipTests -Pspark-1.6)

- 如果下載失敗,等待一些時間後再下載。有時如果 server 不可用,就只能等待。

- 確認你的步驟都是正確的。

- 向社群請求幫助。到here並且加入使用者郵件列表。確保將build output (everything that happened in the console) 的輸出包含在你的訊息中。

啟動Zeppelin服務

bin/zeppelin-daemon.sh start

使用ifconfig來確認 host machine's IP 地址。如果不熟悉, 可以參考here

開啟瀏覽器,本機輸入地址 http://127.0.0.1:8080, 如果不在本機訪問(同一個網段)可以通過命令ifconfig獲得伺服器的IP地址。

檢視Zeppelin tutorial獲取Zeppelin的基本用法。建議你花一些時間檢視一下 Zeppelin 安裝時自帶的notebook例子,可以快速熟悉基本的notebook功能。

Flink 測試

建立一個新的 notebook ,名稱為 "Flink Test",複製下面的程式碼到裡面:

%flink  // let Zeppelin know what interpreter to use.

val text = benv.fromElements("In the time of chimpanzees, I was a monkey",   // some lines of text to analyze
"Butane in my veins and I'm out to cut the junkie",
"With the plastic eyeballs, spray paint the vegetables",
"Dog food stalls with the beefcake pantyhose",
"Kill the headlights and put it in neutral",
"Stock car flamin' with a loser in the cruise control",
"Baby's in Reno with the Vitamin D",
"Got a couple of couches, sleep on the love seat",
"Someone came in sayin' I'm insane to complain",
"About a shotgun wedding and a stain on my shirt",
"Don't believe everything that you breathe",
"You get a parking violation and a maggot on your sleeve",
"So shave your face with some mace in the dark",
"Savin' all your food stamps and burnin' down the trailer park",
"Yo, cut it")

/*  The meat and potatoes:
        this tells Flink to iterate through the elements, in this case strings,
        transform the string to lower case and split the string at white space into individual words
        then finally aggregate the occurrence of each word.

        This creates the count variable which is a list of tuples of the form (word, occurances)

counts.collect().foreach(println(_))  // execute the script and print each element in the counts list

*/
val counts = text.flatMap{ _.toLowerCase.split("\\W+") }.map { (_,1) }.groupBy(0).sum(1)

counts.collect().foreach(println(_))  // execute the script and print each element in the counts list

按Enter+Shift執行,確保 Zeppelin Flink interpreter 工作正確,如果有問題到選單的interpreter進行設定。

Spark 測試

建立一個notebook,名稱為 "Spark Test" ,複製下面的程式碼進去:

%spark // let Zeppelin know what interpreter to use.

val text = sc.parallelize(List("In the time of chimpanzees, I was a monkey",  // some lines of text to analyze
"Butane in my veins and I'm out to cut the junkie",
"With the plastic eyeballs, spray paint the vegetables",
"Dog food stalls with the beefcake pantyhose",
"Kill the headlights and put it in neutral",
"Stock car flamin' with a loser in the cruise control",
"Baby's in Reno with the Vitamin D",
"Got a couple of couches, sleep on the love seat",
"Someone came in sayin' I'm insane to complain",
"About a shotgun wedding and a stain on my shirt",
"Don't believe everything that you breathe",
"You get a parking violation and a maggot on your sleeve",
"So shave your face with some mace in the dark",
"Savin' all your food stamps and burnin' down the trailer park",
"Yo, cut it"))


/*  The meat and potatoes:
        this tells spark to iterate through the elements, in this case strings,
        transform the string to lower case and split the string at white space into individual words
        then finally aggregate the occurrence of each word.

        This creates the count variable which is a list of tuples of the form (word, occurances)
*/
val counts = text.flatMap { _.toLowerCase.split("\\W+") }
                 .map { (_,1) }
                 .reduceByKey(_ + _)

counts.collect().foreach(println(_))  // execute the script and print each element in the counts list

按Enter+Shift執行,確保 Zeppelin Flink interpreter 工作正確,如果有問題到選單的interpreter進行設定。

最後, 停止Zeppelin daemon服務。從系統的命令視窗輸入並回車執行:

bin/zeppelin-daemon.sh stop

安裝叢集

Flink 叢集

現在預編譯程式碼

如果可能,建議您從原始碼進行構建,不僅可以獲得最新的功能,還能瞭解專案的最新進展和程式碼的結構,定製自己特定環境的版本。為了便於演示,這裡直接下載編譯好的版本。

下載使用wget

wget "http://mirror.cogentco.com/pub/apache/flink/flink-1.1.3/flink-1.1.3-bin-hadoop24-scala_2.10.tgz"
tar -xzvf flink-1.1.3-bin-hadoop24-scala_2.10.tgz

將下載 Flink 1.1.3, 與 Hadoop 2.4相容。這個版本不需要安裝 Hadoop ,但如果使用 Hadoop, 將上面的24改為對應的版本。

啟動 Flink 叢集:

flink-1.1.3/bin/start-cluster.sh

從原始碼構建

如果希望從原始碼編譯構建Flink, 下面是快捷指南。 改變構建工具和版本可能帶來不穩定性。例如, Java8 和 Maven 3.0.3 建議用於編譯 Flink, 但是目前不適合用於 Zeppelin 的構建(版本在快速更新中,以後可能就適合了). 檢視Flink Installation guide獲得更多的細節指南。

返回到目錄, 這裡假設是$HOME. 複製 Flink 專案原始碼, 檢出版本 release-1.1.3-rc2, 然後編譯。

cd $HOME
git clone https://github.com/apache/flink.git
cd flink
git checkout release-1.1.3-rc2
mvn clean install -DskipTests

啟動 Flink 叢集,使用 stand-alone 模式:

build-target/bin/start-cluster.sh

確保叢集成功啟動。

在瀏覽器中, 輸入URL地址 http://127.0.0.1:8082 ,可以看到Flink 的Web-UI。在左側導航欄點選 'Task Managers' 。確保至少有一個Task Manager開啟。

如果task managers沒有出現, 重新啟動一下 Flink 叢集,方法如下:

(if binaries)flink-1.1.3/bin/stop-cluster.sh flink-1.1.3/bin/start-cluster.sh

(if built from source)build-target/bin/stop-cluster.sh build-target/bin/start-cluster.sh

Spark 1.6 叢集

下載預編譯軟體包

如果可能,建議從原始碼編譯。這裡為了便於演示,採用直接下載編譯好的軟體包。

下載使用wget

wget "http://d3kbcqa49mib13.cloudfront.net/spark-1.6.3-bin-hadoop2.6.tgz"
tar -xzvf spark-1.6.3-bin-hadoop2.6.tgz
mv spark-1.6.3-bin-hadoop2.6 spark

上面的命令會下載Spark 1.6.3, 與Hadoop 2.6相容。 本安裝包工作時不需要安裝Hadoop,但如果使用 Hadoop, 需要將版本號2.6改變為你的對應版本。

從原始碼編譯

Spark 是一個比較大的專案, 將耗費較長的時間下載和編譯,中間可能會遇到像Flink編譯時同樣的問題而失敗。參考Spark Installation獲得更多的細節的指南。

返回到下載目錄,這裡假設是 $HOME. 複製 Spark原始碼, 檢出分支 branch-1.6, 然後進行build。

注意:這裡檢出 1.6 只是因為這是本文寫作時的 Zeppelin profile 支援的版本。你需要構建對應於Spark的相應版本。如果使用 Spark 2.0, 下面的例子 word count 需要修改為Spark 2.0 相容。

cd $HOME

Clone, check out, 以及 build Spark 1.6.x,指令碼命令如下:

git clone https://github.com/apache/spark.git
cd spark
git checkout branch-1.6
mvn clean package -DskipTests

啟動 Spark叢集

返回到$HOME目錄.

cd $HOME

啟動Spark 叢集,使用stand-alone 模式。如果不使用預設埠8080,通過 webui-port 引數制定服務埠 (Zeppelin的webui-port服務埠)。

spark/sbin/start-master.sh --webui-port 8082

注意:為什麼使用--webui-port 8082? 這個是題外話,在後面再去解釋。

開啟瀏覽器,導航到 http://yourip:8082 確保 Spark master 已經執行,顯示資訊如下。

頁面上方顯示URL地址: spark://yourhost:7077, 這是Spark Master訪問的URI, 在後續的操作中將會用到。

使用這個URI啟動一個Spark的slave節點:

spark/sbin/start-slave.sh spark://yourhostname:7077

返回 Zeppelin daemon啟動的主目錄:

cd $HOME

zeppelin/bin/zeppelin-daemon.sh start

配置 Interpreters

開啟瀏覽器,導航到 Zeppelin 的web-ui,地址為:http://yourip:8080.

回到 Zeppelin web-ui ( http://yourip:8080),點選右上方的anonymous將開啟下拉選單, 選擇Interpreters進入直譯器的配置頁面。

在 Spark 一節, 右上方點選 edit 按鈕(鉛筆圖示)。 然後,編輯 Spark 的 master 域。 從local[*]改為上面的URI,上面的是spark://ubuntu:7077

點選Save(儲存)更新引數, 然後在詢問是否需要重啟interpreter時點選OK。

現在滾動頁面到 Flink 一節。點選edit按鈕,將host的值從local改為localhost. 點選Save儲存。

重新開啟 examples ,然後重新執行。 (螢幕上方點選 play 按鈕,或者在每一paragraph點選play按鈕來執行,或者按Enter+Shift組合鍵)。

你可以去檢查 Flink 和 Spark 的webui介面 (譬如上面的 http://yourip:8081, http://yourip:8082, http://yourip:8083),可以看到任務在叢集上執行。

題外話-關於服務的埠

為什麼要用 'something like', 而不是精確的 web-ui 埠呢?因為這依賴於你啟動時的設定。Flink 和 Spark 將預設啟動web-ui 在埠8080, 如果被佔用就尋找下一個可用的埠。

因為 Zeppelin 第一個啟動,預設將佔用埠 8080。當 Flink 啟動時, 將試圖使用埠 8080, 如果不可用,則使用下一個,如 8081。Spark 的 webui介面分為 master 和 slave, 啟動時將試圖繫結埠 8080,但該埠已經被Zeppelin佔用), 然後將使用8081 (但已被 Flink的 webui佔用), 然後使用 8082。

如果一切完全如上述執行, webui的埠將會是 8081 和 8082。但是,如果運行了其他程式或者啟動過程由其它的叢集管理程式控制,情況可能就與預期的不同,尤其是在啟動大量節點的情況下。

可以通過啟動引數來指定webui服務繫結的埠 (在啟動 Flink 和 Spark時,在命令列加上引數--webui-port <port>,這裡<port>為webui使用的埠。 也可以在配置檔案中指定埠,具體方法參考官方網站文件,這裡不再贅述。