เสี่ยวเออสอน Spark 
ในยุทธจักรการประมวลผลแบบกระจายหรือ Distributed computing นั้น หากผูใดไมรูจัก Apache 
Spark แลวหละก็ตองถือวาผูนั้นมิใชมือกระบี่แตเปนเพียงเสี่ยวเออบารีสตาตามโรงเตี๊ยมก็เพียงเทานั้น แตทาน
กลาววาหากผูใดรูถึงเคล็ดวิชาแลวไซรแมรางกายเปนเพียงเสี่ยวเออ แตลมปรานพรุงพลานดั่งเซียนกระบี่สวรรค 
วิถีชีวิตเสี่ยวเออที่จักไดถายทอดวิชาในตําราลับเลมนี้ก็เพียงหวังวาจะไดเผยแพรวิทยายุทธใหเหลาเสี่ยวเออเอา
ไวดูแลตนเองและอุปถัมภคํ้าชูยุทธภูมินี้สืบไป 
 
 
 
เรื่องเลาของชาวยุทธ 
“หนทางหมื่นลี้เริ่มที่กาวแรก” สุภาษิตจีนนี้ยอมใชไดกับความเกาของยุทธจักรที่จะไดมาเลาใหมใหสู
กันฟง หายจะยอนจากจุดหมายปลายทางที่เราอยูกลับไปในอดีตก็จะทําใหเกิดความเขาใจในกาลปจจุบัน และ
คาดเดาสิ่งที่จะเกิดขึ้นในอนาคตได ดังนั้นตําราเลมนี้จึงจักไดเลาถึงความเกาสักเล็กนอยพอไดอรรถรส 
 
เปดยุทธจักร Distributed computing 
หากจะศึกษาใหเปนขั้นเปนตอนสักเล็กนอยก็คงตองเอาความแตกตางกันระหวางคําที่มันความหมาย
เกี่ยวของกันซะกอน โดยจักขอเริ่มที่คําวา Concurrency เสียกอน โดยความหมายของ Concurrency คือการ
ที่เรามีงานสักงานหนีงแลวงานนั้นสามารถที่จะแบงซอยยอยๆ ไดเหมือนรัชดาซอย 3 สถานฑูตจีนถึง รัชดา
ซอย 17 โพไซดอน ที่เราจะไปซอยไหนกอนก็ได (ลอเลน) จริงๆ แลวเรื่อง Concurrency นี่คุยวาเราสามารถ
แบงงานเปนสวนๆ แลวคอยทําไดเชนหากเรามีนํ้าชาที่จะเสริฟแขกอยู มันตองอุนอยูตลอดเวลา แตถาหากวา
เรามีเตาเดียวที่ตองนึ่งซาลาเปาไปดวย เราก็สามารถนึ่งซาลาเปาไปแพบหนึ่ง แลวก็สลับตมนํ้าชาแพบหนึ่ง พอ
ทําแบบนี้แลวก็จะเห็นวาตอใหเถาแกมีแคเตาเดียวเราก็ยังสามารถทํางานไดสอบอยางอยูนะ แตอาจจะไมไดดี
เทาไหรก็ตามมีตามเกิดไป 
ทีนี้ถาเปน Parallelism หละก็มันจะเหมือนเถาแกใจดีที่ทําเตาใหเราหลายเตา สมมุติวาที่รานมีเตา
เพิ่มมาเปนสองเตา เราก็สามารถคางหมอนึ่งซาลาเปาไปพรอมๆ กับอุนชาไปไดพรอมๆ กัน แตถาเถาแกขยาย
รานไปอีกโดยการเพิ่มหมอนึ่งเปน 2 และเพิ่มหมอตมชาเปน 2 แลวจะสลับกันใชเตาถานที่มีอยูเพียงสองเตา
แบบ Concurrency คือนึ่งซาลาเปาสลับกับตมชาก็บใชปญหาแตอยางใด จะเห็นวาที่จริงแลว Parallelism 
กับ Concurrency ไมใชของอยางเดียวกันซะทีเดียว 
 
กลับมาถึงเรื่องของ Distributed กันบาง แมจะใชคําที่ใชปนกันจนหมุนอุยปุย แตถึงยังไงมันก็ยังไมใช
ของอยางเดียวกันอยูนั่นเอง ซึ่ง Distributed มันมักจะถูกพูดถึงในแนของตําแหนงที่ตั้งของทรัพยากรมากกวา 
เชนสมมุติวาที่รานเถาแกเรามี 2 เตาแชรเตารวมกับรานอาซิ้มอีก 2 เตา แบบนี้ตําแหนงชองเตาอยูคนละที่กัน
แตก็มีเปาหมายรวมกันคือการใหบริการลูกคา ซึ่งมันอาจจะถูกมองวาคลายๆ กับคลัสเตอร (Cluster) แตก็แตก
ตางกันอยูบาง เพราะโดยทั่วไปแลว มักจะถูกกลาวถึงในลักษณะของกลุมของที่ทํางานแบบเดียวกันซึ่งในกรณีนี้
ถาจะกลาววาเตาที่รานเถาแกสองเตานั้นเปนหนึ่งคลัสเตอรและเตาที่รานอาซิ้มก็เปนอีกคลัสเตอรหนึ่งที่ 
Distributed กันอยูก็คงจะไมผิดแตประการใด 
นี่ยังไมรวมถึง Cloud computing ที่พูดถึงเรื่องการใชทรัพยากรที่คนใชไมจําเปนตองสนใจ 4 หรือ 8 
ใดๆ แคมีเงินจายก็พอ หรือ Grid computing ที่กลาวถึงการเอาทรัพยากรมาแชรกันตรงกลางระหวางหนวย
งานตางๆ ตามนโยบายยุคกลางป ‘90s ที่บางทีขอใชงานไปแลวตั้งแต ป.ตรีจนจบ ป.เอก เพิ่งได Account เขา
ใชที่ Install โปรแกรมใดๆ ไมได บนเครื่องที่แรงที่สุดในสมัยนั้นอยาง Pentium 4 (อสกข.) ในสวนนี้ยังมีราย
ละเอียดปลีกยอยอีกเยอะไปอานเพิ่มดวยก็ดีนะ (เผื่อปรมาจารยมาอานทานจะบอกวามันบแมนๆ มันเปนแบบ
อื่น พะนะ… ละเอียดกวานี้ก็หาอานเอาโลดสู) 
 
มุมมองของความขนาน  
เราจะเขาถึงศาสตรของการขนานไมไดเลย ถาเรายังไมเขาใจวาจะมองวามันขนานกันไดยังไง บังเอิญ
ไปเจอตําราหนึ่งซึ่งมันดีมาก เลาถึงเรื่องวิธีคิดของการขนานกันซึ่งมีอยูสองสวนคือ การขนานกันของขอมูล 
(Data parallelism) ​ซึ่งเปนเรื่องที่บอกวาถาเรามีฟงกชั่นเดียวกันก็สงไปหลายๆ ที่ใหชวยกันประมวลผลไดนี่
หวาถาการประมวลผลของเรามีแคบวกเลข แบบนี้เราจะแบงกันบวกก็ไมผิดกติกาใดๆ เชน ชุดขอมูล A = 
A[1]+A[2] แบบนี้ถาแบงออกเปนชุดขอมูล B แลวก็แบง B = B[1]+B[2] ก็ยอมได เปรียบกับถาโรงเตี๊ยมของ
เรามีสูตรการทําเสี่ยวหลงเปาและมีวัตถุดิบพอแลวหละก็เราจะสงไปใหพอครัวหลายๆ คนชวยกันทําก็ยิ่งจะ
ทําใหอาหารที่ลูกคาสั่งเสร็จไดเร็วขึ้น 
แตก็ยังมีการขนานอีกรูปแบบหนึ่งคือ การขนานกันของฟงกชัน (Function parallelism) วากันถึง
เรื่องการแบงสวนงานที่ไมเกี่ยวของกันออกจากกัน แลวคอยนําผลลัพธมาประกอบกันทีหลังได เชน F = (A*B) 
+ (C*D) แบบนี้จะเห็นวาเอา A*B กับ C*D แยกกันทํางานก็ไมมีปญหาอะไร พอทั้งคูเสร็จแลวคอยเอามาบวก
กันเพื่อไดผลลัพธสุดทาย เสมือนหนึ่งวาถาลูกคาสั่งนํ้าเตาหูปาทองโกแลวเสี่ยวเออผูนั้นก็สามารถใหเพื่อนสอง
คนชวยโดยใหคนแรกไปเอานํ้าเตาหูจากเขาอากินะ อีกคนไปเอาปาทองโกจากเขาเหลียงซาน เสร็จแลวใสถาด
เดียวกันเอามาเสริฟได 
cc :​http://www.ku.ac.th/scc2009/SCC2009_advance.pdf  
 
วิทยายุทธ MapReduce 
จุดเริ่มตนเนื้อเรื่องอันวุนวายนี้เกิดจาก Google พรรคพี่ใหญในยุทธภพที่ตองการแสดงอานุภาพของ
วิทยายุทธที่ใชภายในอยู ดวยการติพิมพเปเปอรเรื่อง MapReduce : Simplified Data Processing on 
Large Clusters เมื่อป ค.ศ. 2004 โดยปา Jeffrey Dean และ Sanjay Ghemawat โดยเนื้อหาจะมีใจความ
วา MapReduce เปนโมเดลการแกปญหาแบบนี้ที่ถาเราแบงปญหาออกใหอยูในรูปแบบนี้แลวเราจะสามารถ
ประมวลผลขอมูลที่มีขนาดใหญไดโดยงาย เพราะรูปแบบการเขียนโปรแกรมทําใหสามารถเกิดการประมวลผล
แบบ Parallelism ไดอัตไนมัติ ฟงดูยากเติบอยูแตเดี๋ยวอธิบายใหฟง แตเดี๋ยวใหดูรูปภาพรวมกอน 
 
จากภาพนี้จะเห็นวาหากเรามีหมูเห็ดเปดไกนํ้าตามรูปแลวหละก็ เราสามารถแยกออกเปนขอมูลสองสวน คือ
สวนหนาเครื่องหมายคอมมา(,)และสวนหลังเครื่องหมายคอมมา (บอกเพื่อ?) นั่นแหละ จากนั้นเราก็จะสามารถ
แปลงเปนอีกอยางได 
ถาตามตัวอยางจะเห็นวาในขั้นตอนแรกมี Input กองกันอยู จากนั้นเราจะนําเอา Input ไปเขาฟงกชัน 
Map​ ซึ่งเปนฟงกชันที่ทําหนาที่สราง Intermediate Key/Value pair พุนเด ชื่ออยางเทหจริงๆ ไมมีอะไรมัน
ทําหนาที่สรางแมพของสวนหนาและสวนหลังจากที่ไมเคยมีอยู ถาเราดูภาพในสวน Input ที่อยูซายมือสุด 
Map คือการเอาสัตวแตละตัวไปเขาคูซึ่งสวนหนาเปนสัตวตัวนั้นๆ และสวนหลังเปนตัวเลข 1 จากนั้นกลไกของ
เฟรมเวิรค MapReduce ก็จะทําการ Shuffle ซึ่งขั้นตอนนี้เปนการพยายามที่จะจัดกลุมของขอมูลเอาไวดวย
กัน จากภาพจะเห็นวาเสือและหมูนั้นมีอยางละ 2 ตัว ดังนั้นพอพยายามเอามารวมกันแบบงายๆ เลยไดสวน
หลังเปนอาเรยของเลข 1 และเพราะวาขอมูลเรามีไดแคสองสนคือสวนแรกและก็สวนหลัง ถาเก็บเปนอาเรยตอ
ใหขางในมีหลายตัวในมุมมองของระบบก็จะมองวามันเก็แคอารเรยตัวเดียวโดยไมไดสนใจของขางในวามีกี่ตัว 
 
หลังจากนั้นก็จะเขาไปสูฟงกชันที่สองคือฟงกชัน Reduce​ ซึ่งเปนฟงกชันที่รับขอมูลมาจาก 
Intermediate Key/Value pair หลังจากผานกลไก Shuffle แลวเขามาเพื่อทําการลดรูปใหเปนอีกรูปหนึ่ง ซึ่ง
ในรูปตัวอยางสัตวพวกนี้เปนการนับจํานวน ซึ่งหนาที่ของฟงกชัน Reduce คือเอาอาเรยตัวหลังมาบวกกันทุก
ตัวทําใหรูวาสัตวแตละชนิดมีกี่ตัวและจะเห็นวาการแยกแบบนี้ทําใหสามารถประมวลผลขนานกันไปได เพราะ
การประมวลผลนั้นไมจะเปนตองไปยุงเกี่ยวกับสวนอื่นเราเลยสามารถนับจํานวนหมูเห็ดเปดไกนํ้าเตาปูปลาได
นั่นเอง 
เพื่อใหงงมากยิ่งขึ้นจักไดอธิบายเพิ่มเติมสักนิดหากโรงเตี๊ยมเราเปดเฟรนไซนขึ้นมามีหลายสาขาแลว
เถาแกอยากรูวาคนที่ซื้อเยอะที่สุดนี่เขาซื้อกี่บาท เสี่ยวเออแบบเราๆ ก็จัดใหปาแกไดจากการคนตั๋วสั่งอาหาร
จากนั้นเอามาลงบันทึกเรยงกันไดความแบบนี้ 
 
