用Ambari跟Zeppelin來玩Apache Spark

最近要弄點資料分析的實驗,看同事用Zeppelin在開發一些hive或是spark的腳本
稍微撇了一下Zeppelin的介紹還挺好玩的,這次從無到有弄出一個hadoop yarn cluster跟Zeppelin環境來玩spark順便對安裝方法做個筆記

Zeppelin

官方網站:https://zeppelin.incubator.apache.org/

這玩意有點像是ipython notebook的spark版,具備spark notebook的功能,可以很簡單的用spark等環境互動
而它不止可以跟Spark,還能整合sh, hive, sql等環境進行互動操作

整體用法是蠻簡單的,只要用%符號就能宣告現在note的環境,我最欣賞的是這套軟體可以整合hive等輕易的做出互動式報表
如下我hive query打上去在用環境內建的符號宣告變數,就會跑出對應的欄位跟報表

跟Spark做整合來拉圖表,從Hive拉資料出來資後做些處理放到環境裡面製作圖表

val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
val data = sqlContext.sql("select dt,sum(total) from my_source where dt>'20151020' and dt<'20151110' group by dt")
            .collect()
            .map(row => (row(0).asInstanceOf[String],
                         row(1).asInstanceOf[Double]))
            .toList
//建立一個暫存table存放跟total跟平均差
case class MyData(dt: String, total:Double, diff: Double)
var rdd = sc.parallelize(data.map(_._2))
val summaryStats = rdd.stats()
var mydata = data.map(s => MyData(s._1, s._2, math.abs(s._2 - summaryStats.mean)))
mydata.toDF().registerTempTable("mydata") //在環境裡登記table名字叫mysql

Spark處理完之後就能用sql模式把資料做出簡單的圖表出來


搭建Hadoop YARN的的平台

先弄三台或者以上的CentOS 7的環境出來,個人是用VM,這部分就不廢話了
有三個VM資訊如下

- host name, host domain, OS
- server1, server1.com, centos 7.1
- server2, server2.com, centos 7.1
- server3, server3.com, centos 7.1

server name跟server domain從/etc/hosts裏面適當的設定一下即可

> 備註:我的VM的已經有事先裝好基本的lib,若安裝途中出現錯誤的話,就依照錯誤訊息安裝缺少的套件跟設定

環境準備好之後,我選擇用Ambari去搭出想要的Hadoop ecosystem,像是HDFS, Hive, Spark, Kafka等等等

開始前先簡單介紹一下Ambari這東西,他是Hortonworks家出的Hadoop相關專案的管理系統,用Ambari可以簡單的從無到有搭建出Hadoop Cluster,然後包含Hive, Spark等熱門專案.同時還可以設定並監控各Hadoop相關的服務

官方網站:https://ambari.apache.org/

Step1:編輯/etc/hosts

這一步是方便之後建立cluster的時候ssh遠端登入用

/etc/hosts
xxx.xxx.xxx.xxx server1.com, server1
xxx.xxx.xxx.xxx server2.com, server2
xxx.xxx.xxx.xxx server3.com, server3
Step2:去各server埋ssh key

讓Ambari可以登入各server安裝hadoop cluster
埋key的user要有sudo的權限,這裡用sudouser當作範例

[sudouser@server1]$ ssh-keygen -t rsa -b 2048 -N '' #key作成


#server2 跟server3將server1的sudouser下~/.ssh/id_rsa.pub的內容複製到其他server的.ssh/authorized_keys

mkdir .ssh
vim .ssh/authorized_keys
chmod 700 .ssh
chmod 600 .ssh/authorized_keys
 
#測試從server1登入到其他server

[sudouser@server1]$ ssh sudouser@server2
[sudouser@server1]$ ssh sudouser@server3
Step3:安裝Ambari
[sudouser@server1]$ cd /etc/yum.repos.d/
[sudouser@server1]$ sudo wget http://public-repo-1.hortonworks.com/ambari/centos7/2.x/updates/2.1.2/ambari.repo
[sudouser@server1]$ sudo yum install ambari-server
[sudouser@server1]$ sudo su -
[root@server1]$ ambari-server setup
...... # 全部都用預設值就行了
Ambari Server 'setup' completed successfully. #安裝成功

#啟動ambari
# 增加一行 client.api.port=8080或是其他適合的port
[root@server1]$ vim /etc/ambari-server/conf/ambari.properties 
[root@server1]$ ambari-server start  #start server
...
Ambari Server 'start' completed successfully. #啟動成功
Step4: 從ambari去安裝Hadoop, HDFS YARN, Hive, Pig, Spark, Kafka, 等等

登入http://server1.com:8080
user/passwd都是admin

選擇“Launch Install Wizard”開始安裝

取個適當的cluster name 並選擇最新版HDP


紅匡的部分填上server群組跟埋key的private key還有該key的user

如果可以正常登入應該會看到全部server都是綠棒棒

接下來就選擇想安裝的apache家族啦,經驗上有需要的才安裝就好,儘量選擇最小安裝,不然有時候安裝上出現各種問題要處理也很麻煩,最基本的Hadoop家族安裝就好,這邊我手賤多按了幾個套件,後面解問題花了不少時間,像是那個knox

