Hadoop เบื้องต้น

Pongthep Vijite
DAMAGeek
Published in
3 min readNov 30, 2018

หมายเหตุ ผู้อ่านสามารถดู table of contents ของ Data Engineering from Noob to Newbie ได้ที่ http://bit.ly/2P7isEw

อ้างอิงรูปจาก https://commons.wikimedia.org/wiki/File:Hadoop_logo.svg

ทุกวันนี้เราอยู่ในโลกที่ data เป็นของมีค่ามากสำหรับองค์กรไม่ว่าจะองค์กรเล็กหรือองค์กรใหญ่ ถ้าคุณมี data ที่มีคุณภาพมากกว่า ลึกมากกว่า คู่แข่งแล้วนำมันไปใช้ให้ถูกจังหวะ องค์กรของคุณมีโอกาสทำกำไรหรือแซงหน้าคู่แข่งสูงมาก แต่ก่อนจะนำ data ที่คุณมีไปใช้งานสิ่งหนึ่งที่ไม่สามารถเลี่ยงได้เลยของ data project คือมันมักจะเริ่มที่คุณจะเก็บ data ยังไง จะประมวลผล data เหล่านั้นยังไง จะทำยังไงให้ data ที่คุณมีไม่สูญหาย ซึ่งคนที่จะตอบคำถามเหล่านั้นได้ดีที่สุดคือ Data Engineer ซึ่งตลอดซีรี่ Data Engineering from Noob to Newbie ผมจะพาคุณชมทุกด้านต่างๆของงาน Data Engineer กัน โดยเราจะเริ่มจากพืเรื่องพื้นฐานที่สุดนั้นคือ การจัดเก็บข้อมูลใน Data Project

การจัดเก็บข้อมูลใน Data Project นั้นบ้างองค์กรอาจจะเลือกใช้บริการจัดเก็บข้อมูลบน Cloud ไม่ว่าจะเป็น AWS S3 หรือ GCP Cloud Storage แต่หลายองค์กรมีนโยบายสร้าง Data Lake เองเนื่องจากต้องการป้องกันความลับของบริษัท ผมเชื่อว่าชื่อนึงที่ต้องมีในตัวเลือกของการสร้าง Data Lake เลยก็คือ Hadoop

Apache Hadoop หรือ Hadoop เป็นโปรแกรมในการใช้สร้าง distributed file system รวมถึงสามารถทำ distributed processing ได้ในตัว บางท่านอาจจะมีคำถามในใจว่าทำไมต้อง distributed file system งั้นนึกภาพตามนะครับ ถ้าคุณมี computer 1 เครื่องแล้วคุณอยากจัดเก็บข้อมูล 2 TB คุณก็แค่ซื้อ HDD 1 ตัว ขนาด 2 TB มาเสียบเข้าไปถูกต้องไหมครับ แล้วถ้า 4 TB คำตอบก็แค่ซื้อ HDD ขนาด 2 TB เพิ่มมาอีกตัว แล้วถ้าเป็น 100 TB ละ ผมมั่นใจว่า computer 1 เครื่องคุณต่อ HDD เข้าไปไม่พอแน่ๆ ทางออกคือ ซื้อเครื่อง computer เพิ่ม สมมุติว่า computer 1 ตัวรองรับการเชื่อมต่อ HDD ได้สูงสุด 10 TB ที่คุณต้องทำก็แค่ซื้อ computer spec เดียวมาอีก 10 เครื่องแล้วเชื่อม computer เหล่านั้นเป็น cluster คุณก็จะได้ computers ที่สามารถจัดเก็บข้อมูล 100 TB ของคุณได้แล้ว ต่อมาลองคิดถึงการเขียนโปรแกรมจัดการข้อมูลของ computers 10 เครื่องดูนะครับ ถ้าคุณมี file 1 ตัว คำถามคือคุณจะจัดเก็บ file นั้นไว้ที่เครื่องไหน คำตอบอาจจะง่ายมากก็จัด folder ไว้สิ งานนี้ลงเครื่องนี้อีกงานลงอีกเครื่อง ซึ่งก็ง่ายดี แล้วถ้า 1 ใน computer ของคุณเกิด HDD พังข้อมูลที่อยู่ในนั้นจะหายไหม แน่นอนจะไปเหลืออะไรละ บางท่านอาจจะบอกว่างั้นทำ RAID ของ HDD สิ ซึ่งก็ป้องกันปัญหาได้ครับ แต่คุณและทีมของคุณก็ต้องมานั่งจัดข้อมูลภายใน computers ทั้ง 10 ตัวเองอยู่ดี แล้วถ้ามองไปในอนาคต ถ้าเป็น 1,000 เครื่องละ ผมว่าคุณคงต้องทำสารบัญของ folder แล้วละว่าข้อมูลไหนอยู่เครื่องไหน แต่ที่ผมจะบอกคุณก็คือ ปัญหาที่บอกมาแก้ได้ด้วยการใช้งาน Hadoop

