最近要弄點資料分析的實驗,看同事用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遠端登入用
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)
結果如下