接下來是各服務的config,全部都可以在Ambari做設定,安裝之前要先把紅字的部分消除掉,其實我只需要hadoop跟hive還有spark,其他不需要的後都選擇不安裝繞過了

config基本上不需要特別調整,預設的應該就夠用了,有需要帳號密碼設定的適當設定上去就好
比較麻煩的hive可能需要pam的設定,沒有特別需求就如下簡單帶過吧

開始安裝

安裝過程如果因為要自帶MySQL出現缺少mysql套件安裝不過的訊息可以參考下面這網址
http://www.kakiro-web.com/linux/mysql-yum-repository-install.html

安裝成功後有些服務要用手動的方式帶起來,看到紅燈就手動把它的服務打開

成功之後就會看到各服務的狀態,happy

Step5: 安裝zeppelin

Ambari安裝完後其他服務可以用其他方式裝進去,包含一些預設沒有的服務
除了zeppelin之外最近紅的Apache Hifi還是Apache flink都找的到安裝包
這邊介紹zeppelin的安裝方式,安裝方式直接參考下方網址
https://github.com/hortonworks-gallery/ambari-zeppelin-service

#下載zeppelin到Ambari
[sudouser@server1]$ VERSION=`hdp-select status hadoop-client | sed 's/hadoop-client - \([0-9]\.[0-9]\).*/\1/'`
[sudouser@server1]$ sudo git clone https://github.com/hortonworks-gallery/ambari-zeppelin-service.git   /var/lib/ambari-server/resources/stacks/HDP/$VERSION/services/ZEPPELIN

#重開ambari
[sudouser@server1]$ sudo su -
[root@server1]$ ambari-server restart

從開好之後從左邊最下面"Actions"選單"Add Service"

多了zeppelin的選項可以選,選擇之後一直Next就行了

安裝成功,接下來就可以玩Spark啦

2016/02/01 追記

現有版本zeppelin預設無法使用R,後來研究了一下R with zeppelin的裝法,這邊做個記錄
参考:
http://www.r-bloggers.com/interactive-data-science-with-r-in-apache-zeppelin-notebook/
https://github.com/elbamos/Zeppelin-With-R/tree/rinterpreter
https://github.com/datalayer/zeppelin-R

環境

  • CentOS
  • Maven 3.1.1+
  • R 3.1+
  • Java 1.8+
  • Git
  • Node.js Package Manager (npm, bower)

安裝R相關套件

$ sudo yum install libcurl-devel
$ sudo yum install R
$ sudo vim /etc/bashrc #setup R_LIB

 
...
export R_LIBS=/usr/lib64/R/library

$ source /etc/bashrc
$ sudo R #enter R command line

 
R> install.packages("evaluate")
R> install.packages("knitr")
R> install.packages("devtools")
R> library(devtools)
R> devtools::install_github("IRkernel/repr")
R> install.packages("htmltools")
R> install.packages("base64enc")
R> install.packages("opencpu")

編譯R版本Zeppelin

$ sudo yum install java-1.8.0-openjdk.x86_64
$ sudo yum install java-1.8.0-openjdk-devel.x86_64
$ sudo /usr/sbin/alternatives  --config java   # change java version to 1.8

$ sudo vim /etc/bashrc # setup JAVA_HOME

 
...
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.71-1.b15.el6_7.x86_64
$ source /etc/bashrc
 
#nodejs env. setup

$ sudo yum install npm
$ sudo npm install bower -g
 
#compile and start zeppelin

$ wget http://ftp.meisei-u.ac.jp/mirror/apache/dist/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
$ tar -zxvf apache-maven-3.3.9-bin.tar.gz
$ sudo ln -s /home1/sudouser/apache-maven-3.3.9/bin/mvn /usr/bin/mvn
$ git clone -b rinterpreter https://github.com/elbamos/Zeppelin-With-R.git
$ git config --global url.https://github.com/.insteadOf git://github.com/  #setup protocol for using https to avoid NAT policy

$ cd Zeppelin-With-R/
$ mvn package install -DskipTests -pl '!flink,!ignite,!phoenix,!postgresql,!tajo,!hive,!cassandra,!lens,!kylin'
 
#download spark for client api

$ cd ~/
$ wget http://archive.apache.org/dist/spark/spark-1.5.0/spark-1.5.0-bin-hadoop2.6.tgz
$ tar -zxvf spark-1.5.0-bin-hadoop2.6.tgz
 
#適當的設定port跟SPARK_HOME

$ cd Zeppelin-With-R
$ cp conf/zeppelin-env.sh.template  conf/zeppelin-env.sh
$ cp conf/zeppelin-site.xml.template conf/zeppelin-site.xml
$ vim conf/zeppelin-env.sh
 
...
SPARK_HOME=/home1/sudouser/spark-1.5.0-bin-hadoop2.6
export SPARK_HOME
 
$ vim conf/zeppelin-site.xml
$ sudo bin/zeppelin-daemon.sh start

啟動之後可以用下面的程式碼在zeppelin上測試sparkR會不會動

%spark.r
library(knitr)
data(faithful)
df <- createDataFrame(sqlContext, faithful)
registerTempTable(df, 'faith')
ed <- sql(sqlContext, 'SELECT * FROM faith')
SparkR:::head(ed)

結果如下

comments powered by Disqus