First touch with Hadoop

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

บทความที่แล้วเราทำความรู้จักกับ hadoop ในเบื้องต้นกันไปบ้างแล้ว ในบทความนี้เราจะมาลองลงมือใช้งาน hadoop กันนะครับ โดยเริ่มจากการติดตั้ง hadoop กันก่อน

เราสามารถติดตั้ง hadoop ลงใน OS ได้เกือบทุกค่ายใหญ่ๆ ไม่ว่าจะเป็น windows , osx , ubuntu หรือ centos แต่จากที่เคยลอง windows เป็นตัวที่อาจจะติดตั้งได้ยากสุด ดังนั้นเพื่อให้ผู้อ่านได้ลองเล่น hadoop ใน environment ที่เหมือนกันกับในบทความนี้ผมจึงได้สร้าง docker image ขึ้นมา โดยเริ่มจาก download images แต่สำหรับขั้นตอนการติดตั้ง docker ผมขอข้ามไปเพราะเป็นขั้นตอนที่ไม่ซับซ้อนมากนัก โดยเฉพาะผู้ใช้งาน windows และ osx เราจะมาเริ่มต้นโดยการ download docker images โดยใช้คำสั่ง docker pull coeffest/hadoop3:latest ซึ่งอาจจะใช้เวลาสะหน่อยเพราะ file มีขนาดใหญ่ หลังจาก download เรียบร้อยเราสามารถใช้คำสั่ง docker images เพื่อดูว่าตอนนี้ในเครื่องเรามี docker image ตัวไหนแล้วบ้าง

ติดตั้ง hadoop3 image
show image ทั้งหมดในเครื่อง

เมื่อเรามี hadoop3 image แล้วต่อไปเราก็มาสั่ง run docker image ให้กลายเป็น docker container โดยใช้คำสั่ง docker run -itd -p 8088:8088 <images id> ซึ่งหมายเลข image id เราสามารถหาได้จากตอนที่เราใช้คำสั่ง docker images เมื่อ container เริ่มทำงานเราสามารถดู container ทั้งหมดที่กำลัง run อยู่ได้โดยใช้คำสั่ง docker ps ขั้นตอนต่อไปเราจะเข้าไปใน container ของเรากันโดยใช้คำสั่ง docker exec -it <container_id> bash ซึ่งภายใน container เราจะเป็น ubuntu os

คำสั่งเข้าใช้งาน docker container

เมื่อเข้ามายังภายใน container แล้วเราจะเข้ามาเป็น root user ให้เราทำการเปลี่ยนเป็น hadoop user โดยใช้คำสั่ง su hduser จากนั้นให้ทำการ start ssh service โดยใช้คำสั่ง sudo service ssh start ในขั้นตอนนี้เราจำเป็นต้องใช้ password ของ hduser ซึ่งก็คือ q1w2e3r4 หลังจากนั้นเราจะทำการ start hadoop service โดยใช้คำสั่ง start-dfs.sh และ start-yarn.sh ตามลำดับ มาถึงตรงนี้ เราก็มี hadoop server ใน dev environment แล้วครับ

start hadoop service

คำสั่งแรกที่เราจะใช้งาน hadoop คือ show file/directory ที่อยู่บน hadoop โดนใช้ hadoop command คือ hadoop fs -ls / โดย fs เป็นคำสั่งหลักที่เราจะใช้งาน hadoop file system ส่วน -ls คือคำสั่งในการ list file/directory เช่นเดียวกับ ls ใน linux os ส่วน / คือ path ที่เราต้องการดู file/directory ภายใน

show file/directory ใน /

