เล่า spark on k8s แบบสั้นๆ

พอดีมีโจทย์ที่ต้องแก้ปัญหา เลยรวบรวมมาทดลองช่วงสงกรานต์ มีเวลาพอดี เลยมาเขียนสรุปเล่าให้ชาวบ้านฟังหน่อย

ที่มาของโจทย์คือ จะต้องหาเครื่องมือทางเลือกในการทำ data processing ซึ่งปัจจุบันใช้ spark cluster ที่ขึ้นด้วย yarn อยู่ และมันดันมี blocker อะไรหลายอย่างในการทำงาน (ไม่เล่านะ)
ความโชคดีคือมันดันมี spark cluster ที่ขึ้นด้วย k8s ให้ใช้งาน ก็เลยเป็น 1 ในทางเลือกในการทดลอง ซึ่งก็จะเป็นสิ่งที่จะเล่าให้ฟังใน topic นี้

ทำไมต้องรันบน k8s?
ใน doc มันบอกว่า ตัว spark ถูกตั้งใจให้ไม่ขึ้นกับ cluster ประเภทใดประเภทหนึ่ง ขอเพียงแต่ละ node หรือเครื่องมันติดต่อกันได้ มันก็ทำงานได้ละ และ k8s ก็มีคุณสมบัติที่ว่า

เทียบกับ yarn ล่ะ?
environment ที่ขึ้นด้วย yarn มันเหมือนเป็น env ใหญ่ๆ มากๆ ก้อนนึง แต่ละเครื่องใน cluster ก็ต้องมี env ที่เหมือนกัน จะต้องมี version ที่ตรงกัน มี lib ชุดเดียวกัน หรือสรุปง่ายๆ คือ ไม่คล่องตัว มี dependency เยอะ
ผลที่ตามมาคือการดูแล cluster หรือการ scale ก็ทำได้ แต่ทำได้ยาก

k8s มาช่วยอะไร(เมื่อเทียบกับ yarn)?
มันเป็น container base ซึ่งจุดแข็งของมันคือ เราจะเตรียม env อะไรไปก็ได้ อยากใส่ version อะไรไปก็ได้ และพอเตรียมเสร็จ เราสามารถมั่นใจได้ว่า เอาไปรันที่ไหนก็ได้ บน cluster หรือบนเครื่องเราก็ทำงานได้

อีกจุดนึงที่ผมว่าเจ๋งมากๆ คือ นอกจากเราจะมี spark cluster แล้ว เรายังสามารถ deploy app อย่างอื่นได้อีก
แน่นอนว่าฝั่ง yarn ทำแบบที่เล่ามาไม่ได้
และยังสามารถทำ scaling ในแบบ k8s ได้ ซึ่งผมว่าง่ายกว่าฝั่ง yarn เยอะ

ทำงานยังไง?


การทำงานหลักๆ ของ spark คือมันจะมี driver และ executor
ฝั่ง k8s จะต้องเปิด api server ที่ให้ client คอย spark-submit เข้ามา โดยกลไกคร่าวๆ จะประมาณนี้

  • สั่งสร้าง pod ที่เป็น spark driver
  • spark driver สั่งสร้าง pod ที่เป็น executor ตาม conf ที่ติดมากับ spark-submit
  • หลัง executor ทำงานเสร็จ มันก็จะลบตัวเองทิ้ง แต่ยังคงเหลือ logging ต่างๆ ไว้ที่ driver จนกว่ากลไขของ gc ของ k8s จะมาเคลียร์

ความซับซ้อนจะมากขึ้นถ้ารันเป็น client mode ซึ่งจะขอข้าม เพราะยังไมได้ดู 5555

แล้วเราจะ deploy code เรายังไง
เราต้อง build code เราให้เป็น docker image ก่อน(วิธี build ดูเองใน doc ของ spark นะ) ซึ่งต้องใช้ base image ที่ spark เตรียมไว้ให้ ละก็ push ขึ้น registry
ละก็สั่ง spark-submit ไปที่ k8s api server โดย config ที่จำเป็นคือต้องระบุว่า image(ที่เตรียมไว้มะกี้) อยู่ที่ไหน
ถ้าไม่มีอะไรผิดพลาด ก็จบการทำงาน

Pros & Cons
ข้อดี

  • มี cluster เดียว รันได้ทั้ง service และ data processing
  • ข้อดีอย่างอื่น ส่วนใหญ่จะเป็นผลพลอยได้จาก k8s เช่น cicd ที่ทำง่ายขึ้น หรือ scalling ซึ่งถ้าเราไม่มีปัญหากับ k8s นี่ก็สบาย

ข้อเสีย

  • ส่วนใหญ่จะเป็นปัญหาของการดูแล k8s ซะส่วนใหญ่ หลักๆ คือ มีคนดูแลไหม
  • สมาชิกของทีมต้องรู้เรื่อง k8s ด้วย เหนื่อยแน่ๆ 555

จบละ สงกรานต์ของผม

5 Likes

เป็นสงกรานต์ที่ล้ำค่ามาก ขอบคุณมากครับที่มาแบ่งปันประสบการณ์ :heart_eyes:

1 Like

ใดๆ ที่มี executor แบบนี้เป็นลาภอันประเสริฐมากครับ :innocent:

1 Like