Hadoop視覺化與互動式工具:Zeppelin和Hue

天府雲創發表於2017-04-20

Hadoop視覺化與互動式工具:Zeppelin和Hue

前言

目前Aliyun E-MapReduce支援了Appache Zeppelin和Hue,在Aliyun E-MapReduce叢集上可以很方便的使用zeppelin和hue。

Apache Zeppelin是一個提供了web版的類似ipython的notebook,用於做資料分析和視覺化。背後可以接入不同的資料處理引擎,包括spark, hive, tajo等,原生支援scala, java, shell, markdown等。它的整體展現和使用形式和Databricks Cloud是一樣的,就是來自於當時的demo。

Hue是一個開源的Apache Hadoop UI系統,最早是由Cloudera Desktop演化而來,由Cloudera貢獻給開源社群,它是基於Python Web框架Django實現的。通過使用Hue我們可以在瀏覽器端的Web控制檯上與Hadoop叢集進行互動來分析處理資料,例如操作HDFS上的資料,執行MapReduce Job等等。

準備工作

建立叢集

建立叢集的時候選擇E-MapReduce支援zeppelin和hue主版本。目前E-MapReduce支援Zeppelin和Hue的主版本為1.3.0。建立叢集的時候記得設定開啟公網ip。


打通ssh無密登入並建立一個SSH隧道

叢集建立完成之後,需要建立一個ssh隧道來訪問叢集的8888和8080埠。詳細步驟參考:https://help.aliyun.com/document_detail/28187.html

這裡以mac環境為例,使用chrome瀏覽器實現埠轉發(假設叢集master節點公網ip為xx.xx.xx.xx):

  • a). 登入到master節點

ssh r***@xx.xx.xx.xx
輸入密碼
  • b). 檢視本機的id_rsa.pub內容(注意在本機執行,不要在遠端的master節點上執行)

cat ~/.ssh/id_rsa.pub
  • c). 將本機的id_rsa.pub內容寫入到遠端master節點的~/.ssh/authorized_keys中(在遠端master節點上執行)

mkdir ~/.ssh/
vim ~/.ssh/authorized_keys
然後將步驟b)中看到的內容貼上進來

現在應該可以直接使用ssh r***@xx.xx.xx.xx免密登入master節點了。

  • d). 在本機執行以下命令進行埠轉發

ssh -i ~/.ssh/id_rsa -ND 8157 r***@xx.xx.xx.xx
  • e). 啟動chrome(在本機新開terminal執行)

/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --proxy-server="socks5://localhost:8157" --host-resolver-rules="MAP * 0.0.0.0 , EXCLUDE localhost" --user-data-dir=/tmp
  • f). 在新開啟的chrome中訪問Zeppelin和Hue

zeppelin: xx.xx.xx.xx:8080
hue: xx.xx.xx.xx:8888

操作步驟和示例

Zepplein

在chrome中訪問xx.xx.xx.xx:8080,首先建立一個新的noteboook


一個簡單的zeppelin示例

  • 支援markdown語法

%md
## Welcome to Aliyun E-MapReduce. This is a Zeppelin sample.
##### This is a live tutorial, you can run the code yourself. (Shift-Enter to Run)


  • 原生支援scala。使用scala進行load資料

import org.apache.commons.io.IOUtils
import java.net.URL
import java.nio.charset.Charset

// Zeppelin creates and injects sc (SparkContext) and sqlContext (HiveContext or SqlContext)
// So you don't need create them manually

// load bank data
val bankText = sc.parallelize(
    IOUtils.toString(
        new URL("http://emr-sample-projects.oss-cn-hangzhou.aliyuncs.com/bank.csv"),
        Charset.forName("utf8")).split("\n"))

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
        )
).toDF()
bank.registerTempTable("bank")


  • 使用spark sql查詢和展示結果

%sql 
select age, count(1) value
from bank 
where age < 30 
group by age 
order by age


%sql 
select age, count(1) value 
from bank 
where age < ${maxAge=30} 
group by age 
order by age


%sql 
select age, count(1) value 
from bank 
where marital="${marital=single,single|divorced|married}" 
group by age 
order by age


zeppelin 執行shell示例

