มาลองเขียน Scala บน Spark กันเถอะ

Boyd BigData RPG
Big Data Engineering
4 min readJan 9, 2018

Scala คือโรงหนังใช่ไหม !??? เห้ย ไม่ใช่อย่างนั้นครับ มาๆเดี๋ยวพาไปชม

Source: https://daily.rabbit.co.th/

ในวงการของ Data Science นักวิเคราะห์อย่างเราๆ คงต้องทำงานกับข้อมูลที่มีปริมาณมากถึงมากที่สุด (Big Data) แล้วถ้าปริมาณข้อมูลเยอะจะทำอย่างไรดีล่ะ เขียนโค้ดสั่ง Run ที เครื่อวงก็ค้างที แค่ Import file เพื่อจะเปิดอ่านอย่างง่ายๆโดยใช้ ภาษา Python ที่เราคุ้นๆกัน

import pandas as pddf = pd.read_csv("big_data.csv")
df.head()

แค่เท่านี้ก็รอโหลดนานแล้วครับ !! ยิ่งไฟลล์ระดับที่มากกว่า 2 G ขึ้นไปยิ่งเกิดความลำบากในการทำงานมากกกกก นี่ยังไม่รวมถึงปริมาณ Column ภายใน File เอกสารที่เราต้องเจอ หรือรูปแบบของประเภทข้อมูลที่เราต้องเจอนะ เช่น

กลุ่ม Text บอกเลยนรกมากๆ เพราะข้อมูลยิ่งมหาศาลหนักเครื่องในการเปิดเข้าไปอีก

แต่ไม่ต้องห่วงไปเพราะเทคโนโลยีเดี๋ยวนี้มันไปไกลมากๆครับ จนตามไม่ทันแล้ว ถถถถถถ+​บอยด์ก็เลยลองค้นดูว่ามันมีอะไรช่วยให้การทำงานกับไฟลล์ข้อมูลขนาดใหญ่ง่ายขึ้นหรือรวดเร็ว มีประสิทธิภาพมากขึ้นกันนะ !! และก็พบว่า

เห้ยยย ลองใช้ Spark ดูสิ !!

Pikachu กำลังใช้ท่า Spark ! (คนล่ะ Spark ละเว้ยคนเค้า สับสนกันหมด)

Spark คืออะไรหว่า ??

มันคือเทคโนโลยีที่ช่วยในการประมวลผล โดยมีหลักพื้นฐานมาจาก Map-Reduce

  • ทำงานบน Hadoop เหมือนช่วยให้การประมวลผลมีประสิทธิภาพมากขึ้นกว่าปล่อยให้ Hadoop ทำงานประมวลผลแบบลุยเดี่ยว
Source: https://www.slideshare.net/AGrishchenko/apache-spark-architecture
  • ข้อมูลที่โหลดขึ้นไปจะถูกเก็บในรูปของ RDD แบ่งเก็บแบบ Partition เป็นส่วนๆอยู่ใน memory ของ worker node
  • อยู่ในรูปแบบที่ยังไม่แสดงผลจนกว่าจะทำการออกคำสั่งเรียก
  • อยู่ตรงส่วนบนของ Hadoop อีกที
Source: https://www.slideshare.net/MapRTechnologies/spark-overviewjune2014

สำหรับใครที่ยังไม่เคยเขียน Spark ไม่ต้องห่วงนะ !!

เพราะปกติบอยด์ก็เขียน แต่ Python ซึ่งก็งูปลาๆมากๆ นี่ต้องมาเขียน Spark หรอ !? ตอนนั้นคำถามในหัวเยอะมากๆเลย แล้วจะต้องเขียนภาษาอะไรล่ะ ??

โดยปกติแล้ว ภาษาที่เขียนบน Spark เริ่มต้นเลยเป็นภาษาแบบ Functional Programming หรือ Scala นั่นเองครับ // “เอาเว้ย ฝึกภาษาใหม่กันอีกละ”

ไม่เป็นไรมาลองไปพร้อมกัน อิอิ

วิธีการติดตั้งใน Mac

โหลดสิ่งที่จำเป็นตาม link ด้านล่างไว้ก่อนเลยนะ

  1. Java JDK
  2. Python 3.5.x
  3. SBT 0.13.x
  4. Spark 2.0.1
  5. Zeppelin 0.7.3