โรงเตี๊ยมแปะ สาขาเขาเหลียงซาน, 32, 21/3/2018 18:00 
โรงเตี๊ยมแปะ สาขาเขาเหลียงซาน, 102, 1/4/2018 20:00 
โรงเตี๊ยมแปะ สาขาพรรคกระยาจก, 199, 1/4/2018 20:00 
โรงเตี๊ยมแปะ สาขาบูตึ้ง, 500 ,5/5/2016 10:00 
 
จากนั้นเราก็สราง Map โดยตัดคําที่เราไมตองใชออกจะไดของหนาตาประมาณนี้เปน Intermediate 
Key/Value pair 
 
(สาขาเขาเหลียงซาน, 32) 
(สาขาเขาเหลียงซาน, 102) 
(สาขาพรรคกระยาจก, 199) 
(สาขาบูตึ้ง, 500) 
 
เสร็จแลวระบบของ MapReduce ก็จะทําขั้นตอนการ Shuffle ไดหนาตาของ Intermediate Key/Value 
pair ประมาณนี้ 
 
(สาขาเขาเหลียงซาน, [32,102]) 
(สาขาพรรคกระยาจก, 199) 
(สาขาบูตึ้ง, 500) 
 
จากนั้นก็เอาไปเขาฟงกชัน Reduce ซึ่งฟงกชันนี้เรากําหนดใหหาตัวที่มากที่สุดเอาไว สุดทายก็จะไดหนาตา
แบบนี้ออกมา 
 
(สาขาเขาเหลียงซาน, 102) 
(สาขาพรรคกระยาจก, 199) 
(สาขาบูตึ้ง, 500) 
 
อยางไรเสีย MapReduce ที่เราพูดกันตั้งแตตนถึงตอนนี้นั้นยังเปนแนวคิดการเขียนโปรแกรมซึ่งผูพัฒนาอาจจะ
เลือกทําตาม ไมทําตามหรือเพิ่มเติมในบางสวนได แตหลักใหญใจความก็ยังจะวนๆ ถึงการแยกขอมูลเปนคู 
Key กับ Value (หรือสวนหนากับสวนหลังนั่นแหละ) และหวัใจอีกอยางคือการที่มีฟงกชัน Map และฟงกชัน 
Reduce นั่นเอง 
 
กอกําเนิด Hadoop 
จะไมพูดถึง Apache Hadoop ก็ดูจะไมใหเกียรติกัน เพราะวาหลายๆ เจาตอนนี้ก็ยังรัน Hadoop กัน
อยู ตัว Hadoop นั้นถือวาเปตตัวบุกเบิกการนํา MapReduce ไปใชงานในวงกวางเลยแหละ เนื่องจาก 
Google เปดเผยการใช GFS มาในเอกสาร The Google File System และ MapReduce มาในเอกสาร 
MapReduce : Simplified Data Processing on Large Clusters ก็จริงแตไมไดเปดตัวโคดมาใหดวย 
(Dafuq!!) ก็เลยมีจอมยุทธพอลูกออนชื่อวา Doug Cutting และเพื่อนรวมงาน Mike Cafarella จาก Yahoo 
ซึ่งแตกอนก็ทํา Apache Nutch (เปน Search-engine โปรเจกโดย Yahoo และเปนโปรเจกยอยของ 
Apache Lucene อีกทีหนึ่ง) ทํา Apache Nutch ไปๆ มาๆ ดังแลวเลยแยกวงเปน Apache Hadoop ใช
โลโกเปนรูปชางสีเหลืองและชื่อ Hadoop นี่เองก็ไดไอเดียมาจากของเลนลูกของ Doug ซึ่งงายตอการออก
เสียง เกร็ดเล็กนอยของการตั้งชื่อนี้ก็คือคําวา Googol ที่หมายถึงเลขจํานวนมหาศาล (ใชอธิบายความแตกตาง
วามากมหาศาลกับความเปนอนันตนั้นไมเทากัน) คําวา Googol มันถูกนิยามวาเลข 1 แลวตามดวย 0 จํานวน 
100 ตัว ซึ่งคํานี้มาจากหลานชายวัย 9 ขวบของนักคณิตศาสตร Edward Kasner ซึ่ง Larry Page จาก 
Google นั้นชื่นชมในตัวเขาจึงตองการใช Googol เปนชื่อโดเมน แต Sean Anderson เพื่อนของเขาพิมพผิด
เปน Google.com แต Page ก็เห็นวาชื่อนี้วางอยู และเขาเองก็ชอบดวยเลยเลือกใชชื่อนี้ 
 
 
 
ตัว Hadoop ทั้ง Stack มีตัวประกอบหลักๆ คือ 
Hadoop Common ​เปน Library และพวกการทํางานพื้นฐานไวใหตัวอื่นเรียกใช 
Hadoop Distributed File System (HDFS) ​เปนระบบไฟลแบบกระจายเก็บขอมูลไวบนหลายๆเครื่อง 
Hadoop YARN ​เปนตัวจัดวางงาน 
Hadoop MapReduce​ ตัวที่ใชประมวลผลขอมูลแบบ MapReduce 
 
เปดตํานาน Apache Spark 
หากจะเรียนรูเคล็ดวิชาใหถึงรากถึงแกนนั้นประวัติที่มาของเคล็ดวิชาก็มิ
อาจมองขามไปดวยเห็นวาเปลาประโยนชเสียทีเดียว สําหรับเคล็ดวิชา Apache 
Spark นี้ก็ตองขอเลายอนไปถึงประวัติการกอกําเนิดวาเริ่มตั้งแตป ค.ศ. 2009 
โดย RAD Lab ซึ่งภายหลังเปลี่ยนเปนชื่อ AMPLab ซึ่งเปนหนวยงานในสังกัด
ของมหาลัย UC Berkeley เคล็ดวิชานี้ไดเริ่มประสานลมปรานโดยจอมยุทธ
นามวา Matei Zaharia ถัดมาหนึ่งปคือ ค.ศ. 2010 ก็ไดเปดเปนโอเพนซอส
ภายใตสัญญาอนุญาตแบบ BSD จากนั้นชวงเดือนมิถุนา ค.ศ. 2013 ไดบริจาคใหกับมูลนิธิซอฟตแวร Apache 
(ASF) ทําใหเวลาเรียกขานสามารถใชไดทั้ง Apache Spark หรือ Spark เฉยๆ ก็ได จะเห็นวาการเรียก
ซอฟตแวรมี Apache นําหนานี้ก็เนื่องมาจากเปนซอฟตแวรที่อยูภายใชการดูแลขององคกรแลวนั่นเอง ลักษณะ
การประมวลผลแบบ MapReduce ของ Spark นั้นจะใกลเคียงกับ Hadoop อยางมาก แตก็มีบางสวนที่ 
Spark ชวยใหการประมวลผลมีประสิทธิภาพมากขึ้น โดยที่ตัว Spark เองนั้นใชหนวยความจําเปนหลักแตใน
สวนของ Hadoop นั้นมุงเนนไปที่ฮารดดิสกเปนหลัก ตัว Spark เองนั้นสรางมาจากภาษา Scala ซึ่งเปนภาษา
ที่การทํางานนั้นรันอยูบน Java Virtual Machine หรือ JVM เชนเดียวกันกับ Java ทําใหสามารถใช Java 
เชื่อมตอได นอกจากนี้ Spark เองยังรองรับการเชื่อมตอผานทางภาษา Python อีกดวย ออๆ ประวัติคนสราง
นี่ก็ไมธรรมดานะ ไอหมอนี่เคยไดรางวัลที่ 3 การแขง ACM-ICPC ระดับโลกเมื่อป ค.ศ. 2005 มาแลว และ
นอกจากจะเปนคนสราง Spark แลวอัลกอริทึมจัดการงานของ Hadoop เองก็เปนฝมือของเขา ออๆ เขาเปน
หนึ่งในคนสราง Apache Mesos ดวยนะ 
 
 
 
รวบรวมลมปราน 
วากันในหมูชาวยุทธวาหากจะเขาใจถึงแกนของสิ่งใดนั้นตองประกอบกันทั้งบูและบุน ทําใหวรยุทธกับ
ลมปรานรวมเปนหนึ่งจึงใชพลังนั้นไดอยางแทจริง ในการเรียนรูการศึกษากับการปฏิบัตินั้นหากไดทําคูกันแลว
ทานวาจะเกิดอานุภาพของการเรียนรูไดเต็มที่ ตําราเลมนี้จึงมีสวนที่เปนทั้งบูคือการปฏิบัติและทฤษฎีที่มี
เนื้อหาเลาอธิบาย เปรียบดังการขับจักรยานที่เราไมสามารถขับไดโดยอานเพียงตําราไมไดหัดซอม และเราจัก
เสี่ยงอันตรายหากหัดขับโทยไมศึกษาวิธี 
 
เคล็ดวิชา Apache Spark คืออะไร ? 
ซอฟตแวร Apache Spark เปนเฟรมเวิรคแบบโอเพนซอสที่ใชประมวลผลขอมูลแบบกระจายที่มี
ลักษณะการประมวลผลแบบทั่วไป พอแปลตรงๆ แลวฟงดูแปลกๆ แตใหเขาใจวามันไมไดถูกออกแบบมาเพื่อ
งานใดโดยเฉพาะ มันจึงสามารถถูกปรับใชไดกับงานหลายๆ อยาง ซึ่งโดยปกติแลวคาเริ่มตนของมันถูกกําหนด
ใหประมวลผลบนหนวยความจํา และหนวยความจําที่กลาวถึงตอไปก็จะเปนพวก RAM อะนะ (เดี๋ยวโดนวา
หนวยความจํามีหลายแบบ บลาๆๆ) เอาตอ! ทีนี้ Spark เองก็สนับสนุนใหเกิดพวก ETL หรือ Extract - 
Transform - Load นะ ซึ่ง Extract คือขั้นตอนการเอาขอมูลจากแหลงอื่นที่อาจจะมีรูปแบบการเก็บแตตาง
กัน มา Transform ใหเปนรูปแบบที่เราอยากได จากนั้น Load เขาไปเก็บใน Data warehouse ซึ่งตัว Spark 
เองก็สามารถทํากลไก ETL ที่กลาวไปนี้ได หรือจะทําการวิเคราะหขอมูล การทํา Machine learning รวมทั้ง
การประมวลผลแบบกราฟ ซึ่งทั้งตัว Batch บนขอมูลที่ถูกเก็บอยูแลวและตัว Streaming บนขอมูลที่มีการ
เปลี่ยนแปลงตามเวลาเปน Time series ไดดวย 
 
จากภาพจะขอโฟกัสไปที่ตัวขนมชั้นที่อยูตรงกลางคือชั้นที่เปนของ Spark Core ซึ่งเปนหัวใจของเคล็ดวิชาซึ่ง
เกือบทั้งหมดของตําราเลมนี้ก็จะวากันดวยเรื่อง Spark Core นี่เอง จากนั้นขอใหยายหางตาไปเหลือบมองดาน
บนที่เปนสวน เสร็จแลวจึงจะเหลาดานลางตอไป 
 
Spark Core​ สวนนี้เรียกไดวาเปนหัวใจของ Spark เลยก็วาไดเนื่องจากวาเปนตัวที่ใชเอาใหใหสวนอื่นๆ ที่เปน
สวนประกอบยอยที่เปนไลบรารี่ เชน Spark SQL หรือ MLlib เขามาติดตอเพื่อใชงาน หรือเราจะใชวิธีเขียน
โคดเพื่อเชื่อมตอกับ Spark เขาไปตรงๆ ก็ไดเหมือนกัน โดยที่กลไกการจัดการเชน Scheduler ที่เอาไวจัดการ
งาน รวมทั้งกลไกการจัดการหนวยความจํา กลไกกูคืนขอผิดพลาดลวนแตอยูในสวนนี้ทั้งสิ้น 
 
Spark SQL ​กระบวนทานี้ใชสําหรับจอมยุทธทานใดที่อยากใช SQL หรือ HQL (Hive Query Language) 
เรียกใชขอมูลก็แสนจะสะดวกสบาย แตก็มีขอแมนะวาขอมูลที่จะเอามาประมวลผลจะตองเปนขอมูลที่อยูในรูป
แบบมีโครงสราง ดังนั้นจึงใชไดกับตัวแปรพวก DataFrame หรือ DataSet ซึ่งจะไดอธิบายตอไป นอกจากนี้
แลว Spark SQL ยังใชวิธีนําเขาขอมูลแบบเดียวกันไดไมวาจะเปนรูปแบบขอมูล Hive, Avro, Parquet. ORC, 
JSON หรือกระทั้ง JDBC และนอกจากนี้ตัวมันยังมีโหมดที่สามารถใหเครื่องมือที่เปน Business Intelligence 
(BI) เชื่อมตอเขามาผานทาง JDBC หรือ ODBC เพื่อประมวลผลขอมูลไดอีกตะหาก 
 
