การติดตั้ง Apache Spark 2.3.0 บน macOS High Sierra

Luck Charoenwatana
LuckSpark
5 min readMar 8, 2018

--

Apache Spark ปล่อยเวอร์ชั่น 2.3.0 ออกมาเมื่อวันที่ 28 ก.พ. 2018. บทความนี้จะแนะนำวิธีติดตั้ง Apache Spark 2.3.0 บน macOS High Sierra

Read English version here

Step 1: ดาวน์โหลดโปรแกรมต่าง ๆ

ในเว็บหลักของ Spark ระบุว่าเวอร์ชั่น 2.3.0 นี้จะทำงานร่วมกับโปรแกรมอื่น ๆ ในเวอร์ชั่นต่าง ๆ ดังต่อไปนี้ครับ

  • Java 8 ขึ้นไป
  • Python 2.7 ขึ้นไป หรือ 3.4 ขึ้นไป — ภาษาไพธอนมี 2 เวอร์ชั่นหลักคือ 2.x และ 3.x ซึ่งเวลาที่เราใช้งานต้องเลือกอย่างใดอย่างหนึ่ง ในการใช้งาน Spark นั้น สำหรับผู้เร่ิมต้นหรือไม่มีข้อจำกัดอะไร แนะนำให้ใช้ 3.x ครับ กรณีที่จะเลือกใช้ 2.x ก็มักจะเป็นไปตามข้อจำกัด ยกอย่างเช่น มีโค้ดเก่าหรือโค้ดอื่นที่จะมาใช้ร่วมกับ Spark ที่เป็น Python 2.x เราจึงต้องใช้ 2.x ด้วยเป็นต้น อย่างไรก็ตามหากผู้อ่านเลือกลงไปแล้ว ก็สามารถลงควบคู่กัน หรือเปลี่ยนเป็นอีกเวอร์ชั่นภายหลังได้
  • Scala 2.11 ในปัจจุบัน Scala มีเวอร์ชั่นล่าสุดไปถึง 2.12 แล้ว ดังนั้น ถ้าจะใช้ Spark ต้องโหลดเวอร์ชั่นย้อนหลัง แค่ 2.11 มาใช้

เมื่อพร้อมแล้ว เรามาเริ่มดาวน์โหลดโปรแกรมต่าง ๆ กันเลยครับ ลิงค์ด้านล่างเป็นลิงค์ตรงที่จะโหลดไฟล์มาได้เลยโดยไม่ต้องเข้าหน้าเว็บ ยกเว้น Java อันเดียวที่ผู้อ่านต้องเข้าไปกดยอมรับเงื่อนไข และเลือกดาวน์โหลดด้วยตนเองครับ โดยผมแสดงเป็นชื่อไฟล์ไว้ให้เพื่อความชัดเจนครับ โดยโปรแกรมที่โหลดจะเวอร์ชั่นต่าง ๆ ดังนี้ครับ : Spark 2.3.0, JDK 8u162, Scala 2.11.12, Sbt 0.13.17, และ Python 3.6.4.

Java JDK 8 เป็นลิงค์เดียวที่ต้องเข้าไปกดเลือก โดยให้เลือกเวอร์ชั่น macOS ครับ (นามสกุล .dmg)

Step 2: ตำแหน่ง Path/Folder สำหรับการติดตั้ง

2.1 โฟล์เดอร์ Home ในบทความนี้

  • ตำแหน่ง Home ที่ใช้ในบทความนี้คือตำแหน่ง /Users/luckspark ซึ่งสามารถใช้สัญลักษณ์ $HOME หรือ ~ แทนได้. นั่นคือ /Users/luckspark/server และ $HOME/server และ ~/server คือสิ่งเดียวกัน. โดยในบทความนี้จะใช้สลับ ๆ กันครับ
  • Home folder ของผู้อ่านน่าจะแตกต่างจากที่ผมใช้ในบทความนี้ค่อนข้างแน่นอน เพราะใช้ username ต่างกัน ดังนั้น เมื่อตั้งค่าในขั้นตอนต่าง ๆ หลังจากนี้ ก็อย่าลืมเปลี่ยนตามด้วยครับ เช่นว่า หากใช้ username ชื่อ tim ก็จะต้องเปลี่ยนทุกจุดที่เป็น /Users/luckspark/server ให้กลายเป็น /Users/tim/server เป็นต้นครับ