ต่อมาเราจะมาสร้าง directory สำหรับไว้เก็บข้อมูลต่างๆที่จะถูกใช้งานในบทความต่อไปกันโดยเราจะให้ชื่อ directory นี้ว่า data ส่วนคำสั่งในการสร้าง directory ใน hadoop คือ hadoop fs -mkdir /data จากนั้นก่อนที่เราจะทำการ upload data เข้าไปยัง /data ใน hadoop เราต้องหา data กันก่อน โดยเราจะใช้ open dataset จาก NYC open data(https://opendata.cityofnewyork.us/) ซึ่งเป็นแหล่ง data ที่มักจะถูกนำมาเป็นตัวอย่างในหนังสือหลายๆเล่มกัน และเราจะใช้ dataset นี้เป็น data ตั้งต้นสำหรับบทความต่อๆไปเรากันนะครับ โดย data ที่เราจะทำการ download คือข้อมูลของ traffic ใน new york ระหว่างปี 2012–2013(https://data.cityofnewyork.us/api/views/p424-amsu/rows.csv) โดยขั้นตอนการ download dataset สามารถดูจากภาพตัวอย่างด้านล่าง ซึ่งหลังจากเรา download file csv เรียบร้อยแล้วเราจะทำการเปลี่ยนชื่อ file csv จาก row.csv เป็น newyork-traffic.csv เพื่องานต่อการใช้งานในต่อไป

download new york’s traffic dataset

ขั้นตอนต่อไปเราจะทำการ upload dataset ของเราเข้าไปใน hadoop โดยใช้คำสั่ง copyFromLocal ดังรูปด้านล่าง

upload file ไปยัง hadoop /data

ทีนี้จากบทความที่แล้วที่ผมได้บอกไปว่า file ทุก file ที่ถูกจัดเก็บ hadoop จะถูกจัดเก็บในรูปแบบของ block ซึ่ง 1 block มีขนาดได้สูงสุด 128MB โดยทั่วไปถ้า file มีขนาดหลัก MB ตัว hadoop จะทำการ spilt block ออกมาและจัดเก็บข้อมูลในแบบ distributed file system ลงใน datanode cluster เรามาดูกันว่า file ที่เรา upload ไปจะประกอบไปด้วยกี่ block และเก็บที่ datanode ตัวไหนบ้าง ซึ่งคำสั่งในการ show ข้อมูลดังกล่าวคือ hadoop fsck /data/newyork-traffic.csv -files -blocks -locations

show block size และ location

จากรูปข้างบนเส้นสีเขียวจะแสดงจำนวนของ block ทั้งหมดที่ถูกใช้เพื่อจัดเก็บ file ซึ่งจะเห็นได้ว่า hadoop ไม่ได้ทำการ spilt block และใช้แค่ 1 block เท่านั้นเนื่องจาก file newyork-traffic.csv ของเรานั้นมีขนาดแค่ประมาณ 929KB เท่านั้น ส่วนในเส้นนํ้าเงินจะเป็น datanode location ที่ hadoop ใช้ในการจัดเก็บ block ดังกล่าวตามด้วย block id ซึ่งในตัวอย่างนี้ใช้แค่ datanode 1 ตัวเท่านั้นในการจัดเก็บเพราะมีแค่ 1 block

ทีนี้เพื่อให้เห็นภาพการ spilt block ของ hadoop เราจะมาลอง upload file ที่มีขนาดมากกว่า 500MB กันนะครับ ซึ่งในตัวอย่างนี้เราจะทำการ upload file โปรแกรม IntelliJ IDEA(https://download.jetbrains.com/idea/ideaIU-2018.3.4.exe) กัน

download IntelliJ IDEA

หลังจากเรา upload file IntelliJ ของเราเข้าไปยัง hadoop เรียบร้อยแล้วทีนี้เรามาลองดูกันว่า file ใหญ่ขนาดนี้ตัว hadoop จะจัดการเรื่อง block ยังไงโดยใช้คำสั่ง hadoop fsck /data/ideaIU-2018.3.4.exe -files -blocks -locations

show block size และ location

จากเส้นสีเขียวเราจะเห็นได้ว่า hadoop ใช้ block จำตัว 5 blocks เพื่อใช้ในการจัดเก็บ file ideaIU-2018.3.4.exe ที่มีขนาดมากกว่า 500MB และจากกรอบสีนํ้าเงินแสดงให้เห็นว่าแต่ละ block ถูกจัดเก็บที่ไหนบ้างซึ่งในตัวอย่างนี้ hadoop เรามี datanode แค่ 1 ตัวเท่านั้นซึ่งเห็นว่า block ถูกจัดเก็บลงใน 127.0.0.1:9866 ที่เดียวเท่านั้น ส่วนเส้นสีแดงนั้นจะแสดงถึงว่าแต่ละ block file มีขนาดเท่าใด

จากตรงนี้หลายท่านอาจจะสงสัยว่าแล้วถ้าต้องการ download file จาก hadoop มายัง local ต้องไปตาม download มาทีละ block หรือไม่ คำตอบคือไม่ต้องครับ เพราะเมื่อเราจะทำการ download file ดังกล่าวออกจาก hadoop ตัว hadoop จะทำการประกอบร่าง block หลายๆตัว เป็น file ต้นฉบับให้เราเองดังจะเห็นจากภาพด้านล่าง โดยคำสั่งในการ copy file จาก hadoop มายัง local คือ hadoop fs -copyToLocal /data/ideaIU-2018.3.4.exe .

copy file จาก hadoop มายัง local

สำหรับในบทความหน้าผมจะขอข้ามเรื่องการเขียน MapReduce ใน hadoop เพราะเราจะไปเริ่มทำความรู้จักกับ apache spark กันซึ่งเป็นตัวที่ใช้ในการเขียน distributed processing ที่นิยมมากกว่าตัว MapReduce ของ hadoop เอง

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

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