การติดตั้ง Apache Spark 2.3.0 บน macOS High Sierra
Apache Spark ปล่อยเวอร์ชั่น 2.3.0 ออกมาเมื่อวันที่ 28 ก.พ. 2018. บทความนี้จะแนะนำวิธีติดตั้ง Apache Spark 2.3.0 บน macOS High Sierra
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.
- spark-2.3.0-bin-hadoop2.7.tgz (us link, eu link)
- jdk-8u162-macosx-x64.dmg
- scala-2.11.12.tgz
- sbt-0.13.17.tgz
- python-3.6.4-macosx10.6.pkg
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 สามารถทำได้โดย (เลือกวิธีใดวิธีหนึ่งนะครับ)
- เปิด finder ขึ้นมา ไปที่ HOME และคลิกขวา → New Folder และตั้งชื่อว่า
server
2. หรือ สำหรับคนที่ถนัด shell ก็ให้เปิดโปรแกรม Terminal ขึ้นมาและใช้คำสั่งต่อไปนี้ครับ
cd
mkdir server
- เมื่อใช้คำสั่ง
ls -l
ดู จะเห็น folder ที่ชื่อserver
ปรากฎขึ้นมา - คำสั่ง
cd
จะเปลี่ยนโฟล์เดอร์กลับมาที่ HOME และคำสั่งmkdir server
ก็คือสร้างโฟล์เดอร์ชื่อserver
ขึ้นมา
2.3 Copy ไฟล์ที่ดาวน์โหลดมาทั้งหมดไปไว้ที่ $HOME/server
- เพื่อให้ง่าย ให้ผู้อ่าน copy ไฟล์ที่ดาวน์โหลดมาทั้งหมดใน Step 1 ไปไว้ที่
$HOME/server
ครับ. ซึ่งเมื่อ copy เสร็จแล้วก็จะมีหน้าตาประมาณนี้
Step 3: แตกไฟล์ .tgz
- ไฟล์ที่โหลดมาในข้อ 1 จะเป็นไฟล์ชนิด .tgz อยู่ 3 ไฟล์ ได้แก่ Spark, Sbt, และ Scala.
- เราแค่แตกไฟล์เหล่านี้ออกมา และบอกระบบว่าไฟล์เหล่านี้อยู่ที่ไหน (ซึ่งจะกล่าวใน Step 6) แค่นี้ก็จะใช้งานได้แล้วครับ
- วิธีการแตกไฟล์ ก็มี 2 วิธีครับ 1) แบบง่าย ๆ กับ 2) แบบ command line. เลือกทำวิธีใดวิธีหนึ่งครับ
- 1) แบบง่าย ๆ ก็คือ double click ที่ไฟล์นามสกุล .tgz เลยครับ โปรแกรม Archive Utility ก็จะถูกเรียกขึ้นมาทำการแตกไฟล์ให้ครับ
- 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
- เมื่อแตกไฟล์เสร็จแล้ว จะได้ folder ใหม่ 3 folder ตามภาพครับ
Step 4: ติดตั้ง JDK
- Double click ไฟล์
jdk-8u162-macosx-x64.dmg
ตัว install จะถูกเรียกขึ้นมา - Double click ที่รูปกล่องสีน้ำตาล (
JDK 8 Update 162.pkg
) หน้าจอการติดตั้งจะแสดงขึ้นมา - เลือก Continue ตามหน้าจอไปเรื่อย ๆ โดยใช้ค่ามาตรฐานที่ให้มา จนเสร็จสิ้นครับ
Step 5: ติดตั้ง Python 3
- Double click ไฟล์
python-3.6.4-macosx10.6.pkg
- กด Continue ไปเรื่อย ๆ ตนเสร็จสิ้น โดยใช้ค่า default ที่ให้มา
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
- คำสั่งข้างบน 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.12export 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
- สังเกตว่า ข้อมูล 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
Step 8: ทดสอบการติดตั้ง
- เปิดโปรแกรม Terminal ขึ้นมาอีกครั้ง
8.1 ทดสอบ Java
- ใน Terminal ให้พิมพ์
java -version
ซึ่งถ้าทุกอย่างถูกต้อง จะแสดงผลดังภาพข้างล่าง โดยจะแสดงหมายเลข version ของ java ที่เราดาวน์โหลดมาชัดเจน
8.2 ทดสอบ PySpark
- PySpark คือ interactive shell ของ Spark ที่ใช้ภาษา Python
- เมื่อเราเปิด PySpark ขึ้นมา เราสามารถป้อนคำสั่งภาษา Python เพื่อสั่งงาน Spark ได้ แต่เป็นการสั่งทีละบรรทัด และให้ผลลัพท์ของแต่ละคำสั่งทันที (จึงเรียกว่า interactive shell)
- ใน Terminal พิมพ์
pyspark
, ซึ่งก็จะให้ผลลัพท์ดังภาพด้านล่าง. จะเห็นตัวกราฟฟิกคำว่า Spark ใหญ่ ๆ พร้อมเลขเวอร์ชั่น 2.3.0 ชัดเจน
- เราลองเขียนคำสั่ง Python เล่น ๆ ได้ครับ ลองใส่คำสั่งต่อไปนี้ดู พิมพ์ลงไปทีละบรรทัดนะครับ ซึ่งก็น่าจะได้ output ตามภาพข้างล่างครับ
a=5
b=3
a+b
- เมื่อจะออกจาก 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>
- เราทดลองเขียนภาษา Scala กันครับ โดยลองพิมพ์ดังนี้ครับ
val a = 5
val b = 3
a+b
- เมื่อจะออกจาก PySpark ให้กด
CTRL-D