2.2 ตำแหน่งที่จะติดตั้งโปรแกรมต่าง ๆ

  • โปรแกรม Java และ Python จะถูกติดตั้งใน Path ของระบบ ซึ่งเป็นตำแหน่งมาตรฐานของเค้าครับ เราไม่จำเป็นต้องไปเปลี่ยนแปลงอะไร
  • ส่วนโปรแกรม Spark, Sbt, และ Scala เราสามารถเลือกตำแหน่ง Path/Folder ที่จะติดตั้งได้ ในบทความนี้ ผมเลือกติดตั้งที่ /Users/luckspark/server (ซึ่งก็คือ $HOME/server หรือ ~/server) ครับ
  • การสร้าง folder ที่ชื่อ server ที่ HOME สามารถทำได้โดย (เลือกวิธีใดวิธีหนึ่งนะครับ)
  1. เปิด finder ขึ้นมา ไปที่ HOME และคลิกขวา → New Folder และตั้งชื่อว่า server

2. หรือ สำหรับคนที่ถนัด shell ก็ให้เปิดโปรแกรม Terminal ขึ้นมาและใช้คำสั่งต่อไปนี้ครับ

cd
mkdir server
สร้าง ~/server ด้วยคำสั่ง mkdir
  • เมื่อใช้คำสั่ง ls -l ดู จะเห็น folder ที่ชื่อ server ปรากฎขึ้นมา
  • คำสั่ง cd จะเปลี่ยนโฟล์เดอร์กลับมาที่ HOME และคำสั่ง mkdir server ก็คือสร้างโฟล์เดอร์ชื่อ server ขึ้นมา

2.3 Copy ไฟล์ที่ดาวน์โหลดมาทั้งหมดไปไว้ที่ $HOME/server

  • เพื่อให้ง่าย ให้ผู้อ่าน copy ไฟล์ที่ดาวน์โหลดมาทั้งหมดใน Step 1 ไปไว้ที่ $HOME/server ครับ. ซึ่งเมื่อ copy เสร็จแล้วก็จะมีหน้าตาประมาณนี้
Copy all downloaded files to ~HOME/server directory

Step 3: แตกไฟล์ .tgz

  • ไฟล์ที่โหลดมาในข้อ 1 จะเป็นไฟล์ชนิด .tgz อยู่ 3 ไฟล์ ได้แก่ Spark, Sbt, และ Scala.
  • เราแค่แตกไฟล์เหล่านี้ออกมา และบอกระบบว่าไฟล์เหล่านี้อยู่ที่ไหน (ซึ่งจะกล่าวใน Step 6) แค่นี้ก็จะใช้งานได้แล้วครับ
  • วิธีการแตกไฟล์ ก็มี 2 วิธีครับ 1) แบบง่าย ๆ กับ 2) แบบ command line. เลือกทำวิธีใดวิธีหนึ่งครับ
  • 1) แบบง่าย ๆ ก็คือ double click ที่ไฟล์นามสกุล .tgz เลยครับ โปรแกรม Archive Utility ก็จะถูกเรียกขึ้นมาทำการแตกไฟล์ให้ครับ
The Archive Utility program extracts the files automatically.
  • 2) วิธีใช้ command line บนโปรแกรม Terminal สามารถทำได้โดยใช้คำสั่งต่อไปนี้ครับ