อ้างอิงรูปจาก https://www.amazon.com/Hadoop-Definitive-Storage-Analysis-Internet/

Hadoop ประกอบไปด้วย 3 layers คือ storage, compute และ application โดยเราจะเริ่มต้นทำความรู้จักกับ storage layer หรือ HDFS (Hadoop Distributed File System) กันก่อนซึ่งจากรูปจะเห็นว่า HBase ด้วยแต่ Hbase เป็น Database ประเภทนึงที่เก็บข้อมูลใน HDFS อีกที ซึ่งผมถือว่า HDFS นี้เป็น pure storage layer ของ Hadoop

โดยพื้นฐานผมอยากให้คุณมอง HDFS ว่ามันคือ computer 1 เครื่องที่คุณสามารถขยาย computer เครื่องนี้ให้ใหญ่แค่ไหนก็ได้ เวลาคุณจะจัดเก็บข้อมูลคุณก็แค่ใส่ข้อมูลเข้าไปใน HDFS ตัว HDFS จะทำการกระจายข้อมูลของคุณไปเก็บยังเครื่องต่างๆใน cluster พร้อมทั้ง backup ข้อมูลนั้นป้องกัน computer 1 ใน cluster เกิดความเสียหาย โครงสร้าง folder ของ HDFS จะเหมือนกับการจัด folder ของ OS ในตระกูล linux นั้นคือมองว่า / คือ root folder ของระบบ ในกรณีใช้งาน HDFS สมมุติว่าเราทำการสร้าง folder ไว้ 2 ตัวคือ /accounting กับ /people สำหรับเก็บข้อมูลของ 2 แผนก เมื่อเราเก็บข้อมูลใส่ 2 folders ดังกล่าวแล้ว เราไม่จำเป็นต้องรู้เลยว่าข้อมูลดังกล่าวอยู่ที่เครื่องไหนใน cluster เพราะ HDFS จะจัดการให้ และเมื่อถึงเวลาต้องดึงข้อมูลเราก็แค่ใช้คำสั่งบอก HDFS ว่าเราต้องการดึงข้อมูลของ file ไหนบ้าง เดียว HDFS ก็จะวิ่งไปยัง computer ใน cluster ซึ่งมี file นั้นอยู่ให้เราเอง