Spark Streaming​ ปกติการประมวลผลของ Spark นั้นก็จะทํางาน Workload ที่เแ็นลักษณะของ Batch 
job คืองานที่เปนงานประมวลผลกับขอมูลนิ่งๆ โดยประมวลผลเปนรอบๆ แตถาเราตองการประมวลผลขอมูล
ที่ไมนิ่งเชนเราอยากวิเคราะห Log ของเซอรเวอรเพื่อนนําเสนอโปรโมชั่นใหลูกคาแบบ Real time นี่เราก็
ตองการเอาขอมูลมาวิเคราะหทันทีเลย ดังนั้น Spark Streaming จึงถูกออกแบบมาให Spark สามารถ
ประมวลผลขอมูลแบบ Real time ได โดยที่ Operation คุณสมบัตรคงทนตอความลมเหลวที่ทําไดบน Batch 
ก็เรียกไดวา Streaming มีเหมือนกันเกือบทั้งหมด ละยังสามารถเชื่อมตอกับพวก HDFS, Flume, Twitter, 
RabbitMQ หรือ Kafka ได 
 
MLlib​ ใชประมวลผล Machine learning โดยที่ตัวไลบรารี่เองก็มีอัลกอริทึมบางตัวใหเลือกใชไดอยางสะดวก
ไมวาจะเปนพวก Regression, Classification, Clustering หรือ Collaborative filtering ซึ่งการประมวลผล
เหลานี้สามารถเอาเขาไปประมวลผลที่คลัสเตอรของ Spark ได 
 
GraphX ​ตัวนี้เปนไลบรารี่ที่ใชในการประมวลผลขอมูลแบบกราฟ ทําใหเราสามารถจัดการกับขอมูลแบบกราฟ
มีทิศทางได เราสามารถใชกับอัลกอริทึมบางประเภทไดเชน Triangle counting หรืออัลกอริทึมยอดนิยมที่เคย
ใชใน Seach engine ของ Google และตั้งชื่อตาม Larry Page วา PageRank ซึ่งเปนลักษณะการใหนํ้าหนัก
ขอมูลตามลักษณะของกราฟนั่นเอง 
 
Cluster managers (Standalone | YARN | Mesos)​ ตัว Spark เองนั้นสามารถรันแบบ Local mode 
คือรันบนเครื่ืองของเราอยางเดียวไมเกี่ยวกับใครได แตวาถาจะใหดีการประมวลผลนั้นควรใชเครื่องหลายๆ 
โหนดชวยกันประมวลผล แตการจะทําแบบนั้นไดตองมีตัวจัดการระบบคลัสเตอร ซึ่งสามารถใชไดหลายแบบ
แตถาจะใชตัวที่มีมาใหกับ Spark เลยก็เปนตัว Standalone 
 
ทั้งหมดที่กลาวมานั้นแมขาจะไมไดรูเรื่องและทดลองทุกกระบวนทา แตถาจับหลักไดแลวก็พอจะไปตอ
ไดไมยากนัก ในเนื้อหาสวนนี้สรุปความไดวาจะตองใชตรงไหนอยางไรคราวๆ อยางนอยถาไมรูอะไรอยากให
จับใจความของ Spark Core ใหไดกอน และเนื่องจากการประมวลผลของ Spark นั้นมักจะประมวลผลขอมูล
ขนาดใหญหรือ Big Data ดังนั้นขาจะขอกลาวถึงเล็กนอยพอเปนพิธีรีตอง Big Data นั้นกลาวกันวาเปนขอมูล
ที่มีขนาดใหญจนไมสามารถประมวลผลไดบนเครื่องเดียว (มันเลยตองประมวลผลหลายเครื่องอันเปนที่มาของ
ระบบ Spark ที่สามารถทําเปนคลัสเตอรได) โดยทั่วไปเราจะจัดกลุมมันเปน Big Data นั้นมีเงือนไข 3V ราวๆ 
นี้ คือ 
- Volume​ บอกวามันมีขนาดใหญ ตรงนี้มันก็ไมไดมีขอกําหนดอะไรที่ชัดเจนวาเทาไหรถึงจะ
ใหญพอชวงแรกๆ เขาใจวา 19 GB นี่ก็ถือวาเยอะกันมากๆ แลว 
- Velocity​ คือขอมูลที่เราจะเอามาประมวลผลนั้นมันมีอัตราการเกิดขึ้นไดอยางรวดเร็ว กลาว
คือบางทีแตกอนเราเก็บแคขอมูลการซื้อ ถาอยากทําใหเปน Big Data นั้นอาจจะเก็บขอมูล
ทั้งหมดที่เขาเขามาไมวาจะเปนแหลงพี่พาเขาเขามาที่เปบเรา เขาเปรียบเทียบขอมูลตรงไหน
บาง เขาเปรียบเทียบอะไรกับอะไรบาง ซึ่งขอมูลเหลานี้จะกอใหเกิดคุณคามหาศาลไดใน
อนาคต เชนการนําเสนอโปรโมชั่นหรือใชทําการตลาดตอ 
- Variety​ ขอมูลที่ไดมานั้นมีรูปแบบหลากหลายอาจจะเปนขอมูล Logging จาก Web server 
ขอมูล Mouse focus ตางๆ เหลานี้อาจจะมีรูปแบบของขอมูลที่ไดมานั้นมีความหลากหลาย
ตามไปดวย 
ทั่ง 3V เหลานี้ขาอยากใหพวกเราเสี่ยวเออนั้นมองตาเบลอๆ ก็พอ อยาไปจริงจังกับมันนั้น อยาลืมวา
หนาที่เราคือเอาขอมูลออกมาประมวลผลเพื่อปรับปรุงโรงเตี๊ยมใหทันสมัยตอบโจทยจอมยุทธวัยโจไดอยางมี
ประสิทธิภาพก็เทานั้น เพราะถึงเทคโนโลยีจะกาวไปไกลแคไหนผูคนในยุทธภพก็ยังมีความตองการคลายๆ เดิม
อยูนั่นเอง และสําหรับเสี่ยวเออผูใดที่ยังลังเลสงสัยวาควรจะใช Spark ประมวลผล หรือเปลา ขอมูลเราเปน Big 
Data หรือไมนั้น ในยุกที่ผูคนสราง Data กันวันละหลาย GB ตอคน ก็ตองบอกไดเลยวา 
“ถาขอมูลมันยังไมใหญพอ ก็ทําใหมันใหญพอดิหวะ” 
 
 
 
 
 
 
เริ่มตนคนหากระบี่ 
ทุกปรมาจารยลวนมาจากเด็กฝกหัดฉันใด ทุกเซียนกระบี่ก็ลวน
มาจากมือกระบี่ฝกหัดฉันนั้น ดังนั้นอยาไดเนียมอายหากเจาไปเจอจอม
ยุทธที่มีวรยุทธมากมาย เขาก็อาจเคยเปนเสี่ยวเออมากอนเหมือนกัน แต
ถาไมมีเจาอาจจะไดเปนคนแรกใหกินเนสบุคเรคอรดไดนะ ซึ่งในบทนี้จะ
นําเสนอวิธีติดตั้ง Apache Spark โดยที่จะใชงานบน Cloud ของ 
Nipa.cloud​ ซึ่งสนับสนุน Cloud มาใหลองเลน จึงขอโอกาสซูฮกมา ณ ที่นี้ดวยขอรับ 
 
1) เขารวมยุทธภพ 
เพื่อไมใหเปนการตอความยาว สาวความยืด ขอเริ่มที่หลังจากสมัครเลยแลวกัน หลังจากที่เขามาให
ลองสรางเครื่องกอนโดยไปที่เมนู Create ดานบนขวา ซึ่งวิธีการที่ลองเลนนี้เปนวิธีที่พยายามทําใหงาย อาจจะ
ไมใชวิธีที่ดีที่สุด ดังนั้นถาพอจะมีเพลงกระบี่ติดตัวมาบางก็สามารถขามขั้นตอนไปไดตามอัธยาศัย 
 
 
 
 
 
หลังจากรอไมถึงนาทีเครื่องเราก็พรอมใชงานแลว 
 
 
 
เตรียมกระบี่ไมไผ 
หลังจากที่เราไดเครื่องเรียบรอยแลวก็สามารถเขาไปวิ่งเลนบนเครื่องซึ่งถาใครใช Windows ก็ตองติด
ตั้งโปรแกรมที่สามารถเชื่อมตอผานทาง SSH ไดเชน Putty แตถาใครใช Mac หรือ Linux อยูแลวก็โซโลไดเลย 
สิ่งที่ตองใชในการนี้ก็คือ JDK​ ซึ่งเปนตัวชุดพัฒนาซอฟตแวรของ Java, ตัว Scala​ ซึ่งเปนภาษาที่ใชในการ
พัฒนา Spark เราเลยจําเปนตองติดตั้ง และสุดทายก็ตัวของ Spark​ เองที่ตองดาวนโหลดจากเว็บไซต 
 
กอนอื่นขอแนะนําใหใชคําสั่ง $ sudo apt-get update​ ​เพื่ออัพเดทขอมูลของ Package สักรอบหนึ่ง
กอน จากนั้นติดตั้ง JDK Version 8 โดยใชคําสั่ง (เนื่องจากขอจํากัดบางประการ Spark อาจจะเกิดปญหาหาก
ใชกับ Java Version อื่นซึ่งอาจจะสรางปญหาใหกับมือใหมจึงขอใชเวอรชั่นที่ไมมีปญหานี้ไปกอน) 
$ sudo apt-get install openjdk​-8​-jdk
 
  
 
แลวก็ติดตั้ง Scala 
$ sudo apt-get install scala 
 
จากนั้นไปที่เว็บไซต Spark เพื่อดาวนโหลดไดที่ https://spark.apache.org/downloads.html  
 
กดตรงที่วงไววาเอาลิงคมา Download 
 
กด Copy Link Address จากนั้นเอาลิงคนี้มาดาวนโหลด 
$ wget
http:​//www-eu.apache.org/dist/spark/spark-2.3.2/spark-2.3.2-bin-hadoop2.
7.tgz  
 
จากนั้นแตกไฟลสั่ง 
$ tar xf spark​-2.3.2​-bin-hadoop2​.7​.tgz 
 
จากนั้น cd เขาไปใน spark ที่แตกไฟลออกมา แลวลองสั่งรัน Spark ใช 
$ ./bin/spark-shell 
 
ถาเห็นหนาจอแบบนี้ก็เปนอันวาใชได ซึ่ง Spark ก็มีมอนิเตอรใหเราแบบแกะกลองจากโรงงานดวย เราสามารถ
เขาถึงไดผานทาง IP ของเครื่องนั้นบนพอรต 4040 ขอรับ 
 
 
ลวดลายกระบี่ 
เมื่อเราไดกระบี่ไมไผมาสแลว เราก็สามารถซอมกระบี่ไดตามลวดลายตางๆ ซึ่งจะไดกลาวถึงตอไป แต
กอนอื่นขอแนะนําลักษะการใช ซึ่งจะคลายกับการใชงาน Lambda ใน Java นั่นเอง 
 
 
ชากอนพอหนุม !?! มันไมไดงายขนาดนั้น ขออธิบายยอนกลับไปนิดหนึ่งถามีแตคําสั่งสองคําสั่งนี้คืออานไฟล 
README.md แลวก็สั่งนับเลย 
val​ textFile = spark.read.textFile(​"README.md"​)
textFile.count() 
 
และถายังพอจําไดอยูบางวาเรามีตัวมอนิเตอรรันอยูที่พอรต 4040 หากเขาไปดูจะเห็นวามีคําสั่งรันอยูแคคําสั่ง
เดียว 
 
วอท ดา ฟาก!!! 
ที่เปนแบบนี้ก็เพราะวา Spark นั้นมีคําสั่งทั้งแบบการแปลง (Transformation) และการกระทํา (Action) การ
ประมวลผลจริงๆ นั้นจะเกิดขึ้นเมื่อมีการสั่งคําสั่งที่เปนการกระทํา การทํางานแบบนี้มีชื่อเรียกแบบจาบๆ วา 
Lazy Evaluation ทําใหเห็นเพียงงานเดียวในตัวมอนิเตอร 
การแปลง การดําเนินการประเภทนี้จะใหผลลัพธเปน RDD หรือ DataSet ตัวใหมกลับออกมา ซึ่ง 
RDD หรือ DataSet ตัวใหมจะมีรูปใหม เชน filter, map, union เปนตน ซึ่งยังไมเกิดการประมวลผลจริงกับ
ชุดขอมูลในการปฏิบัติงานขั้นตอนนี้ 
การกระทํา การดําเนินการประเภทนี้จะเปนการสั่งใหระบบทํางานประมวลผล ดังนั้นการประมวลผล
จะเกิดขึ้นหลังจากที่สั่งดําเนินการประเภทนี้ ตัวอยางคําสั่ง เชน collect, count เปนตน 
 
โอเค ถึงตอนนี้ขาจักไดอธิบายถึงตัวมอนิเตอร ซึ่งไมใชจะมองผานไปเฉยๆ ได เพราะตัวมอนิเตอรเองก็
มีสถานะหลายๆ อยางที่นาสนใจอยูเหมือนกัน มากเรามองดูที่งาน count ที่สั่งไป 
 
เมื่อกดดูดานใน จะเห็นขอมูลเปน Timeline ของการประมวลผลโดยในตอนแรกมีการเพิ่ม Executor เพื่อเขา
มาทํางานใหเรา ตอนนี้เราทราบเพียงวา Executor เปนตัวประมวลผลใหเราก็พอ สวนใน Stage 0 และ Stage 
1 ก็แสดงเวลาที่ใชในการประมวลผลแตาละ Stage นั่นเอง 
 
 
 
จะพบวามี 2 Stage หากเลือกดูแตละ Stage กํบจะเห็นไดวามีอะไรไมรูอยูขางใน ซึ่งจะขอใหทําตาเบลอๆ เอา
ไวกอนเพราะมันยังไมจะเปนตองเลาถึงนั่นเอง 
 
