如何自定義編譯zeppelin 的parcels 與CDH 集成
標籤(空格分隔): 大數據運維專欄
- 一:關於zeppelin介紹
- 二:如何自定義CDH 的 parcels 與 csd 的jar 包
- 三:zeppelin 與CDH的集成
- 四:關於zeppelin 的測試
一:關於zepplin的介紹
Apache Zeppelin 是一個讓交互式數據分析變得可行的基於網頁的開源框架。Zeppelin提供了數據分析、數據可視化等功能。
Zeppelin 是一個提供交互數據分析且基於Web的筆記本。方便你做出可數據驅動的、可交互且可協作的精美文檔,並且支持多種語言,包括 Scala(使用 Apache Spark)、Python(Apache Spark)、SparkSQL、 Hive、 Markdown、Shell等等。
Zeppelin 功能:
數據提取
數據發掘
數據分析
數據可視化展示以及合作
二:如何自定義CDH 的 parcels 與 csd 的jar 包
2.1 編譯環境準備
建議使用國外雲主機 ,flyfish 這邊用的是香港的雲主機
系統: ubuntu 16.0.4x64
jdk: jdk1.8.0_261
maven: apache-maven-3.6.3
jdk 與maven 安裝目錄:/software
環境變量配置:
vim /etc/profile
----
# jdk
export JAVA_HOME=/software/jdk1.8.0_261
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
# maven
export MAVEN_HOME=/software/apache-maven-3.6.3
PATH=$PATH:$HOME/bin:$MAVEN_HOME/bin
----
java -version
maven -version
2.2 下載 打包 livy 與 zeppelin 的parcels 打包軟件
編譯步驟如下:
1. 下載Livy和Zeppelin源碼並編譯
2. 生成Livy和Zeppelin的Parcel包
3. 下載編譯Cloudera提供的cm_ext工具,用於校驗parcel及生成manifest.json文件
4. 生成Livy和Zeppelin的csd文件,用於CM對Livy和Zeppelin服務的識別
下載 打包 源
cd /software
git clone https://github.com/alexjbush/livy_zeppelin_cdh_csd_parcels.git
flyfish 這裏已經下載好了
然後修改打包源的build.sh
cd /software/livy_zeppelin_cdh_csd_parcels
vim build.sh
---
主要修改的是上面 包的路徑:
CM_EXT_BRANCH=cm5-5.15.0
LIVY_URL=http://apache.mirror.anlx.net/incubator/livy/0.7.0-incubating/apache-livy-0.7.0-incubating-bin.zip
LIVY_MD5="2c5b63757414af16da308e63749e1ae6"
LIVY_VERSION=0.7.0
ZEPPELIN_URL=http://apache.mirror.anlx.net/zeppelin/zeppelin-0.8.2/zeppelin-0.8.2-bin-all.tgz
ZEPPELIN_MD5="e9d2cd60f6900eb6435b780a1292106e"
ZEPPELIN_VERSION=0.8.2
---
切記 因爲包 的 版本 不同 md5 碼 也不同
執行編譯 生成parcels 包
chmod +x build.sh
./build.sh parcel
打出parcels 放在:ZEPPELIN-0.8.2_build 下面
cd ZEPPELIN-0.8.2_build
manifest.json ZEPPELIN-0.8.2-el7.parcel 文件
LIVY 放在:
cd LIVY-0.7.0_build
LIVY-0.7.0-el7.parcel manifest.json
生成 csd 的jar 包
cd /software/livy_zeppelin_cdh_csd_parcels
./build.sh csd
生成 jar 包
ls -ld *.jar
mkdir zepplin-parcels
mv ZEPPELIN.jar zeppelin-parcels
mv ZEPPELIN-0.8.2_build/* zeppelin-parcels
mv LIVY-0.7.0.jar livy-parcels/
cd LIVY-0.7.0_build/
mv * ../livy-parcels/
tar -zcvf zeppelin-parcels.tar.gz zeppelin-parcels
tar -zcvf livy-parcels.tar.gz livy-parcels
然後把 zeppelin-parcels.tar.gz livy-parcels.tar.gz 這兩個包 下載下來 拿去 和 CDH 集成
三:zeppelin 與CDH的集成
cd /var/www/html/
mkdir livy zeppelin
上傳zeppelin-parcels.tar.gz 這個包 到 /var/www/html/zeppelin 下面
上傳livy-parcels.tar.gz 這個包到 /var/www/html/livy 下面
解壓 zeppelin-parcels.tar.gz 然後 將 manifest.json ZEPPELIN-0.8.2-el7.parcel ZEPPELIN-0.8.2.jar
這三個文件 移動 到 /var/www/html/zeppelin 下面
同樣將 livy-parcels.tar.gz 這個包 解壓 將 LIVY-0.7.0-el7.parcel LIVY-0.7.0.jar manifest.json 這三個文件 移動到 /var/www/html/livy 下面
cd /var/www/html/livy
mv LIVY-0.7.0.jar /opt/cloudera/csd/
cd /var/www/html/zeppelin
mv mv ZEPPELIN-0.8.2.jar /opt/cloudera/csd/
chown cloudera-scm:cloudera-scm /opt/cloudera/csd -R
service cloudera-scm-server restart
去CDH 上面 配置 parcels 目錄
http://192.168.11.37/livy
http://192.168.11.37/zeppelin
下載 ---》 分配---》 激活
從新啓動CM 加載擴展 jar 包
添加livy 與zeppelin 服務
添加livy 服務依賴
遇到問題:
Error found before invoking supervisord: 'getpwnam(): name not found: livy'
解決辦法:
解決辦法:
在Livy REST Server所在服務器上增加livy用戶及用戶組
groupadd livy
useradd livy -g livy
chown livy:livy /var/log/livy
在HDFS的core-site.xml 中添加一下配置:
<property>
<name>hadoop.proxyuser.livy.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.livy.hosts</name>
<value>*</value>
</property>
添加完之後從新啓動HDFS
添加zeppelin 服務
在主機 節點 上創建 zepplin 的用戶和組
在 Zeppelin Server 服務所在的節點添加 zeppelin 用戶和角色:
groupadd zeppelin
useradd zeppelin -g zeppelin
mkdir -p /var/log/zeppelin
chown zeppelin:zeppelin /var/log/zeppelin
報錯:
由於錯誤 java.lang.IllegalArgumentException: The variable [${zeppelin_java_options}] does not have a corresponding value.,角色啓動失敗。
解決:
ZEPPELIN --> 配置 --> 搜索 zeppelin_java_options --> 添加參數 -Xms1024m --> 重啓ZEPPELIN 服務
報錯:
mkdir: `file:///var/local/zeppelin/conf': Input/output error
解決辦法:
ZEPPELIN --> 配置 --> 搜索 dir --> 修改配置 --> 重啓ZEPPELIN 服務
hdfs dfs -mkdir -p /var/local/zeppelin/conf
hdfs dfs -mkdir -p /var/local/zeppelin/data/notebook
hdfs dfs -chmod 777 /var/local/zeppelin/conf
hdfs dfs -chmod 777 /var/local/zeppelin/data/notebook
因爲flyfish這邊的 8080 端口 被佔用了,改一下 zeppelin的端口 爲 8081
然後 改一下 zeppelin的 服務端 地址,然後從新啓動zeppelin 服務
打開web:
http://192.168.11.37:8081
四: 關於zeppelin 的測試
測試實例一:
上傳測試數據
vim test.txt
---
hadoop hive
spark zeppelin
hadoop spark
---
hdfs dfs -put test.txt /tmp
運行spark 測試程序
%spark
val textFile = spark.read.textFile("/tmp/test.txt")
textFile.count()
textFile.first()
輸出結果
livy 的查詢spark REST接口
測試實例二:
Data Refine
下載需要bank數據,http://archive.ics.uci.edu/ml/machine-learning-databases/00222/bank.zip
首先,將csv格式數據轉成Bank對象RDD,並過濾表頭列
上傳到主節點:
unzip bank.zip
hdfs dfs -mkdir /tmp/test
hdfs dfs -put bank-full.csv bank.csv bank-names.txt /tmp/test
創建一個spark的notebook
val bankText = sc.textFile("/tmp/test/bank-full.csv")
case class Bank(age:Integer, job:String, marital : String, education : String, balance : Integer)
val bank = bankText.map(s=>s.split(";")).filter(s=>s(0)!="\"age\"").map(
s=>Bank(s(0).toInt,
s(1).replaceAll("\"", ""),
s(2).replaceAll("\"", ""),
s(3).replaceAll("\"", ""),
s(5).replaceAll("\"", "").toInt
)
)
// Below line works only in spark 1.3.0.
// For spark 1.1.x and spark 1.2.x,
// use bank.registerTempTable("bank") instead.
bank.toDF().registerTempTable("bank")
執行以下語句,可看到年齡的分佈:
%sql select age, count(1) from bank where age < 30 group by age order by age
根據婚姻狀況選項,查看年齡分佈狀況:
%sql select age, count(1) from bank where marital="${marital=single,single|divorced|married}" group by age order by age
spark job 的分佈
使用zeppelin 的配置 hive 連接
create Interpreters
artifact的骨架配置
/opt/cloudera/parcels/CDH/jars/hive-jdbc-2.1.1-cdh6.3.2.jar
/opt/cloudera/parcels/CDH/jars/hive-service-rpc-2.1.1-cdh6.3.2.jar
/opt/cloudera/parcels/CDH/jars/hive-cli-2.1.1-cdh6.3.2.jar
/opt/cloudera/parcels/CDH/jars/hive-service-2.1.1-cdh6.3.2.jar
/opt/cloudera/parcels/CDH/jars/hive-common-2.1.1-cdh6.3.2.jar
/opt/cloudera/parcels/CDH/jars/hive-serde-2.1.1-cdh6.3.2.jar
保存退出: