讓Spark如虎添翼的Zeppelin - 基礎篇
0. 簡介
Spark 是一個非常好的計算平臺,支持多種語言,同時基于內存的計算速度也非常快。整個開源社區也很活躍。
但是Spark在易用性上面還是有一些美中不足。 對于剛接觸的人來說,上手以及環境搭建還是有一些困難。 另外,如果希望將結果繪制成圖表分享給別人,還需要很長一段路程。
目前已經有一些解決方案:
- 【TBD】Jupyter Notebook
- 使用很廣泛,但是看起來主要還是以前ipython-notebook的增強版。
- 目前筆者對其了解不多
- Spark 母公司DataBricks提供的DataBricks Community Edition, 里面自帶Spark集群 + Notebook。
- 易用性、功能性都很不錯。缺點是集群架設在AWS之上,無法跟自己本地的Spark 集群連在一起
- Apache Zeppelin
- 這是一個剛剛從Incubation轉正的項目
- 但是已經在各大公司均有采用,比如美團、微軟等等
- 本文主要就是介紹如何在本地搭建一個Zeppelin 使得Spark更易用,同時可以很方便的將自己的工作成功展示給客戶
借用別人的一個效果圖鎮樓^_^
注意:
- Zeppelin自帶Spark實例,您無需自己構建一個Spark 集群就可以學習Zeppelin
- Zeppelin 當前(2016年8月19日) 最新版本0.6.1, 只兼容2.0+
- 如果您本地有Spark 集群并且版本是1.6.1 + Scala 2.10 , 請下載Zeppelin 0.6.0的版本
- 如果官網的速度比較慢,可以參考下面的方式到百度盤下載
- 鏈接: http://pan.baidu.com/s/1ctBBJo 密碼: e68g
1、 下載
如果您需要的是0.6.0的版本,可以參考上面百度盤的下載鏈接。
如果您需要的是0.6.1+的版本,可以直接到官網下載, 里面的Mirror下載速度一般還不錯
2、 安裝
版本: Zeppelin 0.6.0 + 自建Spark集群(1.6.1)
感覺Zeppelin還是不太成熟,并開箱就用,還需要不少人工調整才能正常工作
- 解壓之后,首先需要從模板創建一個新的zeppelin-env.sh, 并設置SPARK_HOME. 比如:
exportSPARK_HOME=/usr/lib/spark
如果是基于Hadoop 或者 Mesos 搭建的Spark 集群,還需要進行另外的設置。 - 從模板創建一個新的zeppelin-site.xml,并將之前的8080端口改到比如8089,避免與Tomcat等端口沖突
<property>
<name>zeppelin.server.port</name>
<value> 8089 </value>
<description>Server port.</description>
</property>
- 替換jackson相關類庫
- 默認自帶的是2.5.*, 但是實際使用的時候指定的是2.4.4
- 并且可能2.4.4 與 2.5.* 并不完全兼容。
- 因此需要使用2.4.4 替換2.5.* , 有下面3個jar需要替換:
- jackson-annotations-2.4.4.jar
- jackson-core-2.4.4.jar
- jackson-databind-2.4.4.jar
- 這真的是非常坑人的一個地方。。。
做完上訴幾步之后,就可以啟動啦:
啟動/停止命令: bin/zeppelin-daemon.sh stop/start
啟動之后,打開http://localhost:8089 就可以看到Zeppelin的主界面啦
3. 配置Spark解釋器
Spark Interpreter的配置非常簡單,可以直接參考下圖的配置方式:
4. 幾點使用經驗
Zeppline自帶比較詳細的Tutorial, 各位看自帶的notebook tutorial 可能效果更好。 但是我在第一次使用的時候,遇到了不少坑,在此記錄下來,給大家做個參考:
(1) 任務提交之后不會自動停止
當Zeppelin 提交任務之后,可以看到Spark Master UI 上面,當前任務即使執行完成了,也不會自動退掉
這是因為,Zeppelin 默認就像人手工運行了spark-shell spark://master-ip:7077 一樣, 除非手動關閉shell命令,否則會一直占用著資源
解決辦法就是將spark 解釋器(interpreter) 重啟
手動的重啟辦法:
- 打開Interpreter界面,搜索到Spark部分并點擊重啟
- 推薦: 調用Restful API 進行重啟。
- 可以通過Chrome的Network 監控看一下點擊restart之后具體調用的API的情況。如下圖:
- 這個ID(2BUDQXH2R)在各自的環境可能各不相同。另外這個API是PUT的方式,可以直接使用下面的python代碼在UI上自動重啟
%python importrequests r = requests.put("http://IP:8089/api/interpreter/setting/restart/2BUDQXH2R") print r.text
- 可以通過Chrome的Network 監控看一下點擊restart之后具體調用的API的情況。如下圖:
(2) 異常提示:Cannot call methods on a stopped SparkContext
比如我們在Spark Master UI 上面將當前job kill 之后,在Zeppelin這邊重啟執行任務就會遇到這個異常信息。
解決辦法很簡單: 重啟解析器
(3) 不要主動調用 sc.stop()
這是官方明確說明的:scala 的spark-shell 自動初始化了SparkContext / SqlContext 等等
不能自己調用sc.stop() 之后重啟創建一個SparkContext
可能筆者水平原因,嘗試自己創建新的sc 之后,各種奇奇怪怪的問題
(4) 關于python module
Python Interpreter可以使用當前Zeppelin所在機器的python 所有的model
同時支持python 2 與 python 3
這是一個很有用的功能,比如我使用spark將數據計算完成之后,生成了一個并不太大的csv文件。這個時候完全可以使用Pandas強大的處理能力來進行二次處理,并最終使用Zeppelin的自動繪圖能力生成報表
與Tableau之類的BI工具相比功能差了一些,不過各有所長。Zeppelin 對程序員來說可以算是非常方便的一個工具了。 對日常的一些簡單報表的工作量大大減小了
(5) 可以設置自動運行時間
在整個Note的最上端,可以設置當前notebook 定期執行。 而且注意: 還可以設置執行完成之后自動重啟interpreter 參考下圖:
X. 使用Zeppelin Hub 實現協作共贏
官方網址: http://help.zeppelinhub.com/
這一部分將在下一篇文章之中介紹。敬請期待
來自:http://www.flyml.net/2016/08/19/reinforce-spark-with-zeppelin-basic/