1) Wordcount 
โปรแกรมนับคําเปนเสมือน Hello, world สําหรับวงเกรียน Map Reduce เลยก็วาไดโดยที่การ
ทํางานของโปรแกรมก็มีราวๆ นี้ขอรับ 
 
 
 
2) Pi Estimation 
การประมาณคาพาย (Pi) เปนงานที่เปนลักษณะหนักไปทางประมวลผล ซึ่งงานหาคาพายเปนงานที่
ยอดฮิตมาหลายสมัยเทาที่ทราบลาสุดเราสามารถหาคาพายได 22 ลานลานตําแหนง (ไมไดเขียนผิด) ซึ่งตองใช
ฮารดดิสกเก็บราวๆ 9 เทระไบตดวยอัลกอริทึมชื่อ γ-cruncher แตชากอนเรามีวิธีงายๆ ที่จะคํานวณหาคา
พายไดเหมือนกันคือวิธีของ Monte Carlo 
 
 
 
import scala.math.random
val n = Int.MaxValue
val​ count = sc.parallelize(​1​ to n).filter { _ =>
​val​ x = math.random
​val​ y = math.random
x*x + y*y <= ​1
}.count()
println(s"Pi is roughly ${4.0 * count / n}")
(*** ถาวางโคดหลายบรรทัดไมไดลองสั่ง :paste กอน ***) 
ถัดมาลองดูคาผลลัพธ 
 
 
กําลังภายใน 
หลังจากที่ฝกหัดเบื้องตนไปแลว ในบทนี้จะไดกลาวถึงกําลังภายในที่กอตัวเปน Spark ซึ่งเนื้อหาบทนี้
จะคอนขางยากดังนั้นอาจจะตองใชการศึกษาขอมูลเพิ่มเติมจากแหลงอื่น และตองใชเวลาทําความเขาใจพอ
สมควรไมเชนนั้นหากวูวามไปธาตุไฟอาจจะเขาแทรกได 
หากจะกลาววา RDD เปนแกนแทของ Spark เลยก็คงไมใชการกลาวเกิดจริงเนื่องจากระบบภายใน
ของ Spark ยึดโยงอยูกับ RDD นี้เอง ตัว RDD ยอมาจาก Resilient Distributed Dataset กลาวคือ 
Resilient​ คือมีความยืดหยุนทําใหคงทนตอการประมวลผลผิดพลาด ทําใหระบบสามารถกูคืนขอผิด
พลาดได 
Distributed​ ทําใหสามารถกระจายการประมวลผลไปยังเครื่องหลายๆ เครื่อง 
Dataset​ เปนความสามารถของ RDD ที่จะจัดการขอมูลขนาดใหญหรือพารทิชันขอมูลได 
 
ดวยคุณสมบัติแหลานี้ทําให RDD นั้นสามารถที่จะประมวลผลแบบขนานไดนอกจากนี้ยังมัคุณสมบัติที่
นาสนใจบางประการเชน RDD นั้นมี Type หรือชนิดของตัวแปร, การประมวลผลของ RDD นั้นเปนแบบ 
Immutable, RDD พยายามเก็บขอมูลลงบนหนวยความจําเทาที่จะเปนไปได, RDD มีคุณสมบัติที่จะวางขอมูล
ขนโหนดที่มันคิดวาจะประมวลผลไดเร็วที่สุด และลักษณะการประมวลผลแบบ Lazy Evaluation ที่การ
ประมวลผลจริงจะเกิดเมื่อมีคําสั่งการกระทํา ดวยคุณสมบัติเหลานี้จึงทําใหการประมวลผลแบบกระจายของ 
Spark เปนไปได 
กอนจะไปเคล็ดวิชาถัดไป จักไดเลาถึง DataFrame กับ DataSet ซึ่งเปน API ที่เอาไวใชงานเปนรูป
แบบคลายกับการใชงาน RDD นั่นเอง ซึ่ง DataFrame นั้นตั้งอยูบนพี้นฐานของ RDD และ DataSet เองก็อยู
บนพื้นฐานของ DataFrame อีกที (ดูภาพปลากรอบได) ดังนั้นมารนอยทั้ง 3 นั้นจึงมีขอดีขอเสียแตกตางกันไป 
โดยที่ RDD นั้นสามารถควบคุมในระดับลางไดสะดวกกวา กลาวคือมันสามารถทํางานที่ตองใชความละเอียดได
ดีและยังสามารถใชจัดการขอมูลแบบไมมีโครงสรางได ซึ่งจะแตกตางกับ DataFrame และ DataSet ที่จะถูก
ใชจัดการกับขอมูลที่มีโครงสรางแนนอนและจัดอยูในรูปแบบคอลัมภได อยางไงเสีย DataFrame กับ DataSet 
นั้นเปนของที่ใกลเคียงกันมาก แต DataFrame นั้นไมมีชนิดตัวแปรโดยตัวของมันเอง ในทาวซอฟตแวรการ
ไมมีชนิดตัวแปรนี้ทําใหเกิดความงายในการเขียนโปรแกรมเพราะไมตองสนใจวามันเปนตัวแปรอะไร แตยากใน
การจัดการขอผิดพลาดเพราะการที่ไมรูวาชนิดขอมูลเปนแบบไหน มันก็จะไมสามารถเช็คความผิดพลาดตั้งแต
ตอนคอมไพน หรือ Compile time ไดนั่นเอง แตในอีกมุมหนึ่งหากเราใชขอมูลของ DataFrame ในมุมของ 
DataSet เราก็จะสามารถมองไดวา DataFrame มันคือ DataSet ของ Row หรือ DataSet[Row] นั่นเอง 
 
ถายังจําไดที่ขาไดเลาไปวาการทํางานของ Spark นั้นเกิดขึ้นจริงๆ ก็เมื่อมีการใชงานคําสั่งที่เปนพวก
การกระทํา เชน count() นั่นก็เปนเพราะวา Spark จะสราง Spark job ​ที่จะเอาไปประมวลผลจริงๆ ก็ตอนนี้
นี่เอง ซึ่งขั้นตอนการประมวลผลของมันก็คือสมมติวาเราเรียก count() แลวจากนั้น จะเกิด Job และ Job นั้น
ก็จะถูกสงไปยัง DAGScheduler ซึ่งจะทําหนาที่เปลี่ยน Logical Execution Plan ซึ่งเปนชื่อแบบจาบๆ ของ 
RDD lineage หรือสายการประมวลผลของ RDD นั้นไปสู Physical Execution Plan ซึ่งเปนแผนการ
ประมวลผลที่จะเกิดขึ้นจริงภายในระบบของ Spark โดย DAGScheduler จะงานออกเปน Stage เพื่อ
ประมวลผลซึ่งในแตละ Job อาจจะมีหลาย Stage และในแตหละ Stage อาจจะมีไดหลายๆ Task ซึ่ง Tasl นัี้
เองก็เกิดจาก Partition ของขอมูลที่ RDD นั้นแบงออกเปนสวนๆ เพื่อแยกกันใหเกิดการประมวลผลที่สามารถ
ขนานกันได โดยทั่วไปแลว Stage ของ Spark นั้นมี 2 แบบคือ ShuffleMapStage และ ResultStage ซึ่ง
เนื้อหาสวนนี้อาจจะซับซอนและไมจะเปนเกินไปที่จะกลาวถึง แตขอใหเขาใจหลักการทํางานของมันคือ
พยายามที่จะแปลงใหขอมูลแตละสวนแยกประมวลผลกันได ซึ่ง Task กับ Partition ซึ่งมีความสัมพันธกัน
นั่นเอง 
 
ตอไปเพื่อใหเกิดการประมวลผลเปนคลัสเตอรไดเราจึงตองทําความเขาใจถึง Spark Driver ซึ่งเแ็นสวน
ที่ใชในการควบคุมทั้งหมดของการประมวลผลของ Spark เลยทีเดียว ตัว Driver เองอาจจะอยูดานนอก หรือ
ในคลัสเตอรก็ได ความสําคัญของ Driver คือมันเปนคนที่สราง SparkContext และเก็บขอมูลในการติดตอ
ของโปรแกรมที่เราเขียนกับการประมวลผลในสวนตางๆ ของระบบ ดังนั้นทางที่ดีตัว Driver ควรอยูใน
คลัสเตอรเพื่อที่จะเชื่อมตอกันกับโหนดอื่นๆ ไดรวดเร็วดวย ไมงั้นการประมวลผลจะชาตามไปดวยนั่นเอง ซึ่ง 
Architecute ของระบบทั้งตอนที่เปนคลัสเตอรและแบบที่เปน local คอนขางจะคลายกันเพียงแตถาเปน 
local ก็เหมือนกันวาโหนดนั้นทําหนาที่เปนทุกๆ อยางใหเธอแลวนั่นเอง 
 
 
ประสานพลัง 
เมื่อเราเรียนรูเกี่ยวกับวิธีการประมวลผลแลว ก็จะพบวาการที่เอาของหลายๆ สวนพวกนี้ไปรวมไว
เครื่องเดียวกันมันอาจจะไมเวิรคก็ไดเปนไดและการประมวลผลก็อาจจะชานะ พอถึงจุดหนึ่งการประมวลผล
ขอมูลขนาดใหญก็ตองมีการ Scale Out ซึ่งเปนหลายๆ เครื่องชวนกันแทนการ Scale Up ที่ใชการเพิ่ม RAM 
เพิ่ม Disk อาจจะไมพอหรือไมคุม ในบทนี้จะไดกลาวถึงการเชื่อมตอกันเปนคลัสเตอรของ Spark 
ถาเราไมไดใ Cloud เราก็ตองไปติดตั้ง Spark ใหกับทุกเครื่องซึ่งวิธีก็ไมยาก ยอนกลับไปอานวิธีติดตั้ง
ได สวนถาใครใช Cloud อยูแลวปกติก็จะมีใหเลือก Clone จาก Snapshot อยูแลวก็สามารถใชตัวนั้นได เชน
ของ Nipa ทีขาใชอยู ซึ่งวิธีการจัดการ Cluster แบบที่จะเลาตอไปนี้เปนแบบ Spark Standalone Cluster 
 
อยาลืมเลือก Cloud Firewall เปน Allow All Port ดวยหละ พอกดสรางทีนี้เราก็จะมีเครื่องอยู 3 เครื่องแลว 
วิธีการสราง Cluster ก็งายมาก คือเขาไปใน Directory Spark ของเครื่องสักเครื่องหนึ่ง จากนั้นก็สั่ง 
$ ./sbin/start-master.sh 
 
เสร็จแลวสําหรับ Master หะ งายสัส!!! ตอไปเปนคิวของ Worker ที่เราอยากใหเปน 
$ ./sbin/start-slave.sh spark://ip-master:7077 
 
จากนั้นก็เปนลองเขาหนา WebUI ของ Spark Cluster ที่พอรต 8080 หนามันจะคลายกับที่เราเคยดูแตตัวนี้
จะเปนของ Cluster เลย 
 
จากภาพจะเห็นวามี Woker อยูสองตัวตามที่เราเพิ่มเขาไป เราลองประมวลผลโดยใชคลัสสเตอรกันบาง วิธีการ
ก็ไมยากคลายกับที่เราลอง Spark Shell แตคราวนี้กําหนดพารามิเตอรให Master มันชี้ไปที่ Spark Master ที่
เราตั้งคาไวนั่นเองวิธีการก็ไมยากขอรับ 
$ ./bin/spark-shell --master spark://ip-master:7077 
 
 
จากนั้นลองรันโปรแรมนับคําดู แลวเราลองดูที่ WebUI 
 
จะเห็นวามีโปรแกรมรันอยู ตัวนี้ถาเปน Spark Shell ไมตองตกใจวาทําไมมันไมอยูในสถานะ Complete 
Application เนื่องจาก Shell มันจะยังไมจบงานจนกวาจะออกจาก Shell นั้นเอง 
*** พึงระลึกวาการที่จะให Worker ทํางานไดนั้น Worker ก็ตองอานไฟลนั้นไดดวย และตัวอยางมันเปนไฟล 
README ที่มีอยูทุกเครื่องอยูแลวมันจึงไมมีปญหา *** 
เนื้อหาในสวนนี้ลองสราง Spark Standalone เทานั้นแตยังมีคลัสเตอรแบบอื่นใหลองสรางถาอยาก
ลองแตหากไมจําเปนตองเปลี่ยนอะไร Standalone ก็ทํางานไดดีเชนกัน 
 
 
แสวงพาย 
ถาทานอานมาถึงจุดนี้แลว ขาคิดวามันเปนจุดที่เกินกําลังจะเขียนอธิบายกันไดแลว หากเปรียบ
เปนการหัดจักรยานแลวหละก็ ทานไดเรียนรูวิธีขี่เรียบรอยแลว หากตองการขี่จักรยานเปนก็มีเพียงแคตอง
ฝกฝนดวยตัวเองแลว สุดทายนี้ขอใหทานคนพบเคล็ดมีชาที่ไมมีอยูในตํารานี้ และหวังหวาจะไดพบกันใหม และ
ในโอกาสนี้ขอซูฮกใหกับ 
 
 
 