ขั้นตอนที่ 2 แตกไฟลล์โลด

ในที่นี้บอยด์แตกไฟลล์ไว้ใน download มันซะเลยง่ายดีครับ ดังนั้นในการทำ path environment ก็ต้องทำ path ที่ download นั่นเอง

ข้อสำคัญแตกไฟลล์ไว้ที่ไหนเช็คให้ดีนะครับ !!

ภาพหลังแตกไฟลล์ครับ มี 3 ตัวด้วยกัน อีก 2 ตัวมันลงในเครื่องอัตโนมัติ

ขั้นตอนที่ 3 ติดตั้ง Zeppelin

Zeppelin หรือตัวที่ไว้เขียน Code นั่นเองครับหน้าตาสวยงามมาก สามารถทำรายงานสวยโดยไม่ต้องใช้คำสั่งมากมายนัก เดี๋ยวพาไปชมกัน

สำหรับใครที่เคยใช้ Jupyter Notebook น่าจะคุ้นกันดี เพราะ Zeppelin ใช้ง่ายกว่าเยอะมากๆ และ UI ค่อนข้างสวยกว่าเสียด้วยสิ แต่เสียอย่างเดียวคือมัน Export ออกมาแบบ html file ไม่ได้ และ Export แบบ pdf ก็ไม่สวยเท่าไหร่นัก อันนี้ที่เจอมานะ

ขั้นตอนก็ทำตามนี้เลยครับ

  • กดที่ terminal เราขึ้นมา
  • พิมพ์ตามด้านล่างใน terminal ตอนใส่ให้ใส่ทีละแถวนะแล้วค่อยกด enter (ไม่ต้องเอาเครื่องหมาย $ ไปใส่นะ เมื่อก่อนไม่รู้เอาไปใส่ก็ว่าทำไมรันไม่ได้ซักทีนะ ถถถถถถถ+)
$ cd /Users/myaccount/Downloads/zeppelin-0.7.3-bin-all/conf
$ cp zeppelin-env.sh.template zeppelin-env.sh

ตรง myaccount เป็นชื่อที่เราใช้เข้าคอมส์เราเองนั่นแหละครับ

  • หลังจากนั้นเข้ามาที่ไฟลล์ zeppelin-env.sh แล้วใส่ข้อความด้านล่างไปดังภาพ
export SPARK_HOME=/Users/myaccount/Downloads/spark-2.0.1-bin-hadoop2.7
อันนี้ บอยด์เปิดผ่าน Visual Studio on Mac
  • ใส่ให้มันขึ้นสีด้วยนะ แล้วจากนั้นก็ทำการ save

ขั้นตอนที่ 4 มา set up shell environment ผ่าน Bash Profile กัน

  • เปิด terminal ขึ้นมาใหม่ต่อเลย
  • แล้วใส่ข้อความตามด้านล่างนี้ แล้วกด enter
$ touch ~/.bash_profile; open ~/.bash_profile
  • ใส่ข้อความตามนี้เลยเพื่อ set up
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home/
export SPARK_HOME=/Users/myaccount/Downloads/spark-2.0.1-bin-hadoop2.7
export SBT_HOME=/Users/myaccount/Downloads/sbt-launcher-packaging-0.13.13
export ZEPPELIN_HOME=/Users/myaccount/Downloads/zeppelin-0.7.3-bin-all
export PYSPARK_PYTHON=python3export PATH=$JAVA_HOME/bin:$SPARK_HOME:$SPARK_HOME/bin:$SPARK_HOME/sbin:$SBT_HOME/bin:$ZEPPELIN_HOME/bin:$PATHPATH=”/Library/Frameworks/Python.framework/Versions/3.5/bin:${PATH}”
export PATH
  • อย่าลืม save นะ แล้วค่อยปิด

ขั้นตอนที่ 5 Test Spark

  • เปิด terminal ขึ้นมาใหม่เช่นเคยแล้วพิมพ์ เรียกใช้ spark ตามนี้เลย
  • เป็นการ test โดยสามารถใช้ python บน spark ได้ครับ
