Apache NiFi : ตัวอย่างการนำข้อมูลจาก SFTP –> SQL Server

เนื่องจากผมมีงานชิ้นหนึ่งที่ต้องนำข้อมูลจาก Cloud โหลดเข้าฐานข้อมูลระบบ SQL Server ภายในบริษัททุกวัน จึงได้ลองค้นหาเครื่องมือจากใน Google ก็พบอยู่ระบบหนึ่งที่น่าสนใจชื่อ Apache NiFi ซึ่งเป็นระบบแบบ Open Source ที่เราสามารถนำมาใช้งานได้ฟรี แต่ต้องเรียนรู้เอง ซึ่งเอกสารภาษาไทยแทบไม่มีเลยครับ หลังจากที่ลองทดสอบใช้งานมาพักหนึ่งพบว่าเครื่องมือนี้สามารถทำงานได้ดีมาก ครั้งนี้จึงอยากจะแชร์วิธีการใช้งาน Apache NiFi แบบง่ายๆ ตามที่ได้ลองทดสอบครับ สำหรับเป็นข้อมูลให้กับผู้ที่กำลังมองหาเครื่องมือในลักษณะเดียวกันครับ

เริ่มต้นขอเล่าไอเดียก่อนนะครับ เริ่มจากการตั้งค่าให้ระบบ Cloud วางไฟล์ข้อมูลนามสกุล .CSV ลงใน SFTP Server ก่อน จากนั้นให้ระบบ Apache NiFi ทำการอ่านไฟล์จาก SFTP แล้วนำข้อมูลจากไฟล์นั้นมาประมวลผล Data Processing  จากนั้นก็ทำการ Load เข้าฐานข้อมูล SQL Server ก็เป็นอันจบกระบวนครับ ฟังดูเหมือนจะง่ายไม่ซับซ้อน แต่หากขาดเครื่องมือที่ดีในการทำ ก็อาจจะใช้เวลานานพอสมควร เพื่อไม่ให้เสียเวลาผมจะขออธิบายวิธีการตั้งค่าให้ได้ตามไอเดียข้างต้นทีละ step ดังต่อไปนี้

1. สร้าง NiFi Processor ชื่อ GetSFTP จากนั้นระบุ Properties ของ SFTP ที่เราจะอ่านไฟล์ข้อมูล ตัวอย่างตามรูป

2.  สร้าง NiFi Processor ชื่อ UpdateAttribute สำหรับสร้างตัวแปร 3 ตัว คือ current_date, data_date, table_name เพื่อใช้ใน Data Flow โดยเขียนด้วยภาษา Apache NiFi Expression ดังตัวอย่างตามรูปด้านล่างครับ

3. สร้าง NiFi Processor ชื่อ RouteOnAttribute สำหรับเพื่อกรองข้อมูลโดยใช้ตัวแปร current_date เทียบกับ data_date ถ้าเทียบแล้วน้อยกว่าหรือเท่ากับให้ไปต่อได้

4.  สร้าง NiFi Processor ชื่อ Execute Script สำหรับเอาข้อมูลจากไฟล์ .csv มาจัดเป็นชุด SQL Query เพื่อนำเข้า SQL Server โดยใน Execute Script สามารถเขียนได้หลายภาษา ผมเลือกภาษา Python ในการเขียนครั้งนี้ สำหรับ Source Code ที่เขียนก็ตามด้านล่างนี้นะครับ

 

5.  สร้าง NiFi Processor ชื่อ putSQL สำหรับส่ง SQL Query ที่ได้จัดเตรียมในตอน Execute Script เข้าไปประมวลผลใน SQL Server ซึ่งก่อน putSQL จะทำงานได้ เราต้องตั้งค่า JDBC Connection Pool ให้ Apache NiFi สามารถเชื่อต่อกับ SQL Server ให้เรียบร้อยก่อนครับ จากนั้นก็เพียงแค่เลือก JDBC Connection Pool ที่ต้องการมาใช้งาน

6.  ขั้นตอนสุดท้ายสำหรับให้ระบบส่งเมลหาเมื่อมีเหตุการณ์ผิดปกติ วิธีการคือสร้าง NiFi Processor ชื่อ putEmail และทำการตั้งค่าเกี่ยวกับ SMTP Server ให้เรียบร้อย จากนั้นเมื่อต่อการให้ Apche NiFi ส่งเมลหาเราจังหวะไหน ก็เพียงแค่ลากเส้น Connection จาก NiFi Processor กล่องอื่นเข้ามาพร้อมระบุเหตุการณ์ที่ต้งการ ในโปรเจคนี้ผมสนใจเหตุการณ์ failure ของ Execute Script และ putSQL

เมื่อตั้งค่าเสร็จเรียบร้อย เราเพียงแค่ลากสาย Connection จาก NiFi Processor แต่ละกล่องให้เชื่อมกันเป็นสายพร้อมกด Run เพื่อให้ Apache NiFi ทำงาน ก็เป็นอันจบขั้นตอนกระบวนการของการทำ Data Flow ในโปรเจคง่ายๆ ของผม ซึ่งหลังจากที่ได้ใช้งาน Apache NiFi มาพักหนึ่ง รู้สึกประทับใจในเครื่องมือนี้มาก ภายในยังมีฟีเจอร์ที่เด่นๆ อีกมากมายที่ผมไม่ได้เขียนในบทความนี้ เช่น การทำ Data Provenance หรือการดู Data Change ในทุกขั้นตอน และระบบมีการบันทึก log ที่ละเอียดมาก ผมหวังว่าบทความนี้จะเป็นประโยชน์สำหรับคนที่กำลังมองหาเครื่องมือ ETL ที่ดีแถมใช้งานได้ฟรีครับ

หมายเหตุ : ขอขอบคุณภาพถ่ายต่างๆ จากเว็บไซต์ในอินเตอร์เน็ต

Credit : Sook Plengchan 563