cd
cd server
tar xzvf spark-2.3.0-bin-hadoop2.7
tar xzvf sbt-0.13.17.tgz
tar xzvf scala-2.11.12
การแตกไฟล์โดยใช้คำสั่ง tar xzvf
  • เมื่อแตกไฟล์เสร็จแล้ว จะได้ folder ใหม่ 3 folder ตามภาพครับ
$HOME/server เมื่อแตกไฟล์ .tgz เสร็จแล้ว จะมีโฟลเดอร์ใหม่เกิดขึ้นมา

Step 4: ติดตั้ง JDK

  • Double click ไฟล์jdk-8u162-macosx-x64.dmg ตัว install จะถูกเรียกขึ้นมา
  • Double click ที่รูปกล่องสีน้ำตาล (JDK 8 Update 162.pkg ) หน้าจอการติดตั้งจะแสดงขึ้นมา
  • เลือก Continue ตามหน้าจอไปเรื่อย ๆ โดยใช้ค่ามาตรฐานที่ให้มา จนเสร็จสิ้นครับ
การติดตั้ง JDK. ให้ Double click ที่รูปกล่องเพื่อเริ่มติดตั้ง
หน้าจอการติดตั้ง กด Continue และตามหน้าจอไปเรื่อย ๆ จนเสร็จสิ้น โดยใช้ค่า default ที่ให้มา

Step 5: ติดตั้ง Python 3

  • Double click ไฟล์ python-3.6.4-macosx10.6.pkg
  • กด Continue ไปเรื่อย ๆ ตนเสร็จสิ้น โดยใช้ค่า default ที่ให้มา
หน้าจอการติดตั้ง Python 3

Step 6: ตั้งค่าในไฟล์ ~/.bash_profile

6.1 สรุปค่า Path ต่าง ๆ ที่ได้ใช้ในการติดตั้งโปรแกรมที่ผ่านมา

ในขั้นตอน 3–5 เราได้ติดตั้งโปรแกรมต่าง ๆ ตาม Path ต่าง ๆ ดังนี้

  • JDK: /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk
  • Python: /Library/Frameworks/Python.framework/Versions/3.6
  • Sbt: /Users/luckspark/server/sbt
  • Scala: /Users/luckspark/server/scala-2.11.12
  • Spark: /Users/luckspark/server/spark-2.3.0-bin-hadoop2.7

ค่าต่าง ๆ เหล่านี้จะนำไปใช้ในขั้นตอน 6.2 ซึ่งขอย้ำอีกครั้งว่าต้องเปลี่ยนค่า Path จาก /Users/luckspark/server ให้เป็นค่า Path ของเครื่องของผู้อ่านเสมอ ส่วน Path ของ Java กับ Python นั้นไม่ต้องเปลี่ยนครับ

6.2 เกี่ยวกับไฟล์ .bash_profile

  • ไฟล์ .bash_profile เป็นไฟล์ระบบ ที่ใช้ในการกำหนดค่าตัวแปรของสภาพแวดล้อมต่าง ๆ ของระบบ (environment variables) ซึ่งในที่นี้ เราจะใช้กำหนดค่า Path เป็นหลัก ซึ่งนั่นก็คือการบอกกับระบบว่าโปรแกรมที่เราได้ติดตั้งไปแล้วนั้นอยู่ที่ใดในระบบ เมื่อมีการเรียกใช้ จะได้หาเจอ
  • ไฟล์ .bash_profile นี้ เป็นไฟล์ที่จงใจให้ขึ้นต้นด้วย “จุด” ดังนั้น เวลาเขียนต้องมีจุดข้างหน้าด้วยเสมอ ไม่เช่นนั้น จะใช้งานไม่ได้
  • การตั้งชื่อไฟล์ด้วยการใส่จุดเข้าไปข้างหน้านั้น จะทำให้ไฟล์อยู่ในสถานะ “ถูกซ่อน” (hidden) ดังนั้นเมื่อเราใช้คำสั่ง ls จะมองไม่เห็นไฟล์นี้ หากต้องการให้มองเห็น ต้องใส่พารามิเตอร์ -a ด้วย เช่น ls -a หรือ ls -la
  • ตำแหน่งของไฟล์ .bash_profile นี้จะต้องอยู่ที่ตำแหน่ง HOME. นั่นคือ /Users/luckspark/.bash_profile หรือ /Users/tim/.bash_profile เป็นต้น ซึ่งก็คือ ~/.bash_profile นั่นเอง หากไปอยู่ที่อื่น จะไม่ถูกเรียกใช้งาน

