มาลองทำ Big Data Visualization โดยใช้ Apache Zeppelin กับ Helium Plugin กัน!!!

Pop Phiphat
4 min readJun 22, 2018

--

Photo : Fantasy Landscape Duvar Kağıtları

ก่อนอื่นเราก็ต้องมาทำความรู้จักกับ Apache Zeppelin กับ Helium ว่ามันคืออะไร?

Zeppelin มันคือ Web-based notebook (คล้ายๆ กับ Jupyter Notebook) ส่วนใหญ่ที่ผมใช้อยู่ก็จะเป็นการเขียนพวก SparkSQL, Scala, PySpark เพื่อ process big data ที่อยู่บน Spark Cluster โดย zeppelin จะมี built-in charts มาให้เราอยู่แล้ว 4 แบบคือ Pie Chart, Bar Chart, Area Chart และ Line Chart สามารถดูรายละเอียดเพิ่มเติมได้ที่ https://zeppelin.apache.org/

Source : https://zeppelin.apache.org/

ส่วน Helium เป็น Framework ที่ใช้สำหรับ load/unload JavaScript packages พวก Chart ต่างๆ บน Zeppelin ใช้ทำ data visualization จากผลลัพธ์ที่เราได้จากการประมวลผลบน Spark นั่นเอง

Helium เพิ่งจะมีเพิ่มขึ้นมาใน Zeppelin version 0.7 ซึ่งใน version 0.7 นั้นเรายังไม่สามารถจะ load Helium package โดยตรงจาก NPM ได้ ดังนั้นใน story นี้ผมจะใช้ Zeppelin 0.9.0-SNAPSHOT แต่เนื่องจาก version นี้ยังไม่มี Binary package ที่พร้อมใช้ เราก็เลยต้อง build จาก source ขึ้นมาซึ่งก็ไม่ได้ยากเย็นแต่อย่างไร

โดยอันดับแรกก็ใช้ git clone repository ของ zeppelin มาไว้บน edge node ของเราซะก่อน เสร็จแล้วก็ build packages ใช้คำสั่ง

mvn clean package –DskipTests

หลังจากที่ build เสร็จ เราก็ทำการ start service ของ zeppelin กันเลย

./zeppelin-daemon.sh start

พอมัน start ได้แล้ว เราก็จะเห็น menu ของ Helium ขึ้นมา ให้เราเข้าไป enable package ที่เราอยากจะใช้ได้เลยครับ

Helium menu

มาทำกราฟแรกกันเลย

ผมจะทดลองสร้างกราฟโดยใช้ข้อมูลจาก website box office mojo ตาม link ด้านล่าง โดยดึงข้อมูลจาก tag table แล้วเอามาใส่ไว้ใน hive table

http://www.boxofficemojo.com/franchises/chart/?id=marvelcomics.htm

หลังจากใส่ข้อมูลลง hive table แล้วเราก็ใช้ Spark SQL query ขึ้นมาดูว่าข้อมูลของเรามีหน้าตาเป็นยังไงบ้าง จากที่ดูก็จะมีชื่อเรื่อง ค่ายหนัง รายได้รวม จำนวนโรงหนัง รายได้ Opening Weekend วันที่ออกฉายวันแรก ตามข้อมูลด้านล่าง

ใช้ Spark SQL เพื่อดูว่ารายรวมและรายได้ Opening Weekend ของหนัง Marvel

%sql
select
sum(Gross) as Gross,
sum(Opening) as Opening_Weekend,
sum(Gross)-sum(Opening) as After_opening,
to_date(from_unixtime(unix_timestamp(Date , 'MM/dd/yyyy'))) as Opening_date
from default.boxoffice_mavel
group by to_date(from_unixtime(unix_timestamp(Date , 'MM/dd/yyyy')))

การสร้าง chart นี้ผมจะใช้ ultimate area chart โดยเลือก column ที่จะมาแสดงใน Chartในแกน Y เราสามารถเลือกใช้ Aggregate function พวก min, max, sum, count และ avg ได้ด้วย แต่ผมต้องการที่จะดูรายได้รวมๆ ก็เลยเลือกใช้เป็น sum ตามรูป

ผลลัพธ์ที่ได้

เราสามารถปรับแต่ง Parameters ต่างๆ ของ chart ได้ด้วย เช่น Title , Sub-title, ชื่อแกน X แกน Y , ความหนาของเส้น, ความโปร่งใสของสี เป็นต้น

อีก chart นึงลองใช้ ultimate column chart เพื่อแสดงผลรายได้ของหนัง Marvel ช่วง Opening Weekend

%sql
select
title,
Opening,
Cast(Gross as INT)-CAST(Opening as INT) as AfterOpening,
to_date(from_unixtime(unix_timestamp(Date , 'MM/dd/yyyy'))) as Opening_date,
LPAD(row_number() over ( ORDER BY cast(Opening as INT) desc),3,'#') as rank
from default.boxoffice_mavel

อ่านกราฟแล้วได้ผลคือ รายได้ของหนัง Avengers : Infinity War ช่วงเวลา Opening Weekend มาเป็นอันดับ1 เลย อันดับ2 ก็ Avengers ภาคแรก ตามมาด้วยอันดับ3 เป็น Black Panther แต่รายได้รวมทั้งหมด ตอนนี้ Black Panther มาเป็นอันดับ1

หลังจากทำ 2 Charts นี้เสร็จก็ ลองทำเป็น Dashboard ซะเลย อันดับแรกก็ตั้งชื่อ dashboard ของเรา โดยผมจะใช้ Markdown ตั้ง Heading เป็น H1

%md
# Marvel Movies Box Office Stats Dashboard

ต่อไปก็ทำ filter โดยผมจะอยากจะดูข้อมูลรายได้ของหนัง เป็นช่วงเวลาที่กำหนดโดย user ซึ่งมีค่า default ของ start date เป็น 1986–08–01 และ end date เป็น 2018–04–27

val S_Date =  z.input("Start_date", "1986-08-01")
val E_Date = z.input("End_date", "2018-04-27")
z.put("Start_date", S_Date)
z.put("End_date", E_Date)

แล้วก็ pass ค่า parameter ที่รับจาก user ไปยัง paragraph ที่สร้าง chart ซึ่ง parameter ที่ถูก pass ไปนั้นจะถูกใช้ใน where condition สำหรับ filter ข้อมูล

val S_Date = "\'"+z.get("Start_date")+"\'"
val E_Date = "\'"+z.get("End_date")+"\'"

ทำเสร็จก็เปลี่ยน display mode เป็น reportได้ผลตามรูปด้านล่างครับ เวลาเอาไป present ก็สะดวกเลย อยากใส่คำอธิบายอะไรเข้าไปก็ใช้เขียน markdown เข้าไปเพิ่มได้ครับ

จากที่ผมใช้มา Apache Zeppelin เป็น Open source Notebook ที่ยืดหยุ่นมาก เขียน programming ได้หลากหลายภาษาใน note เดียวแต่แยก paragraph เอา ไม่ว่าจะเป็น Python, Scala, R, Markdown, SQL, UNIX Shell command, Angular และ อื่นๆ แค่ bind interpreter เข้าไปใน paragraph ยิ่งมี Helium มาช่วยเสริมเรื่อง Data Visualization เข้าไปอีกนี่เรียกได้ว่าครบเครื่อง จบในตัวเลย ทำให้เราทำงานกับ Big Data ได้สนุกมากขึ้นเยอะเลยทีเดียว

--

--

Pop Phiphat

Do what you need to do and enjoy life as it happens… “John Scalzi”