คลาวดจาก Nipa.cloud​ ที่ใหเอามาลองใชสําหรับทําเอกสารเลมนี้ ละ ODDS ทีมทําซอฟตแวรที่เชื่อวาการทํา
ซอฟตแวรตองสนุกซึ่งก็เปอยางนั้นจริงๆ และที่ขาดไมไดเลยคือแลป SUT Aiyara Cluster ที่ทําใหไดเรียนรู
เรื่อง Spark และใชคลัสเตอรในชวงที่เรียน ป.โท อยู 
 
 
 

เสี่ยวเอ้อสอน Spark

  • 2.
    เสี่ยวเออสอน Spark  ในยุทธจักรการประมวลผลแบบกระจายหรือ Distributedcomputing นั้น หากผูใดไมรูจัก Apache  Spark แลวหละก็ตองถือวาผูนั้นมิใชมือกระบี่แตเปนเพียงเสี่ยวเออบารีสตาตามโรงเตี๊ยมก็เพียงเทานั้น แตทาน กลาววาหากผูใดรูถึงเคล็ดวิชาแลวไซรแมรางกายเปนเพียงเสี่ยวเออ แตลมปรานพรุงพลานดั่งเซียนกระบี่สวรรค  วิถีชีวิตเสี่ยวเออที่จักไดถายทอดวิชาในตําราลับเลมนี้ก็เพียงหวังวาจะไดเผยแพรวิทยายุทธใหเหลาเสี่ยวเออเอา ไวดูแลตนเองและอุปถัมภคํ้าชูยุทธภูมินี้สืบไป        เรื่องเลาของชาวยุทธ  “หนทางหมื่นลี้เริ่มที่กาวแรก” สุภาษิตจีนนี้ยอมใชไดกับความเกาของยุทธจักรที่จะไดมาเลาใหมใหสู กันฟง หายจะยอนจากจุดหมายปลายทางที่เราอยูกลับไปในอดีตก็จะทําใหเกิดความเขาใจในกาลปจจุบัน และ คาดเดาสิ่งที่จะเกิดขึ้นในอนาคตได ดังนั้นตําราเลมนี้จึงจักไดเลาถึงความเกาสักเล็กนอยพอไดอรรถรส    เปดยุทธจักร Distributed computing  หากจะศึกษาใหเปนขั้นเปนตอนสักเล็กนอยก็คงตองเอาความแตกตางกันระหวางคําที่มันความหมาย เกี่ยวของกันซะกอน โดยจักขอเริ่มที่คําวา Concurrency เสียกอน โดยความหมายของ Concurrency คือการ ที่เรามีงานสักงานหนีงแลวงานนั้นสามารถที่จะแบงซอยยอยๆ ไดเหมือนรัชดาซอย 3 สถานฑูตจีนถึง รัชดา ซอย 17 โพไซดอน ที่เราจะไปซอยไหนกอนก็ได (ลอเลน) จริงๆ แลวเรื่อง Concurrency นี่คุยวาเราสามารถ แบงงานเปนสวนๆ แลวคอยทําไดเชนหากเรามีนํ้าชาที่จะเสริฟแขกอยู มันตองอุนอยูตลอดเวลา แตถาหากวา เรามีเตาเดียวที่ตองนึ่งซาลาเปาไปดวย เราก็สามารถนึ่งซาลาเปาไปแพบหนึ่ง แลวก็สลับตมนํ้าชาแพบหนึ่ง พอ ทําแบบนี้แลวก็จะเห็นวาตอใหเถาแกมีแคเตาเดียวเราก็ยังสามารถทํางานไดสอบอยางอยูนะ แตอาจจะไมไดดี เทาไหรก็ตามมีตามเกิดไป  ทีนี้ถาเปน Parallelism หละก็มันจะเหมือนเถาแกใจดีที่ทําเตาใหเราหลายเตา สมมุติวาที่รานมีเตา เพิ่มมาเปนสองเตา เราก็สามารถคางหมอนึ่งซาลาเปาไปพรอมๆ กับอุนชาไปไดพรอมๆ กัน แตถาเถาแกขยาย รานไปอีกโดยการเพิ่มหมอนึ่งเปน 2 และเพิ่มหมอตมชาเปน 2 แลวจะสลับกันใชเตาถานที่มีอยูเพียงสองเตา แบบ Concurrency คือนึ่งซาลาเปาสลับกับตมชาก็บใชปญหาแตอยางใด จะเห็นวาที่จริงแลว Parallelism  กับ Concurrency ไมใชของอยางเดียวกันซะทีเดียว    กลับมาถึงเรื่องของ Distributed กันบาง แมจะใชคําที่ใชปนกันจนหมุนอุยปุย แตถึงยังไงมันก็ยังไมใช ของอยางเดียวกันอยูนั่นเอง ซึ่ง Distributed มันมักจะถูกพูดถึงในแนของตําแหนงที่ตั้งของทรัพยากรมากกวา  เชนสมมุติวาที่รานเถาแกเรามี 2 เตาแชรเตารวมกับรานอาซิ้มอีก 2 เตา แบบนี้ตําแหนงชองเตาอยูคนละที่กัน
  • 3.
    แตก็มีเปาหมายรวมกันคือการใหบริการลูกคา ซึ่งมันอาจจะถูกมองวาคลายๆ กับคลัสเตอร(Cluster) แตก็แตก ตางกันอยูบาง เพราะโดยทั่วไปแลว มักจะถูกกลาวถึงในลักษณะของกลุมของที่ทํางานแบบเดียวกันซึ่งในกรณีนี้ ถาจะกลาววาเตาที่รานเถาแกสองเตานั้นเปนหนึ่งคลัสเตอรและเตาที่รานอาซิ้มก็เปนอีกคลัสเตอรหนึ่งที่  Distributed กันอยูก็คงจะไมผิดแตประการใด  นี่ยังไมรวมถึง Cloud computing ที่พูดถึงเรื่องการใชทรัพยากรที่คนใชไมจําเปนตองสนใจ 4 หรือ 8  ใดๆ แคมีเงินจายก็พอ หรือ Grid computing ที่กลาวถึงการเอาทรัพยากรมาแชรกันตรงกลางระหวางหนวย งานตางๆ ตามนโยบายยุคกลางป ‘90s ที่บางทีขอใชงานไปแลวตั้งแต ป.ตรีจนจบ ป.เอก เพิ่งได Account เขา ใชที่ Install โปรแกรมใดๆ ไมได บนเครื่องที่แรงที่สุดในสมัยนั้นอยาง Pentium 4 (อสกข.) ในสวนนี้ยังมีราย ละเอียดปลีกยอยอีกเยอะไปอานเพิ่มดวยก็ดีนะ (เผื่อปรมาจารยมาอานทานจะบอกวามันบแมนๆ มันเปนแบบ อื่น พะนะ… ละเอียดกวานี้ก็หาอานเอาโลดสู)    มุมมองของความขนาน   เราจะเขาถึงศาสตรของการขนานไมไดเลย ถาเรายังไมเขาใจวาจะมองวามันขนานกันไดยังไง บังเอิญ ไปเจอตําราหนึ่งซึ่งมันดีมาก เลาถึงเรื่องวิธีคิดของการขนานกันซึ่งมีอยูสองสวนคือ การขนานกันของขอมูล  (Data parallelism) ​ซึ่งเปนเรื่องที่บอกวาถาเรามีฟงกชั่นเดียวกันก็สงไปหลายๆ ที่ใหชวยกันประมวลผลไดนี่ หวาถาการประมวลผลของเรามีแคบวกเลข แบบนี้เราจะแบงกันบวกก็ไมผิดกติกาใดๆ เชน ชุดขอมูล A =  A[1]+A[2] แบบนี้ถาแบงออกเปนชุดขอมูล B แลวก็แบง B = B[1]+B[2] ก็ยอมได เปรียบกับถาโรงเตี๊ยมของ เรามีสูตรการทําเสี่ยวหลงเปาและมีวัตถุดิบพอแลวหละก็เราจะสงไปใหพอครัวหลายๆ คนชวยกันทําก็ยิ่งจะ ทําใหอาหารที่ลูกคาสั่งเสร็จไดเร็วขึ้น  แตก็ยังมีการขนานอีกรูปแบบหนึ่งคือ การขนานกันของฟงกชัน (Function parallelism) วากันถึง เรื่องการแบงสวนงานที่ไมเกี่ยวของกันออกจากกัน แลวคอยนําผลลัพธมาประกอบกันทีหลังได เชน F = (A*B)  + (C*D) แบบนี้จะเห็นวาเอา A*B กับ C*D แยกกันทํางานก็ไมมีปญหาอะไร พอทั้งคูเสร็จแลวคอยเอามาบวก กันเพื่อไดผลลัพธสุดทาย เสมือนหนึ่งวาถาลูกคาสั่งนํ้าเตาหูปาทองโกแลวเสี่ยวเออผูนั้นก็สามารถใหเพื่อนสอง คนชวยโดยใหคนแรกไปเอานํ้าเตาหูจากเขาอากินะ อีกคนไปเอาปาทองโกจากเขาเหลียงซาน เสร็จแลวใสถาด เดียวกันเอามาเสริฟได  cc :​http://www.ku.ac.th/scc2009/SCC2009_advance.pdf     วิทยายุทธ MapReduce  จุดเริ่มตนเนื้อเรื่องอันวุนวายนี้เกิดจาก Google พรรคพี่ใหญในยุทธภพที่ตองการแสดงอานุภาพของ วิทยายุทธที่ใชภายในอยู ดวยการติพิมพเปเปอรเรื่อง MapReduce : Simplified Data Processing on  Large Clusters เมื่อป ค.ศ. 2004 โดยปา Jeffrey Dean และ Sanjay Ghemawat โดยเนื้อหาจะมีใจความ วา MapReduce เปนโมเดลการแกปญหาแบบนี้ที่ถาเราแบงปญหาออกใหอยูในรูปแบบนี้แลวเราจะสามารถ
  • 4.
    ประมวลผลขอมูลที่มีขนาดใหญไดโดยงาย เพราะรูปแบบการเขียนโปรแกรมทําใหสามารถเกิดการประมวลผล แบบ Parallelismไดอัตไนมัติ ฟงดูยากเติบอยูแตเดี๋ยวอธิบายใหฟง แตเดี๋ยวใหดูรูปภาพรวมกอน    จากภาพนี้จะเห็นวาหากเรามีหมูเห็ดเปดไกนํ้าตามรูปแลวหละก็ เราสามารถแยกออกเปนขอมูลสองสวน คือ สวนหนาเครื่องหมายคอมมา(,)และสวนหลังเครื่องหมายคอมมา (บอกเพื่อ?) นั่นแหละ จากนั้นเราก็จะสามารถ แปลงเปนอีกอยางได  ถาตามตัวอยางจะเห็นวาในขั้นตอนแรกมี Input กองกันอยู จากนั้นเราจะนําเอา Input ไปเขาฟงกชัน  Map​ ซึ่งเปนฟงกชันที่ทําหนาที่สราง Intermediate Key/Value pair พุนเด ชื่ออยางเทหจริงๆ ไมมีอะไรมัน ทําหนาที่สรางแมพของสวนหนาและสวนหลังจากที่ไมเคยมีอยู ถาเราดูภาพในสวน Input ที่อยูซายมือสุด  Map คือการเอาสัตวแตละตัวไปเขาคูซึ่งสวนหนาเปนสัตวตัวนั้นๆ และสวนหลังเปนตัวเลข 1 จากนั้นกลไกของ เฟรมเวิรค MapReduce ก็จะทําการ Shuffle ซึ่งขั้นตอนนี้เปนการพยายามที่จะจัดกลุมของขอมูลเอาไวดวย กัน จากภาพจะเห็นวาเสือและหมูนั้นมีอยางละ 2 ตัว ดังนั้นพอพยายามเอามารวมกันแบบงายๆ เลยไดสวน หลังเปนอาเรยของเลข 1 และเพราะวาขอมูลเรามีไดแคสองสนคือสวนแรกและก็สวนหลัง ถาเก็บเปนอาเรยตอ ใหขางในมีหลายตัวในมุมมองของระบบก็จะมองวามันเก็แคอารเรยตัวเดียวโดยไมไดสนใจของขางในวามีกี่ตัว    หลังจากนั้นก็จะเขาไปสูฟงกชันที่สองคือฟงกชัน Reduce​ ซึ่งเปนฟงกชันที่รับขอมูลมาจาก  Intermediate Key/Value pair หลังจากผานกลไก Shuffle แลวเขามาเพื่อทําการลดรูปใหเปนอีกรูปหนึ่ง ซึ่ง ในรูปตัวอยางสัตวพวกนี้เปนการนับจํานวน ซึ่งหนาที่ของฟงกชัน Reduce คือเอาอาเรยตัวหลังมาบวกกันทุก ตัวทําใหรูวาสัตวแตละชนิดมีกี่ตัวและจะเห็นวาการแยกแบบนี้ทําใหสามารถประมวลผลขนานกันไปได เพราะ
  • 5.
    การประมวลผลนั้นไมจะเปนตองไปยุงเกี่ยวกับสวนอื่นเราเลยสามารถนับจํานวนหมูเห็ดเปดไกนํ้าเตาปูปลาได นั่นเอง  เพื่อใหงงมากยิ่งขึ้นจักไดอธิบายเพิ่มเติมสักนิดหากโรงเตี๊ยมเราเปดเฟรนไซนขึ้นมามีหลายสาขาแลว เถาแกอยากรูวาคนที่ซื้อเยอะที่สุดนี่เขาซื้อกี่บาท เสี่ยวเออแบบเราๆ ก็จัดใหปาแกไดจากการคนตั๋วสั่งอาหาร จากนั้นเอามาลงบันทึกเรยงกันไดความแบบนี้    โรงเตี๊ยมแปะสาขาเขาเหลียงซาน, 32, 21/3/2018 18:00  โรงเตี๊ยมแปะ สาขาเขาเหลียงซาน, 102, 1/4/2018 20:00  โรงเตี๊ยมแปะ สาขาพรรคกระยาจก, 199, 1/4/2018 20:00  โรงเตี๊ยมแปะ สาขาบูตึ้ง, 500 ,5/5/2016 10:00    จากนั้นเราก็สราง Map โดยตัดคําที่เราไมตองใชออกจะไดของหนาตาประมาณนี้เปน Intermediate  Key/Value pair    (สาขาเขาเหลียงซาน, 32)  (สาขาเขาเหลียงซาน, 102)  (สาขาพรรคกระยาจก, 199)  (สาขาบูตึ้ง, 500)    เสร็จแลวระบบของ MapReduce ก็จะทําขั้นตอนการ Shuffle ไดหนาตาของ Intermediate Key/Value  pair ประมาณนี้    (สาขาเขาเหลียงซาน, [32,102])  (สาขาพรรคกระยาจก, 199)  (สาขาบูตึ้ง, 500)    จากนั้นก็เอาไปเขาฟงกชัน Reduce ซึ่งฟงกชันนี้เรากําหนดใหหาตัวที่มากที่สุดเอาไว สุดทายก็จะไดหนาตา แบบนี้ออกมา    (สาขาเขาเหลียงซาน, 102)  (สาขาพรรคกระยาจก, 199)  (สาขาบูตึ้ง, 500) 
  • 6.
      อยางไรเสีย MapReduce ที่เราพูดกันตั้งแตตนถึงตอนนี้นั้นยังเปนแนวคิดการเขียนโปรแกรมซึ่งผูพัฒนาอาจจะ เลือกทําตามไมทําตามหรือเพิ่มเติมในบางสวนได แตหลักใหญใจความก็ยังจะวนๆ ถึงการแยกขอมูลเปนคู  Key กับ Value (หรือสวนหนากับสวนหลังนั่นแหละ) และหวัใจอีกอยางคือการที่มีฟงกชัน Map และฟงกชัน  Reduce นั่นเอง    กอกําเนิด Hadoop  จะไมพูดถึง Apache Hadoop ก็ดูจะไมใหเกียรติกัน เพราะวาหลายๆ เจาตอนนี้ก็ยังรัน Hadoop กัน อยู ตัว Hadoop นั้นถือวาเปตตัวบุกเบิกการนํา MapReduce ไปใชงานในวงกวางเลยแหละ เนื่องจาก  Google เปดเผยการใช GFS มาในเอกสาร The Google File System และ MapReduce มาในเอกสาร  MapReduce : Simplified Data Processing on Large Clusters ก็จริงแตไมไดเปดตัวโคดมาใหดวย  (Dafuq!!) ก็เลยมีจอมยุทธพอลูกออนชื่อวา Doug Cutting และเพื่อนรวมงาน Mike Cafarella จาก Yahoo  ซึ่งแตกอนก็ทํา Apache Nutch (เปน Search-engine โปรเจกโดย Yahoo และเปนโปรเจกยอยของ  Apache Lucene อีกทีหนึ่ง) ทํา Apache Nutch ไปๆ มาๆ ดังแลวเลยแยกวงเปน Apache Hadoop ใช โลโกเปนรูปชางสีเหลืองและชื่อ Hadoop นี่เองก็ไดไอเดียมาจากของเลนลูกของ Doug ซึ่งงายตอการออก เสียง เกร็ดเล็กนอยของการตั้งชื่อนี้ก็คือคําวา Googol ที่หมายถึงเลขจํานวนมหาศาล (ใชอธิบายความแตกตาง วามากมหาศาลกับความเปนอนันตนั้นไมเทากัน) คําวา Googol มันถูกนิยามวาเลข 1 แลวตามดวย 0 จํานวน  100 ตัว ซึ่งคํานี้มาจากหลานชายวัย 9 ขวบของนักคณิตศาสตร Edward Kasner ซึ่ง Larry Page จาก  Google นั้นชื่นชมในตัวเขาจึงตองการใช Googol เปนชื่อโดเมน แต Sean Anderson เพื่อนของเขาพิมพผิด เปน Google.com แต Page ก็เห็นวาชื่อนี้วางอยู และเขาเองก็ชอบดวยเลยเลือกใชชื่อนี้        ตัว Hadoop ทั้ง Stack มีตัวประกอบหลักๆ คือ  Hadoop Common ​เปน Library และพวกการทํางานพื้นฐานไวใหตัวอื่นเรียกใช  Hadoop Distributed File System (HDFS) ​เปนระบบไฟลแบบกระจายเก็บขอมูลไวบนหลายๆเครื่อง 
  • 7.
    Hadoop YARN ​เปนตัวจัดวางงาน  HadoopMapReduce​ ตัวที่ใชประมวลผลขอมูลแบบ MapReduce    เปดตํานาน Apache Spark  หากจะเรียนรูเคล็ดวิชาใหถึงรากถึงแกนนั้นประวัติที่มาของเคล็ดวิชาก็มิ อาจมองขามไปดวยเห็นวาเปลาประโยนชเสียทีเดียว สําหรับเคล็ดวิชา Apache  Spark นี้ก็ตองขอเลายอนไปถึงประวัติการกอกําเนิดวาเริ่มตั้งแตป ค.ศ. 2009  โดย RAD Lab ซึ่งภายหลังเปลี่ยนเปนชื่อ AMPLab ซึ่งเปนหนวยงานในสังกัด ของมหาลัย UC Berkeley เคล็ดวิชานี้ไดเริ่มประสานลมปรานโดยจอมยุทธ นามวา Matei Zaharia ถัดมาหนึ่งปคือ ค.ศ. 2010 ก็ไดเปดเปนโอเพนซอส ภายใตสัญญาอนุญาตแบบ BSD จากนั้นชวงเดือนมิถุนา ค.ศ. 2013 ไดบริจาคใหกับมูลนิธิซอฟตแวร Apache  (ASF) ทําใหเวลาเรียกขานสามารถใชไดทั้ง Apache Spark หรือ Spark เฉยๆ ก็ได จะเห็นวาการเรียก ซอฟตแวรมี Apache นําหนานี้ก็เนื่องมาจากเปนซอฟตแวรที่อยูภายใชการดูแลขององคกรแลวนั่นเอง ลักษณะ การประมวลผลแบบ MapReduce ของ Spark นั้นจะใกลเคียงกับ Hadoop อยางมาก แตก็มีบางสวนที่  Spark ชวยใหการประมวลผลมีประสิทธิภาพมากขึ้น โดยที่ตัว Spark เองนั้นใชหนวยความจําเปนหลักแตใน สวนของ Hadoop นั้นมุงเนนไปที่ฮารดดิสกเปนหลัก ตัว Spark เองนั้นสรางมาจากภาษา Scala ซึ่งเปนภาษา ที่การทํางานนั้นรันอยูบน Java Virtual Machine หรือ JVM เชนเดียวกันกับ Java ทําใหสามารถใช Java  เชื่อมตอได นอกจากนี้ Spark เองยังรองรับการเชื่อมตอผานทางภาษา Python อีกดวย ออๆ ประวัติคนสราง นี่ก็ไมธรรมดานะ ไอหมอนี่เคยไดรางวัลที่ 3 การแขง ACM-ICPC ระดับโลกเมื่อป ค.ศ. 2005 มาแลว และ นอกจากจะเปนคนสราง Spark แลวอัลกอริทึมจัดการงานของ Hadoop เองก็เปนฝมือของเขา ออๆ เขาเปน หนึ่งในคนสราง Apache Mesos ดวยนะ        รวบรวมลมปราน  วากันในหมูชาวยุทธวาหากจะเขาใจถึงแกนของสิ่งใดนั้นตองประกอบกันทั้งบูและบุน ทําใหวรยุทธกับ ลมปรานรวมเปนหนึ่งจึงใชพลังนั้นไดอยางแทจริง ในการเรียนรูการศึกษากับการปฏิบัตินั้นหากไดทําคูกันแลว ทานวาจะเกิดอานุภาพของการเรียนรูไดเต็มที่ ตําราเลมนี้จึงมีสวนที่เปนทั้งบูคือการปฏิบัติและทฤษฎีที่มี เนื้อหาเลาอธิบาย เปรียบดังการขับจักรยานที่เราไมสามารถขับไดโดยอานเพียงตําราไมไดหัดซอม และเราจัก เสี่ยงอันตรายหากหัดขับโทยไมศึกษาวิธี    เคล็ดวิชา Apache Spark คืออะไร ? 
  • 8.
    ซอฟตแวร Apache Sparkเปนเฟรมเวิรคแบบโอเพนซอสที่ใชประมวลผลขอมูลแบบกระจายที่มี ลักษณะการประมวลผลแบบทั่วไป พอแปลตรงๆ แลวฟงดูแปลกๆ แตใหเขาใจวามันไมไดถูกออกแบบมาเพื่อ งานใดโดยเฉพาะ มันจึงสามารถถูกปรับใชไดกับงานหลายๆ อยาง ซึ่งโดยปกติแลวคาเริ่มตนของมันถูกกําหนด ใหประมวลผลบนหนวยความจํา และหนวยความจําที่กลาวถึงตอไปก็จะเปนพวก RAM อะนะ (เดี๋ยวโดนวา หนวยความจํามีหลายแบบ บลาๆๆ) เอาตอ! ทีนี้ Spark เองก็สนับสนุนใหเกิดพวก ETL หรือ Extract -  Transform - Load นะ ซึ่ง Extract คือขั้นตอนการเอาขอมูลจากแหลงอื่นที่อาจจะมีรูปแบบการเก็บแตตาง กัน มา Transform ใหเปนรูปแบบที่เราอยากได จากนั้น Load เขาไปเก็บใน Data warehouse ซึ่งตัว Spark  เองก็สามารถทํากลไก ETL ที่กลาวไปนี้ได หรือจะทําการวิเคราะหขอมูล การทํา Machine learning รวมทั้ง การประมวลผลแบบกราฟ ซึ่งทั้งตัว Batch บนขอมูลที่ถูกเก็บอยูแลวและตัว Streaming บนขอมูลที่มีการ เปลี่ยนแปลงตามเวลาเปน Time series ไดดวย    จากภาพจะขอโฟกัสไปที่ตัวขนมชั้นที่อยูตรงกลางคือชั้นที่เปนของ Spark Core ซึ่งเปนหัวใจของเคล็ดวิชาซึ่ง เกือบทั้งหมดของตําราเลมนี้ก็จะวากันดวยเรื่อง Spark Core นี่เอง จากนั้นขอใหยายหางตาไปเหลือบมองดาน บนที่เปนสวน เสร็จแลวจึงจะเหลาดานลางตอไป    Spark Core​ สวนนี้เรียกไดวาเปนหัวใจของ Spark เลยก็วาไดเนื่องจากวาเปนตัวที่ใชเอาใหใหสวนอื่นๆ ที่เปน สวนประกอบยอยที่เปนไลบรารี่ เชน Spark SQL หรือ MLlib เขามาติดตอเพื่อใชงาน หรือเราจะใชวิธีเขียน โคดเพื่อเชื่อมตอกับ Spark เขาไปตรงๆ ก็ไดเหมือนกัน โดยที่กลไกการจัดการเชน Scheduler ที่เอาไวจัดการ งาน รวมทั้งกลไกการจัดการหนวยความจํา กลไกกูคืนขอผิดพลาดลวนแตอยูในสวนนี้ทั้งสิ้น   
  • 9.
    Spark SQL ​กระบวนทานี้ใชสําหรับจอมยุทธทานใดที่อยากใชSQL หรือ HQL (Hive Query Language)  เรียกใชขอมูลก็แสนจะสะดวกสบาย แตก็มีขอแมนะวาขอมูลที่จะเอามาประมวลผลจะตองเปนขอมูลที่อยูในรูป แบบมีโครงสราง ดังนั้นจึงใชไดกับตัวแปรพวก DataFrame หรือ DataSet ซึ่งจะไดอธิบายตอไป นอกจากนี้ แลว Spark SQL ยังใชวิธีนําเขาขอมูลแบบเดียวกันไดไมวาจะเปนรูปแบบขอมูล Hive, Avro, Parquet. ORC,  JSON หรือกระทั้ง JDBC และนอกจากนี้ตัวมันยังมีโหมดที่สามารถใหเครื่องมือที่เปน Business Intelligence  (BI) เชื่อมตอเขามาผานทาง JDBC หรือ ODBC เพื่อประมวลผลขอมูลไดอีกตะหาก    Spark Streaming​ ปกติการประมวลผลของ Spark นั้นก็จะทํางาน Workload ที่เแ็นลักษณะของ Batch  job คืองานที่เปนงานประมวลผลกับขอมูลนิ่งๆ โดยประมวลผลเปนรอบๆ แตถาเราตองการประมวลผลขอมูล ที่ไมนิ่งเชนเราอยากวิเคราะห Log ของเซอรเวอรเพื่อนนําเสนอโปรโมชั่นใหลูกคาแบบ Real time นี่เราก็ ตองการเอาขอมูลมาวิเคราะหทันทีเลย ดังนั้น Spark Streaming จึงถูกออกแบบมาให Spark สามารถ ประมวลผลขอมูลแบบ Real time ได โดยที่ Operation คุณสมบัตรคงทนตอความลมเหลวที่ทําไดบน Batch  ก็เรียกไดวา Streaming มีเหมือนกันเกือบทั้งหมด ละยังสามารถเชื่อมตอกับพวก HDFS, Flume, Twitter,  RabbitMQ หรือ Kafka ได    MLlib​ ใชประมวลผล Machine learning โดยที่ตัวไลบรารี่เองก็มีอัลกอริทึมบางตัวใหเลือกใชไดอยางสะดวก ไมวาจะเปนพวก Regression, Classification, Clustering หรือ Collaborative filtering ซึ่งการประมวลผล เหลานี้สามารถเอาเขาไปประมวลผลที่คลัสเตอรของ Spark ได    GraphX ​ตัวนี้เปนไลบรารี่ที่ใชในการประมวลผลขอมูลแบบกราฟ ทําใหเราสามารถจัดการกับขอมูลแบบกราฟ มีทิศทางได เราสามารถใชกับอัลกอริทึมบางประเภทไดเชน Triangle counting หรืออัลกอริทึมยอดนิยมที่เคย ใชใน Seach engine ของ Google และตั้งชื่อตาม Larry Page วา PageRank ซึ่งเปนลักษณะการใหนํ้าหนัก ขอมูลตามลักษณะของกราฟนั่นเอง    Cluster managers (Standalone | YARN | Mesos)​ ตัว Spark เองนั้นสามารถรันแบบ Local mode  คือรันบนเครื่ืองของเราอยางเดียวไมเกี่ยวกับใครได แตวาถาจะใหดีการประมวลผลนั้นควรใชเครื่องหลายๆ  โหนดชวยกันประมวลผล แตการจะทําแบบนั้นไดตองมีตัวจัดการระบบคลัสเตอร ซึ่งสามารถใชไดหลายแบบ แตถาจะใชตัวที่มีมาใหกับ Spark เลยก็เปนตัว Standalone    ทั้งหมดที่กลาวมานั้นแมขาจะไมไดรูเรื่องและทดลองทุกกระบวนทา แตถาจับหลักไดแลวก็พอจะไปตอ ไดไมยากนัก ในเนื้อหาสวนนี้สรุปความไดวาจะตองใชตรงไหนอยางไรคราวๆ อยางนอยถาไมรูอะไรอยากให จับใจความของ Spark Core ใหไดกอน และเนื่องจากการประมวลผลของ Spark นั้นมักจะประมวลผลขอมูล
  • 10.
    ขนาดใหญหรือ Big Dataดังนั้นขาจะขอกลาวถึงเล็กนอยพอเปนพิธีรีตอง Big Data นั้นกลาวกันวาเปนขอมูล ที่มีขนาดใหญจนไมสามารถประมวลผลไดบนเครื่องเดียว (มันเลยตองประมวลผลหลายเครื่องอันเปนที่มาของ ระบบ Spark ที่สามารถทําเปนคลัสเตอรได) โดยทั่วไปเราจะจัดกลุมมันเปน Big Data นั้นมีเงือนไข 3V ราวๆ  นี้ คือ  - Volume​ บอกวามันมีขนาดใหญ ตรงนี้มันก็ไมไดมีขอกําหนดอะไรที่ชัดเจนวาเทาไหรถึงจะ ใหญพอชวงแรกๆ เขาใจวา 19 GB นี่ก็ถือวาเยอะกันมากๆ แลว  - Velocity​ คือขอมูลที่เราจะเอามาประมวลผลนั้นมันมีอัตราการเกิดขึ้นไดอยางรวดเร็ว กลาว คือบางทีแตกอนเราเก็บแคขอมูลการซื้อ ถาอยากทําใหเปน Big Data นั้นอาจจะเก็บขอมูล ทั้งหมดที่เขาเขามาไมวาจะเปนแหลงพี่พาเขาเขามาที่เปบเรา เขาเปรียบเทียบขอมูลตรงไหน บาง เขาเปรียบเทียบอะไรกับอะไรบาง ซึ่งขอมูลเหลานี้จะกอใหเกิดคุณคามหาศาลไดใน อนาคต เชนการนําเสนอโปรโมชั่นหรือใชทําการตลาดตอ  - Variety​ ขอมูลที่ไดมานั้นมีรูปแบบหลากหลายอาจจะเปนขอมูล Logging จาก Web server  ขอมูล Mouse focus ตางๆ เหลานี้อาจจะมีรูปแบบของขอมูลที่ไดมานั้นมีความหลากหลาย ตามไปดวย  ทั่ง 3V เหลานี้ขาอยากใหพวกเราเสี่ยวเออนั้นมองตาเบลอๆ ก็พอ อยาไปจริงจังกับมันนั้น อยาลืมวา หนาที่เราคือเอาขอมูลออกมาประมวลผลเพื่อปรับปรุงโรงเตี๊ยมใหทันสมัยตอบโจทยจอมยุทธวัยโจไดอยางมี ประสิทธิภาพก็เทานั้น เพราะถึงเทคโนโลยีจะกาวไปไกลแคไหนผูคนในยุทธภพก็ยังมีความตองการคลายๆ เดิม อยูนั่นเอง และสําหรับเสี่ยวเออผูใดที่ยังลังเลสงสัยวาควรจะใช Spark ประมวลผล หรือเปลา ขอมูลเราเปน Big  Data หรือไมนั้น ในยุกที่ผูคนสราง Data กันวันละหลาย GB ตอคน ก็ตองบอกไดเลยวา  “ถาขอมูลมันยังไมใหญพอ ก็ทําใหมันใหญพอดิหวะ”              เริ่มตนคนหากระบี่  ทุกปรมาจารยลวนมาจากเด็กฝกหัดฉันใด ทุกเซียนกระบี่ก็ลวน มาจากมือกระบี่ฝกหัดฉันนั้น ดังนั้นอยาไดเนียมอายหากเจาไปเจอจอม ยุทธที่มีวรยุทธมากมาย เขาก็อาจเคยเปนเสี่ยวเออมากอนเหมือนกัน แต ถาไมมีเจาอาจจะไดเปนคนแรกใหกินเนสบุคเรคอรดไดนะ ซึ่งในบทนี้จะ นําเสนอวิธีติดตั้ง Apache Spark โดยที่จะใชงานบน Cloud ของ 
  • 11.
    Nipa.cloud​ ซึ่งสนับสนุน Cloudมาใหลองเลน จึงขอโอกาสซูฮกมา ณ ที่นี้ดวยขอรับ    1) เขารวมยุทธภพ  เพื่อไมใหเปนการตอความยาว สาวความยืด ขอเริ่มที่หลังจากสมัครเลยแลวกัน หลังจากที่เขามาให ลองสรางเครื่องกอนโดยไปที่เมนู Create ดานบนขวา ซึ่งวิธีการที่ลองเลนนี้เปนวิธีที่พยายามทําใหงาย อาจจะ ไมใชวิธีที่ดีที่สุด ดังนั้นถาพอจะมีเพลงกระบี่ติดตัวมาบางก็สามารถขามขั้นตอนไปไดตามอัธยาศัย       
  • 12.
        หลังจากรอไมถึงนาทีเครื่องเราก็พรอมใชงานแลว        เตรียมกระบี่ไมไผ  หลังจากที่เราไดเครื่องเรียบรอยแลวก็สามารถเขาไปวิ่งเลนบนเครื่องซึ่งถาใครใช Windows ก็ตองติด ตั้งโปรแกรมที่สามารถเชื่อมตอผานทางSSH ไดเชน Putty แตถาใครใช Mac หรือ Linux อยูแลวก็โซโลไดเลย  สิ่งที่ตองใชในการนี้ก็คือ JDK​ ซึ่งเปนตัวชุดพัฒนาซอฟตแวรของ Java, ตัว Scala​ ซึ่งเปนภาษาที่ใชในการ พัฒนา Spark เราเลยจําเปนตองติดตั้ง และสุดทายก็ตัวของ Spark​ เองที่ตองดาวนโหลดจากเว็บไซต 
  • 13.
      กอนอื่นขอแนะนําใหใชคําสั่ง $ sudoapt-get update​ ​เพื่ออัพเดทขอมูลของ Package สักรอบหนึ่ง กอน จากนั้นติดตั้ง JDK Version 8 โดยใชคําสั่ง (เนื่องจากขอจํากัดบางประการ Spark อาจจะเกิดปญหาหาก ใชกับ Java Version อื่นซึ่งอาจจะสรางปญหาใหกับมือใหมจึงขอใชเวอรชั่นที่ไมมีปญหานี้ไปกอน)  $ sudo apt-get install openjdk​-8​-jdk        แลวก็ติดตั้ง Scala 
  • 14.
    $ sudo apt-getinstall scala    จากนั้นไปที่เว็บไซต Spark เพื่อดาวนโหลดไดที่ https://spark.apache.org/downloads.html     กดตรงที่วงไววาเอาลิงคมา Download 
  • 15.
      กด Copy LinkAddress จากนั้นเอาลิงคนี้มาดาวนโหลด  $ wget http:​//www-eu.apache.org/dist/spark/spark-2.3.2/spark-2.3.2-bin-hadoop2. 7.tgz     จากนั้นแตกไฟลสั่ง  $ tar xf spark​-2.3.2​-bin-hadoop2​.7​.tgz    จากนั้น cd เขาไปใน spark ที่แตกไฟลออกมา แลวลองสั่งรัน Spark ใช  $ ./bin/spark-shell 
  • 16.
      ถาเห็นหนาจอแบบนี้ก็เปนอันวาใชได ซึ่ง Sparkก็มีมอนิเตอรใหเราแบบแกะกลองจากโรงงานดวย เราสามารถ เขาถึงไดผานทาง IP ของเครื่องนั้นบนพอรต 4040 ขอรับ      ลวดลายกระบี่ 
  • 17.
    เมื่อเราไดกระบี่ไมไผมาสแลว เราก็สามารถซอมกระบี่ไดตามลวดลายตางๆ ซึ่งจะไดกลาวถึงตอไปแต กอนอื่นขอแนะนําลักษะการใช ซึ่งจะคลายกับการใชงาน Lambda ใน Java นั่นเอง      ชากอนพอหนุม !?! มันไมไดงายขนาดนั้น ขออธิบายยอนกลับไปนิดหนึ่งถามีแตคําสั่งสองคําสั่งนี้คืออานไฟล  README.md แลวก็สั่งนับเลย  val​ textFile = spark.read.textFile(​"README.md"​) textFile.count() 
  • 18.
      และถายังพอจําไดอยูบางวาเรามีตัวมอนิเตอรรันอยูที่พอรต 4040 หากเขาไปดูจะเห็นวามีคําสั่งรันอยูแคคําสั่ง เดียว    วอทดา ฟาก!!!  ที่เปนแบบนี้ก็เพราะวา Spark นั้นมีคําสั่งทั้งแบบการแปลง (Transformation) และการกระทํา (Action) การ ประมวลผลจริงๆ นั้นจะเกิดขึ้นเมื่อมีการสั่งคําสั่งที่เปนการกระทํา การทํางานแบบนี้มีชื่อเรียกแบบจาบๆ วา  Lazy Evaluation ทําใหเห็นเพียงงานเดียวในตัวมอนิเตอร  การแปลง การดําเนินการประเภทนี้จะใหผลลัพธเปน RDD หรือ DataSet ตัวใหมกลับออกมา ซึ่ง  RDD หรือ DataSet ตัวใหมจะมีรูปใหม เชน filter, map, union เปนตน ซึ่งยังไมเกิดการประมวลผลจริงกับ ชุดขอมูลในการปฏิบัติงานขั้นตอนนี้  การกระทํา การดําเนินการประเภทนี้จะเปนการสั่งใหระบบทํางานประมวลผล ดังนั้นการประมวลผล จะเกิดขึ้นหลังจากที่สั่งดําเนินการประเภทนี้ ตัวอยางคําสั่ง เชน collect, count เปนตน 
  • 19.
      โอเค ถึงตอนนี้ขาจักไดอธิบายถึงตัวมอนิเตอร ซึ่งไมใชจะมองผานไปเฉยๆได เพราะตัวมอนิเตอรเองก็ มีสถานะหลายๆ อยางที่นาสนใจอยูเหมือนกัน มากเรามองดูที่งาน count ที่สั่งไป    เมื่อกดดูดานใน จะเห็นขอมูลเปน Timeline ของการประมวลผลโดยในตอนแรกมีการเพิ่ม Executor เพื่อเขา มาทํางานใหเรา ตอนนี้เราทราบเพียงวา Executor เปนตัวประมวลผลใหเราก็พอ สวนใน Stage 0 และ Stage  1 ก็แสดงเวลาที่ใชในการประมวลผลแตาละ Stage นั่นเอง     
  • 20.
      จะพบวามี 2 Stageหากเลือกดูแตละ Stage กํบจะเห็นไดวามีอะไรไมรูอยูขางใน ซึ่งจะขอใหทําตาเบลอๆ เอา ไวกอนเพราะมันยังไมจะเปนตองเลาถึงนั่นเอง    1) Wordcount  โปรแกรมนับคําเปนเสมือน Hello, world สําหรับวงเกรียน Map Reduce เลยก็วาไดโดยที่การ ทํางานของโปรแกรมก็มีราวๆ นี้ขอรับ 
  • 21.
          2) Pi Estimation  การประมาณคาพาย(Pi) เปนงานที่เปนลักษณะหนักไปทางประมวลผล ซึ่งงานหาคาพายเปนงานที่ ยอดฮิตมาหลายสมัยเทาที่ทราบลาสุดเราสามารถหาคาพายได 22 ลานลานตําแหนง (ไมไดเขียนผิด) ซึ่งตองใช
  • 22.
    ฮารดดิสกเก็บราวๆ 9 เทระไบตดวยอัลกอริทึมชื่อγ-cruncher แตชากอนเรามีวิธีงายๆ ที่จะคํานวณหาคา พายไดเหมือนกันคือวิธีของ Monte Carlo   
  • 23.
  • 24.
    val n =Int.MaxValue val​ count = sc.parallelize(​1​ to n).filter { _ => ​val​ x = math.random ​val​ y = math.random x*x + y*y <= ​1 }.count() println(s"Pi is roughly ${4.0 * count / n}") (*** ถาวางโคดหลายบรรทัดไมไดลองสั่ง :paste กอน ***)  ถัดมาลองดูคาผลลัพธ      กําลังภายใน  หลังจากที่ฝกหัดเบื้องตนไปแลว ในบทนี้จะไดกลาวถึงกําลังภายในที่กอตัวเปน Spark ซึ่งเนื้อหาบทนี้ จะคอนขางยากดังนั้นอาจจะตองใชการศึกษาขอมูลเพิ่มเติมจากแหลงอื่น และตองใชเวลาทําความเขาใจพอ สมควรไมเชนนั้นหากวูวามไปธาตุไฟอาจจะเขาแทรกได  หากจะกลาววา RDD เปนแกนแทของ Spark เลยก็คงไมใชการกลาวเกิดจริงเนื่องจากระบบภายใน ของ Spark ยึดโยงอยูกับ RDD นี้เอง ตัว RDD ยอมาจาก Resilient Distributed Dataset กลาวคือ  Resilient​ คือมีความยืดหยุนทําใหคงทนตอการประมวลผลผิดพลาด ทําใหระบบสามารถกูคืนขอผิด พลาดได  Distributed​ ทําใหสามารถกระจายการประมวลผลไปยังเครื่องหลายๆ เครื่อง  Dataset​ เปนความสามารถของ RDD ที่จะจัดการขอมูลขนาดใหญหรือพารทิชันขอมูลได    ดวยคุณสมบัติแหลานี้ทําให RDD นั้นสามารถที่จะประมวลผลแบบขนานไดนอกจากนี้ยังมัคุณสมบัติที่ นาสนใจบางประการเชน RDD นั้นมี Type หรือชนิดของตัวแปร, การประมวลผลของ RDD นั้นเปนแบบ  Immutable, RDD พยายามเก็บขอมูลลงบนหนวยความจําเทาที่จะเปนไปได, RDD มีคุณสมบัติที่จะวางขอมูล ขนโหนดที่มันคิดวาจะประมวลผลไดเร็วที่สุด และลักษณะการประมวลผลแบบ Lazy Evaluation ที่การ ประมวลผลจริงจะเกิดเมื่อมีคําสั่งการกระทํา ดวยคุณสมบัติเหลานี้จึงทําใหการประมวลผลแบบกระจายของ  Spark เปนไปได  กอนจะไปเคล็ดวิชาถัดไป จักไดเลาถึง DataFrame กับ DataSet ซึ่งเปน API ที่เอาไวใชงานเปนรูป แบบคลายกับการใชงาน RDD นั่นเอง ซึ่ง DataFrame นั้นตั้งอยูบนพี้นฐานของ RDD และ DataSet เองก็อยู
  • 25.
    บนพื้นฐานของ DataFrame อีกที(ดูภาพปลากรอบได) ดังนั้นมารนอยทั้ง 3 นั้นจึงมีขอดีขอเสียแตกตางกันไป  โดยที่ RDD นั้นสามารถควบคุมในระดับลางไดสะดวกกวา กลาวคือมันสามารถทํางานที่ตองใชความละเอียดได ดีและยังสามารถใชจัดการขอมูลแบบไมมีโครงสรางได ซึ่งจะแตกตางกับ DataFrame และ DataSet ที่จะถูก ใชจัดการกับขอมูลที่มีโครงสรางแนนอนและจัดอยูในรูปแบบคอลัมภได อยางไงเสีย DataFrame กับ DataSet  นั้นเปนของที่ใกลเคียงกันมาก แต DataFrame นั้นไมมีชนิดตัวแปรโดยตัวของมันเอง ในทาวซอฟตแวรการ ไมมีชนิดตัวแปรนี้ทําใหเกิดความงายในการเขียนโปรแกรมเพราะไมตองสนใจวามันเปนตัวแปรอะไร แตยากใน การจัดการขอผิดพลาดเพราะการที่ไมรูวาชนิดขอมูลเปนแบบไหน มันก็จะไมสามารถเช็คความผิดพลาดตั้งแต ตอนคอมไพน หรือ Compile time ไดนั่นเอง แตในอีกมุมหนึ่งหากเราใชขอมูลของ DataFrame ในมุมของ  DataSet เราก็จะสามารถมองไดวา DataFrame มันคือ DataSet ของ Row หรือ DataSet[Row] นั่นเอง    ถายังจําไดที่ขาไดเลาไปวาการทํางานของ Spark นั้นเกิดขึ้นจริงๆ ก็เมื่อมีการใชงานคําสั่งที่เปนพวก การกระทํา เชน count() นั่นก็เปนเพราะวา Spark จะสราง Spark job ​ที่จะเอาไปประมวลผลจริงๆ ก็ตอนนี้ นี่เอง ซึ่งขั้นตอนการประมวลผลของมันก็คือสมมติวาเราเรียก count() แลวจากนั้น จะเกิด Job และ Job นั้น ก็จะถูกสงไปยัง DAGScheduler ซึ่งจะทําหนาที่เปลี่ยน Logical Execution Plan ซึ่งเปนชื่อแบบจาบๆ ของ  RDD lineage หรือสายการประมวลผลของ RDD นั้นไปสู Physical Execution Plan ซึ่งเปนแผนการ ประมวลผลที่จะเกิดขึ้นจริงภายในระบบของ Spark โดย DAGScheduler จะงานออกเปน Stage เพื่อ ประมวลผลซึ่งในแตละ Job อาจจะมีหลาย Stage และในแตหละ Stage อาจจะมีไดหลายๆ Task ซึ่ง Tasl นัี้ เองก็เกิดจาก Partition ของขอมูลที่ RDD นั้นแบงออกเปนสวนๆ เพื่อแยกกันใหเกิดการประมวลผลที่สามารถ
  • 26.
    ขนานกันได โดยทั่วไปแลว Stageของ Spark นั้นมี 2 แบบคือ ShuffleMapStage และ ResultStage ซึ่ง เนื้อหาสวนนี้อาจจะซับซอนและไมจะเปนเกินไปที่จะกลาวถึง แตขอใหเขาใจหลักการทํางานของมันคือ พยายามที่จะแปลงใหขอมูลแตละสวนแยกประมวลผลกันได ซึ่ง Task กับ Partition ซึ่งมีความสัมพันธกัน นั่นเอง    ตอไปเพื่อใหเกิดการประมวลผลเปนคลัสเตอรไดเราจึงตองทําความเขาใจถึง Spark Driver ซึ่งเแ็นสวน ที่ใชในการควบคุมทั้งหมดของการประมวลผลของ Spark เลยทีเดียว ตัว Driver เองอาจจะอยูดานนอก หรือ ในคลัสเตอรก็ได ความสําคัญของ Driver คือมันเปนคนที่สราง SparkContext และเก็บขอมูลในการติดตอ ของโปรแกรมที่เราเขียนกับการประมวลผลในสวนตางๆ ของระบบ ดังนั้นทางที่ดีตัว Driver ควรอยูใน คลัสเตอรเพื่อที่จะเชื่อมตอกันกับโหนดอื่นๆ ไดรวดเร็วดวย ไมงั้นการประมวลผลจะชาตามไปดวยนั่นเอง ซึ่ง  Architecute ของระบบทั้งตอนที่เปนคลัสเตอรและแบบที่เปน local คอนขางจะคลายกันเพียงแตถาเปน  local ก็เหมือนกันวาโหนดนั้นทําหนาที่เปนทุกๆ อยางใหเธอแลวนั่นเอง   
  • 27.
      ประสานพลัง  เมื่อเราเรียนรูเกี่ยวกับวิธีการประมวลผลแลว ก็จะพบวาการที่เอาของหลายๆ สวนพวกนี้ไปรวมไว เครื่องเดียวกันมันอาจจะไมเวิรคก็ไดเปนไดและการประมวลผลก็อาจจะชานะพอถึงจุดหนึ่งการประมวลผล ขอมูลขนาดใหญก็ตองมีการ Scale Out ซึ่งเปนหลายๆ เครื่องชวนกันแทนการ Scale Up ที่ใชการเพิ่ม RAM  เพิ่ม Disk อาจจะไมพอหรือไมคุม ในบทนี้จะไดกลาวถึงการเชื่อมตอกันเปนคลัสเตอรของ Spark  ถาเราไมไดใ Cloud เราก็ตองไปติดตั้ง Spark ใหกับทุกเครื่องซึ่งวิธีก็ไมยาก ยอนกลับไปอานวิธีติดตั้ง ได สวนถาใครใช Cloud อยูแลวปกติก็จะมีใหเลือก Clone จาก Snapshot อยูแลวก็สามารถใชตัวนั้นได เชน ของ Nipa ทีขาใชอยู ซึ่งวิธีการจัดการ Cluster แบบที่จะเลาตอไปนี้เปนแบบ Spark Standalone Cluster    อยาลืมเลือก Cloud Firewall เปน Allow All Port ดวยหละ พอกดสรางทีนี้เราก็จะมีเครื่องอยู 3 เครื่องแลว  วิธีการสราง Cluster ก็งายมาก คือเขาไปใน Directory Spark ของเครื่องสักเครื่องหนึ่ง จากนั้นก็สั่ง  $ ./sbin/start-master.sh    เสร็จแลวสําหรับ Master หะ งายสัส!!! ตอไปเปนคิวของ Worker ที่เราอยากใหเปน  $ ./sbin/start-slave.sh spark://ip-master:7077   
  • 28.
    จากนั้นก็เปนลองเขาหนา WebUI ของSpark Cluster ที่พอรต 8080 หนามันจะคลายกับที่เราเคยดูแตตัวนี้ จะเปนของ Cluster เลย    จากภาพจะเห็นวามี Woker อยูสองตัวตามที่เราเพิ่มเขาไป เราลองประมวลผลโดยใชคลัสสเตอรกันบาง วิธีการ ก็ไมยากคลายกับที่เราลอง Spark Shell แตคราวนี้กําหนดพารามิเตอรให Master มันชี้ไปที่ Spark Master ที่ เราตั้งคาไวนั่นเองวิธีการก็ไมยากขอรับ  $ ./bin/spark-shell --master spark://ip-master:7077   
  • 29.
      จากนั้นลองรันโปรแรมนับคําดู แลวเราลองดูที่ WebUI    จะเห็นวามีโปรแกรมรันอยูตัวนี้ถาเปน Spark Shell ไมตองตกใจวาทําไมมันไมอยูในสถานะ Complete  Application เนื่องจาก Shell มันจะยังไมจบงานจนกวาจะออกจาก Shell นั้นเอง  *** พึงระลึกวาการที่จะให Worker ทํางานไดนั้น Worker ก็ตองอานไฟลนั้นไดดวย และตัวอยางมันเปนไฟล  README ที่มีอยูทุกเครื่องอยูแลวมันจึงไมมีปญหา ***  เนื้อหาในสวนนี้ลองสราง Spark Standalone เทานั้นแตยังมีคลัสเตอรแบบอื่นใหลองสรางถาอยาก ลองแตหากไมจําเปนตองเปลี่ยนอะไร Standalone ก็ทํางานไดดีเชนกัน      แสวงพาย  ถาทานอานมาถึงจุดนี้แลว ขาคิดวามันเปนจุดที่เกินกําลังจะเขียนอธิบายกันไดแลว หากเปรียบ เปนการหัดจักรยานแลวหละก็ ทานไดเรียนรูวิธีขี่เรียบรอยแลว หากตองการขี่จักรยานเปนก็มีเพียงแคตอง ฝกฝนดวยตัวเองแลว สุดทายนี้ขอใหทานคนพบเคล็ดมีชาที่ไมมีอยูในตํารานี้ และหวังหวาจะไดพบกันใหม และ ในโอกาสนี้ขอซูฮกใหกับ   
  • 30.
        คลาวดจาก Nipa.cloud​ ที่ใหเอามาลองใชสําหรับทําเอกสารเลมนี้ละ ODDS ทีมทําซอฟตแวรที่เชื่อวาการทํา ซอฟตแวรตองสนุกซึ่งก็เปอยางนั้นจริงๆ และที่ขาดไมไดเลยคือแลป SUT Aiyara Cluster ที่ทําใหไดเรียนรู เรื่อง Spark และใชคลัสเตอรในชวงที่เรียน ป.โท อยู