6.3 ลงมือตั้งค่าของไฟล์ .bash_profile

  • สิ่งที่เราจะทำก็คือ 1) เปิดไฟล์ .bash_profile ขึ้นมา 2) เพิ่มข้อมูล Path ต่าง ๆ เข้าไป 3) บันทึกไฟล์
  • เปิดไฟล์ .bash_profile ด้วยโปรแกรมอ่านไฟล์ทั่วไป เช่น TextEdit, nano, vi, หรือ sublime.
  • ในที่นี้ ผมจะให้ลองใช้คำสั่งที่เปิดอ่านไฟล์ .bash_profile ด้วย TextEdit จาก command line ซึ่งสามารถทำได้โดย ไปที่ Terminal และพิมพ์คำสั่งต่อไปนี้
cd
touch -c .bash_profile
open -a TextEdit .bash_profile
เปิดไฟล์ .bash_profile ด้วย TextEdit จาก command line. ข้อมูลในไฟล์ .bash_profile ของท่าน อาจจะเป็นไฟล์เปล่าหรือแตกต่างจากที่แสดงในภาพได้
  • คำสั่งข้างบน 3 คำสั่งคือ 1) เปลี่ยน directory กลับไปที่ HOME, 2) หากไม่มีไฟล์ชื่อ .bash_profile ให้สร้างไฟล์ขึ้นมา (ถ้ามีแล้ว ก็ไม่ทำอะไร), 3) เปิดไฟล์ .bash_profile ด้วย TextEdit
  • ข้อมูลในไฟล์ .bash_profile ของผู้อ่าน อาจจะเป็นไฟล์เปล่าหรือแตกต่างจากที่แสดงในภาพได้
  • จากนั้น ให้ copy ข้อมูลข้างล่างนี้ใส่ใน .bash_profile โดยอย่าลืมเปลี่ยน Path จาก /Users/luckspark ทุกอัน ให้เป็น Path ที่ผู้อ่านใช้นะครับ
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/
export SPARK_HOME=/Users/luckspark/server/spark-2.3.0-bin-hadoop2.7
export SBT_HOME=/Users/luckspark/server/sbt
export SCALA_HOME=/Users/luckspark/server/scala-2.11.12
export PATH=$JAVA_HOME/bin:$SBT_HOME/bin:$SBT_HOME/lib:$SCALA_HOME/bin:$SCALA_HOME/lib:$PATHexport PATH=$JAVA_HOME/bin:$SPARK_HOME:$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATHexport PYSPARK_PYTHON=python3
ไฟล์ .bash_profile เมื่อใส่ข้อมูลแล้ว
  • สังเกตว่า ข้อมูล 4 บรรทัดสุดท้ายในภาพข้างบน (ซึ่งเป็นการเซ็ต Path ของ Python) ผมไม่ได้เขียนใส่ใน config ที่ให้ copy ไปใส่ในไฟล์นะครับ ทั้งนี้เพราะข้อความ 4 บรรทัดนี้ อาจจะถูกใส่มาแล้วโดยตัวติดตั้งของ Python หากว่า .bash_profile ของผู้อ่าน ยังไม่มีข้อความดังกล่าว ก็ให้ copy ไปใส่เพิ่มเติมได้ครับ
PATH=”/Library/Frameworks/Python.framework/Versions/3.6/bin:${PATH}”
export PATH
  • ข้อสังเกต — ตัวอักษร # ใน .bash_profile เป็นการ comment. หมายความว่า บรรทัดใดที่ขึ้นต้นด้วย # จะไม่ทำงาน
  • Save และ ปิดไฟล์ .bash_profile ครับ