pyspark
  • กดออกโดย crtl + d

ขั้นตอนที่ 6 Test Spark-shell

  • เปิด terminal ขึ้นมาใหม่เช่นเคยแล้วพิมพ์ เรียกใช้ spark-shell ตามนี้เลย
  • เป็นการ test โดยใช้ภาษา scala นั่นเอง
  • กดออกโดย crtl + d

ขั้นตอนที่ 7 Test Run Zeppelin

  • เปิด terminal ขึ้นมาใหม่อีกแล้ว แล้วพิมพ์ตามนี้เลย
$ cd /Users/myaccount/Downloads/zeppelin-0.7.3-bin-all/bin
$ zeppelin-daemon.sh start
  • เปิด web browser แล้วพิมพ์ url ตามเลยครับ
  • localhost:8080

จะพบหน้าตาประมาณนี้

  • กดใช้งานที่ Notebook เลย แล้วไปที่ Create New Note
  • ลองตั้งชื่อ Note ว่า test

จากนั้น Run คร่าวๆตามดูนะครับ

  • วิธีกด Run code กดปุ่มลูกศรด้านขวา หรือกด shift + enter ได้เลยครับ

เนื่องจาก Scala เป็น Functional Programing ทำเสร็จจบเลยไม่เก็บตัวแปรมาทำการเปลี่ยนค่าไปเรื่อยๆ เหมือนภาษาอื่นๆ ดังนั้นการประกาศของตัวแปรทุกครั้งใช้ได้ครั้งเดียวเราจะใส่ var ให้นำหน้าก่อนทุกครั้ง

หรือถ้าเราอยากจะนำตัวแปรนั้นมาเปลี่ยนค่าต่อหรือผ่าน Function ก็ประกาศแบบนี้แทนครับ

var a = 1
var b = 2
var c = a+b

ผลลัพธ์ออกมาเหมือนกันแต่ค่าตัวแปรนำไปใช้งานไม่เหมือนกันกับ val นั่นเอง การที่ scala ออกแบบมาให้ตัวแปรนึงเก็บค่าเดียวเพื่อลดเวลาในการประมวลผลนั่นเองครับ ทำให้การประมวลผลไวขึ้นกว่าการเขียนภาษาเพื่อ Run แบบ Tread หรือ code ยาวๆ

มันเลยเหมาะกับการทำงานกับเจ้า Spark ที่ช่วยในการประมวลผลข้อมูลที่เก็บแยกส่วนกันหลายๆส่วน ลดเวลาประมวลผลไปได้เยอะเลยล่ะ

อยากเล่นเพิ่มเติมล่ะสิ มี Tutorial นะ

ลองไปที่ Zeppelin Tutorial กัน

  • เลือก Basic Feature (Spark) จะได้หน้าตาที่มี code เสร็จสมบูรณ์รอเรากด Run

Data Set ที่เล่นดึงมาจาก Amazon กันเลยทีเดียว อิอิ

จะเห็นว่าสามารถแสดงเป็นกราฟโดยใช้ภาษา SQL query ข้อมูลที่เราโหลดมาเป็นกราฟได้สวยงามเลยล่ะครับ

Scala ไม่น่ากลัวเลย จริงไหมครับ ถถถถถถ+

หลังจากใช้งาน Zeppelin เสร็จทำการปิดง่ายๆโดยการพิมพ์ตามนี้ที่ terminal

$ zeppelin-daemon.sh stop

เสร็จแล้ว เย้ๆ

เพื่อนๆลองเล่นกันดูนะครับ เป็นการ Run ก่อนนำไปใช้จริงบน Cloud เพราะมันมีค่าใช้จ่าย วิธีนี้ก็ช่วยประหยัดค่าใช้จ่ายได้เยอะเลยล่ะ แถมทดสอบ Code เราก่อนการใช้จริงด้วยแหละครับ

แล้วเจอกันใหม่นะ
ขอบพระคุณทุกท่านที่ติดตามครับ

More Share, More Fun ^^

--

--

Boyd BigData RPG
Big Data Engineering

Lead Data Scientist | Digital Marketer | Biotechnologist | Vlogger | @BigDataRPG | BS Biot30 KU69 | BD03 DPU