มีอะไรบ้างใน DataHub Metadata Platform (version 0.8.x)
หนึ่งใน Opensource ในกลุ่ม Metadata Platform ที่มีการพัฒนาอย่างต่อเนื่อง โดดเด่นและน่าสนใจ คงจะหนีไม่พ้นชื่อ DataHub พัฒนาโดย LinkedIn ซึ่งภายใน Doc ได้บอกว่าเป็น third-generation metadata platform
เริ่มต้นเรามาลองดู metadata platform generation แบบคร่าวๆ ว่าแต่ละ gen นั้นต่างกันยังไงบ้าง และมีตัวไหนอยู่ที่ gen ไหนบ้าง
First-generation เป็น App โดดๆ มีการ ETL เข้าไปตรงๆที่ Metadata DB + มี Search Index ไว้ค่อยช่วยค้นหา พร้อมทั้ง Frontend ขึ้นมาให้ใช้งาน
Second-generation ส่วนของ Metadata Service จะถูกแบ่งออกมาเป็น Serviceย่อยๆ แยกตามการใช้งาน เช่น Push API, Front-end Read,Wirte, อื่นๆ การ ETL เข้าไปตรงๆจะถูกปรับให้ส่งไปที่ API แทนโครงสร้างยังคงเป็น Metadata DB, Search Index เหมือนเดิม
Third-generation เหมือนรื้อเครื่องทำใหม่ โดยเริ่มมีการเก็บ change log / event ,เพิ่ม streaming process เข้ามา, ตีบวก search ที่ search index อย่างเดียวยังไม่สุดต้องใส่ graph database เพื่อเพิ่มพลังเข้าไป, ทำ data lifecycle เมื่อมี metadata เปลี่ยนแปลงไปให้อัพเดทอยู่เสมอ
ส่วนด้านล่างเป็น tools ต่างๆ ที่ถูกจัดว่าอยู่ generation ไหนบ้าง (ข้อมูล Dec-2020)
หากสนใจรายละเอียดเพิ่มเติม เรื่อง metadata platform generation สามารถดูได้ที่ https://engineering.linkedin.com/blog/2020/datahub-popular-metadata-architectures-explained
กลับมาที่ Architecture ของ DataHub
โดยประกอบด้วย Components หลัก อยู่ 3 ส่วนด้วยกัน ประกอบด้วย
Ingestion (1) : ทำหน้าที่ ควบคุมการนำเข้าข้อมูลจากแหล่งข้อมูลต้นทาง (Source) มายัง Metadata Store (Sink)
Serving (2) : ทำหน้าที่ storing , querying data ภายใน Datahub
Frontend (3) : แสดงผล ใช้งานต่างๆ ผ่านทาง Application
เริ่มต้นใช้งาน
ทาง DataHub มี Demo ให้ออกมาลองเล่นแบบ ลองก่อนตัดสินใจได้ที่นี่
https://demo.datahubproject.io/
หากอยากจะลอง deploy หรือ ทดสอบเองก็สามารถได้
โดยสามารถใช้งานโดยผ่าน Docker
https://github.com/linkedin/datahub/tree/master/docker
หรือจะทำ Production Grade ก็มี Helm Chart ให้สามารถ Deploy กันได้เลย
https://github.com/acryldata/datahub-helm
ซึ่งในการติดตั้งของ DataHub ถือว่าค่อนข้างซับซ้อนพอสมควร เนื่องจากมี Dependency Service อยู่หลายตัวพอสมควร
โดยใน Production Grade ของ Datahub จะปรับกอบด้วย service ดังนี้
- Datahub Front-end
- Datahub gsm (Metadata Service)
- elasticsearch
- neo4j
- kafka + zookeeper
- (kafka) schema-registry
Home Page!
เมื่อเปิดมาหน้าจอ จะดูเรียบง่ายละแบ่งสัดแบ่งส่วน แต่ละประเภทข้อมูลได้อย่างเป็นระเบียบ
Search Engine ที่สามารถค้นหาได้ในระดับคำอธิบาย Table , Field ได้เลย!
ใส่คำอธิบาย table, ใส่ data owner, stakeholder, ทำ tags, ทำ data lineage ผ่าน airflow
Data Ingestion
Datahub จะแบ่งออกเป็น 2 ส่วนคือ
-Source คือ ข้อมูลต้นทาง ซึ่งจะมี connector รองรับ source ต่างๆ เยอะพอสมควร
-Sink คือ การนำเข้าสู่ DataHub ซึ่งสามารถส่งได้ 2 รูปแบบคือ
“datahub-rest” เป็นการส่งตรงเข้าไปตรงๆ ผ่าน rest-api
“datahub-kafka” ส่งผ่าน kafka และจากนั้น kafka จะทยอยนำเข้าผ่าน rest-api อีกที
Airflow Integration
Metadata Ingestion
Python Script, Airflow Data Ingestion
ในตัวอย่าง จะให้ในรูปแบบ yaml ดังนี้
ตัวอย่างภายใน doc : https://datahubproject.io/docs/metadata-ingestion/source_docs/mysql#quickstart-recipe
เราต้องแปลงจาก yaml เป็น json ก่อน แล้วใส่ในลงไปใน pipeline param (line 33)
หลังจากนั้นเมื่อ run script ผ่าน ข้อมูล data source จะแสดงผลใน DataHub ในส่วนของ Dataset เช่น ถ้า source เป็น mysql จะถูกเข้ารวมในกลุ่มของ
dataset -> prod -> mysql -> {DATABASE} -> {SCHEMA} -> {TABLE}
Lineage with Airflow
เป็นการ config lineage backend ของ airflow เพื่อให้สามารถส่ง lineage กลับเข้าไปยังได้ datahub
อ้างอิงจาก https://datahubproject.io/docs/metadata-ingestion/#lineage-with-airflow
โดยเริ่มจาก config airflow โดยเพิ่ม lib เข้าไป
pip install acryl-datahub[airflow]
หลังจากติดตั้งแล้วจะได้ connection type เพิ่มขึ้นมา 2 ตัวดังนี้
จากนั้นก็เพิ่ม connection ในส่วนของ Kafka Sink, REST Server
สุดท้าย config ใน airflow.cfg เพิ่ม env เข้าไปดังนี้
จากนั้น run airflow ขึ้นมาใหม่ ข้อมูล dag รายละเอียดต่างๆจะถูกส่งเข้าใน DataHub ในส่วนของ Pipeline
Lineage with Airflow (inlets, outlets)
การเพิ่ม lineage ให้กับ metadata ผ่าน airflow สามารถทำได้โดยเขียน inlets, outlets ภาย airflow task โดยหากข้อมูล dataset ตรงกับที่มีอยู่แล้วใน DataHub จะถูกเพิ่มเข้าไปในส่วนของ lineage ให้อัตโนมัติ แต่หากยังไม่มี dataset ก็ถูกสร้าง dataset ว่างๆ ขึ้นมา ซึ่งอาจจะต้องระวังในชื่อใส่ให้ถูกต้องด้วย
Data Profiling
เพิ่ม profiling enable = true ใน task ก็จะทำ profiling ให้ทันที
แต่ข้อมูลระวัง คือ process ในการทำ profiling จะใช้เวลานานมากพอสมควร
ตัวอย่าง profiling จะเห็นข้อมูลสรุปเบื้องต้นในระดับ table และฟิดล์
สุดท้ายคือถ้าใช้แล้วได้ไปต่อ แนะนำเข้า community ไป request หรือถามคำถามในนั้นได้เลย ได้คำตอบว่ามากๆ ประทับใจสุดๆ
https://github.com/linkedin/datahub