Step 7: ปิด Terminal

  • เนื่องจากเราเซ็ตค่าในไฟล์ .bash_profile ใหม่ ดังนั้นก็ต้อง ปิด เปิดโปรแกรม Terminal ใหม่เพื่อให้มันอ่านค่าใหม่ที่เราเพิ่งเซ็ตให้มันครับ
  • การปิดนี้ ต้องปิดแบบ Quit นะครับ คือปิดทิ้งทั้งโปรแกรม ไม่ใช่แค่ Close หรือแค่ปิดหน้าต่างไป ใน Mac นั้น Quit กับ Close ต่างกันนะครับ
  • การปิดแบบ Quit นี้คือต้องไปที่เมนู และเลือก Quit Terminal หรือกดคีย์ ⌘Q
Quite Terminal

Step 8: ทดสอบการติดตั้ง

  • เปิดโปรแกรม Terminal ขึ้นมาอีกครั้ง

8.1 ทดสอบ Java

  • ใน Terminal ให้พิมพ์ java -version ซึ่งถ้าทุกอย่างถูกต้อง จะแสดงผลดังภาพข้างล่าง โดยจะแสดงหมายเลข version ของ java ที่เราดาวน์โหลดมาชัดเจน
ผลลัพท์ของคำสั่ง java -version.

8.2 ทดสอบ PySpark

  • PySpark คือ interactive shell ของ​ Spark ที่ใช้ภาษา Python
  • เมื่อเราเปิด PySpark ขึ้นมา เราสามารถป้อนคำสั่งภาษา Python เพื่อสั่งงาน Spark ได้ แต่เป็นการสั่งทีละบรรทัด และให้ผลลัพท์ของแต่ละคำสั่งทันที (จึงเรียกว่า interactive shell)
  • ใน Terminal พิมพ์pyspark , ซึ่งก็จะให้ผลลัพท์ดังภาพด้านล่าง. จะเห็นตัวกราฟฟิกคำว่า Spark ใหญ่ ๆ พร้อมเลขเวอร์ชั่น 2.3.0 ชัดเจน
Output ของคำสั่ง pyspark.
  • เราลองเขียนคำสั่ง Python เล่น ๆ ได้ครับ ลองใส่คำสั่งต่อไปนี้ดู พิมพ์ลงไปทีละบรรทัดนะครับ ซึ่งก็น่าจะได้ output ตามภาพข้างล่างครับ
a=5
b=3
a+b
ทดสอบการป้อนภาษา Python ไปที่ PySpark
  • เมื่อจะออกจาก PySpark ให้กด CTRL-D หรือพิมพ์ exit()

8.3: ทดสอบ spark-shell

  • Spark-shell คือ interactive shell ของ​ Spark ที่ใช้ภาษา Scala
  • เมื่อเราเปิด spark-shell ขึ้นมา เราสามารถป้อนคำสั่งภาษา Scala เพื่อสั่งงาน Spark ทีละบรรทัดได้
  • ใน Terminal พิมพ์spark-shell , ซึ่งก็จะให้ผลลัพท์ดังภาพด้านล่าง จะเห็นตัวกราฟฟิกคำว่า Spark ใหญ่ ๆ พร้อมเลขเวอร์ชั่น 2.3.0 ชัดเจน คล้าย ๆ pyspark แต่ต่างกันตรงที่ prompt จะแสดงคำว่า scala>
Output screen ของ spark-shell.
  • เราทดลองเขียนภาษา Scala กันครับ โดยลองพิมพ์ดังนี้ครับ
val a = 5
val b = 3
a+b
Output ของการป้อนภาษา Scala ไปที่ spark-shell
  • เมื่อจะออกจาก PySpark ให้กด CTRL-D

แค่นี้ครับ เสร็จเรียบร้อยครับ ^_^

--

--