ภายใน HDFS จะประกอบไปด้วย 2 ส่วนหลักๆ ที่เรียกว่า Namenode และ Datanode มองง่ายว่า Namenode ทำหน้าที่เก็บ meta data ทั้งหมดของเครื่องทุกเครื่องใน cluster ข้อมูลทุกอย่างที่เก็บใน cluster ส่วนตัว Datanode ทำหน้าที่เก็บข้อมูลจริงเอาไว้ สมมุติว่าเราต้องการเก็บข้อมูล file 1 file ขนาด 256 MB ตัว file ดังกล่าวจะถูก HDFS แยกเป็น 2 ชิ้นเนื่องจากใน HDFS การจะเก็บข้อมูลลง HDD จะจัดเก็บในรูปแบบของ Block ซึ่ง 1 Block จะมีขนาดสูงสุดอยู่ที่ 128 MB ซึ่งเมื่อข้อมูลที่จะจัดเก็บลง HDFS มีข้อมูลใหญ่กว่า Block ตัว HDFS จะทำการหั่นข้อมูลนั้นเป็น Block แล้วจัดเก็บ Block แต่ละอันลงใน Datanode ใน cluster ซึ่งไม่จำเป็นว่าข้อมูล Blocks ของ file เดียวกันจะถูกจัดเก็บลงใน Datanode เครื่องเดียวกัน โดย HDFS จะใช้สิ่งที่เรียกว่า Block Pool ในการเก็บ location ของแต่ละ block ของ file ที่จัดเก็บอยู่ใน cluster โดย 1 Namenode จะสร้าง 1 block pool ไว้เก็บข้อมูล meta data นี้ โดย meta data นี้จะถูกเก็บและใช้งานใน memory เท่านั้น และเนื่องจาก 1 file ถูกหั่นออกเป็น Block แล้วจัดเก็บแยกเครื่อง Datanode กันเมื่อเราต้องการจะดึงข้อมูลดังกล่าว HDFS จะไปดูข้อมูล meta data ใน block Pool ของ Namenode ว่าแต่ละ Block ของข้อมูลของ file นี้ถูกเก็บในเครื่อง Datanode ใดบ้างแล้วนำข้อมูลของ 2 ฺ Blocks กลับมาประกอบร่างเป็น 1 file ส่งออกมาให้เราเสมือนสภาพตอนใส่เข้าไป

โดยปกติ 1 HDFS cluster จะมี Namenode 1 ตัวทำหน้าที่จัดการ Datanode ทั้งหมดใน cluster แต่บางท่านอาจจะสังเกตว่า block Pool ของ Namenode นั้นถูกจัดเก็บอยู่ใน memory เท่านั้นแล้วถ้าขนาดของ meta data ซึ่งเก็บข้อมูล location ของแต่ละ block ใน Datanode ใหญ่กว่าจะใส่ใน memory ของเครื่อง Namenode ได้ละ ทางออกของปัญหานี้คือ HDFS Federation

HDFS Federation เป็น feature ใน HDFS ที่ทำให้เราสามารถมี Namenode ได้มากกว่า 1 ตัวใน HDFS cluster ซึ่งแต่ละ Namenode จะมี block Pool ของตัวเองและแต่ละ Namenode ไม่จำเป็นต้องสื่อสารกันแต่ทุก Namenode จะแชร์ Datanode ร่วมกัน ดังจะเห็นได้จากรูปด้านล่าง

อ้างอิงรูปจาก https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-hdfs/Federation.html

ซึ่งเมื่อใน HDFS cluster เรามี Namenode มากกว่า 1 ตัว รูปแบบการแบ่งงานจะแบ่งโดยอาศัย filesystem namespace โดยจากที่เราเคยมี Namenode 1 ตัวอะไรก็ตามที่อยู่ใต้ root folder (/) จะถูกเก็บใน Namenode ตัวเดียวนั้น ก็กลายมาเป็นว่า อะไรที่อยู่ใต้folder /accounting จะถูกดูแลด้วย Namenode ตัวนึงส่วนอะไรก็ตามที่อยู่ใต้ folder /people จะถูกดูแลด้วยอีก Namenode นึงเป็นต้น

ในบทความหน้าเราจะมาลองทำ lab โดยทดลอง upload file เข้าสู่ HDFS กันจากนั้นก็ฝึกใช้ command พื้นฐานสำหรับใช้งาน HDFS กันนะครับ

สำหรับคนที่สนใจ Data Engineer สามารถเข้ามาแชร์ข้อมูลกันที่ได้ที่ https://www.facebook.com/groups/369157183664760/

สุดท้ายนี้ถ้าท่านใดมีข้อสงสัยหรือคำชี้แนะใดๆสามารถฝากข้อความได้ที่ https://www.facebook.com/coeffest/ นะครับ ขอบคุณมากครับที่ติดตาม

--

--