%sh
cd /tmp
wget http://emr-sample-projects.oss-cn-hangzhou.aliyuncs.com/bank.csv
ls -la
rm bank.csv
ls -la
su -l hadoop -c "hadoop dfs -ls /"

zeppelin上執行hive sql示例

  • Download Spending Dataset into HDFS

%sh
#remove existing copies of dataset from HDFS
su -l hadoop -c "hadoop fs -rm  /tmp/expenses.csv"

#fetch the dataset
wget http://emr-sample-projects.oss-cn-hangzhou.aliyuncs.com/healthexpenditurebyareaandsource.csv -O /tmp/expenses.csv

#remove header
sed -i '1d' /tmp/expenses.csv
#remove empty fields
sed -i "s/,,,,,//g" /tmp/expenses.csv
sed -i '/^\s*$/d' /tmp/expenses.csv

#put data into HDFS
su -l hadoop -c "hadoop fs -put /tmp/expenses.csv /tmp"
su -l hadoop -c "hadoop fs -ls -h /tmp/expenses.csv"
rm /tmp/expenses.csv
%hive
drop table if exists `health_table`
  • Create Hive table

%hive
CREATE TABLE `health_table` (
`year` string ,
`state` string ,
`category` string ,
`funding_src1` string, 
`funding_src2` string,
`spending` int)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TextFile
  • Load dataset into Hive table

%hive
load data 
inpath '/tmp/expenses.csv'
into table health_table
  • Grant permissions

%hive
select count(*) from  health_table
  • Spending (In Billions) By State

%hive
select state, sum(spending)/1000 SpendinginBillions
from health_table 
group by state
order by SpendinginBillions desc
  • Spending (In Billions) By Year

%hive
select year,sum(spending)/1000 SpendinginBillions 
from health_table 
group by year 
order by SpendinginBillions
  • Spending (In Billions) By Category

%hive
select category, sum(spending)/1000 SpendinginBillions from health_table 
group by category 
order by SpendinginBillions desc

zeppelin notebook json配置

zeppelin的每個notebook都是可以儲存、匯入和匯出的。上面的三個示例,可以通過下載json配置直接匯入。


zeppelin插圖

zeppelin中的插圖,都可以進行復制和儲存:


Hue

通過xx.xx.xx.xx:8888訪問Hue。第一次登陸hue的時候,需要設定一個管理員賬戶和密碼。請慎重設定和保管你的Hue管理員賬戶和密碼資訊。

Hive Editor

通過Hive Editor可以進行hive sql的編寫和互動式執行。在左邊欄DATABASE中會展示當前的資料庫和表資訊。


Metastore Manager

通過Metastore Manager可以檢視和管理hive表,可以視覺化建立表。


File Browser

通過File Browser可以檢視和管理到hdfs上的檔案。


示例程式碼

這裡展示一個通過hue metastore介面從檔案建表的過程,並通過Hive Editor對錶中的資料做查詢和展示的例子。

首先,下載資料檔案到master節點,並且將該檔案放入hdfs的/tmp目錄下。可以ssh到master節點上操作,也可以直接使用zepplein的shell notebook。

有三種方式可以實現將資料檔案放在hdfs的/tmp目錄下:

  • 直接ssh登入到master節點上:

ssh r***@xx.xx.xx.xx

cd /tmp
wget http://emr-sample-projects.oss-cn-hangzhou.aliyuncs.com/us_map.csv
su -l hadoop -c "hadoop fs -put /tmp/us_map.csv /tmp/us_map.csv"
su -l hadoop -c "hadoop fs -ls -h /tmp/us_map.csv"
  •  這直接使用zeppelin的shell notebook操作:

%sh
cd /tmp
wget http://emr-sample-projects.oss-cn-hangzhou.aliyuncs.com/us_map.csv
%sh
su -l hadoop -c "hadoop fs -put /tmp/us_map.csv /tmp/us_map.csv"
%sh
su -l hadoop -c "hadoop fs -ls -h /tmp/us_map.csv"
  • 通過Hue的file browser上傳


通過hue的Metastore manager建立表。



然後一路next直到最後create table完成建表。重新整理Query Editor介面在左側的DATABASE導航欄可以看到新建的表。在Hive Editor中執行

select * from us_map


宣告

歡迎轉載,關注大資料技術研究社群。

相關文章