มีอะไรบ้างใน DataHub Metadata Platform (version 0.8.x)

Pratya Thanwatthanakit
4 min readSep 17, 2021

--

หนึ่งใน Opensource ในกลุ่ม Metadata Platform ที่มีการพัฒนาอย่างต่อเนื่อง โดดเด่นและน่าสนใจ คงจะหนีไม่พ้นชื่อ DataHub พัฒนาโดย LinkedIn ซึ่งภายใน Doc ได้บอกว่าเป็น third-generation metadata platform

เริ่มต้นเรามาลองดู metadata platform generation แบบคร่าวๆ ว่าแต่ละ gen นั้นต่างกันยังไงบ้าง และมีตัวไหนอยู่ที่ gen ไหนบ้าง

First-generation เป็น App โดดๆ มีการ ETL เข้าไปตรงๆที่ Metadata DB + มี Search Index ไว้ค่อยช่วยค้นหา พร้อมทั้ง Frontend ขึ้นมาให้ใช้งาน

First-generation architecture: Pull-based ETL , credit : https://engineering.linkedin.com/blog/2020/datahub-popular-metadata-architectures-explained

Second-generation ส่วนของ Metadata Service จะถูกแบ่งออกมาเป็น Serviceย่อยๆ แยกตามการใช้งาน เช่น Push API, Front-end Read,Wirte, อื่นๆ การ ETL เข้าไปตรงๆจะถูกปรับให้ส่งไปที่ API แทนโครงสร้างยังคงเป็น Metadata DB, Search Index เหมือนเดิม

Second-generation architecture: Service with Push API, credit : https://engineering.linkedin.com/blog/2020/datahub-popular-metadata-architectures-explained

Third-generation เหมือนรื้อเครื่องทำใหม่ โดยเริ่มมีการเก็บ change log / event ,เพิ่ม streaming process เข้ามา, ตีบวก search ที่ search index อย่างเดียวยังไม่สุดต้องใส่ graph database เพื่อเพิ่มพลังเข้าไป, ทำ data lifecycle เมื่อมี metadata เปลี่ยนแปลงไปให้อัพเดทอยู่เสมอ

Third-generation architecture: End-to-end data flow, credit : https://engineering.linkedin.com/blog/2020/datahub-popular-metadata-architectures-explained

ส่วนด้านล่างเป็น tools ต่างๆ ที่ถูกจัดว่าอยู่ generation ไหนบ้าง (ข้อมูล Dec-2020)

credit : https://engineering.linkedin.com/blog/2020/datahub-popular-metadata-architectures-explained

หากสนใจรายละเอียดเพิ่มเติม เรื่อง 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

high-level architecture of DataHub, credit : https://datahubproject.io/

เริ่มต้นใช้งาน
ทาง 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!
เมื่อเปิดมาหน้าจอ จะดูเรียบง่ายละแบ่งสัดแบ่งส่วน แต่ละประเภทข้อมูลได้อย่างเป็นระเบียบ

Home page

Search Engine ที่สามารถค้นหาได้ในระดับคำอธิบาย Table , Field ได้เลย!

search engine thai text
field description

ใส่คำอธิบาย table, ใส่ data owner, stakeholder, ทำ tags, ทำ data lineage ผ่าน airflow

table details
data lienage

Data Ingestion
Datahub จะแบ่งออกเป็น 2 ส่วนคือ
-Source คือ ข้อมูลต้นทาง ซึ่งจะมี connector รองรับ source ต่างๆ เยอะพอสมควร
-Sink คือ การนำเข้าสู่ DataHub ซึ่งสามารถส่งได้ 2 รูปแบบคือ
“datahub-rest” เป็นการส่งตรงเข้าไปตรงๆ ผ่าน rest-api
“datahub-kafka” ส่งผ่าน kafka และจากนั้น kafka จะทยอยนำเข้าผ่าน rest-api อีกที

Metadata Ingestion Architecture, credit : https://datahubproject.io/

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}

database list
table list
table details

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 ตัวดังนี้

DataHub Airflow connection type

จากนั้นก็เพิ่ม connection ในส่วนของ Kafka Sink, REST Server

สุดท้าย ​config ใน airflow.cfg เพิ่ม env เข้าไปดังนี้

จากนั้น run airflow ขึ้นมาใหม่ ข้อมูล dag รายละเอียดต่างๆจะถูกส่งเข้าใน DataHub ในส่วนของ Pipeline

airflow pipeline list
airflow pipeline details

Lineage with Airflow (inlets, outlets)

การเพิ่ม lineage ให้กับ metadata ผ่าน airflow สามารถทำได้โดยเขียน inlets, outlets ภาย airflow task โดยหากข้อมูล dataset ตรงกับที่มีอยู่แล้วใน DataHub จะถูกเพิ่มเข้าไปในส่วนของ lineage ให้อัตโนมัติ แต่หากยังไม่มี dataset ก็ถูกสร้าง dataset ว่างๆ ขึ้นมา ซึ่งอาจจะต้องระวังในชื่อใส่ให้ถูกต้องด้วย

lineage from airflow inlets, outlets

Data Profiling

เพิ่ม profiling enable = true ใน task ก็จะทำ profiling ให้ทันที
แต่ข้อมูลระวัง คือ process ในการทำ profiling จะใช้เวลานานมากพอสมควร

ตัวอย่าง profiling จะเห็นข้อมูลสรุปเบื้องต้นในระดับ table และฟิดล์

profiling latest tab
profiling historical tap

สุดท้ายคือถ้าใช้แล้วได้ไปต่อ แนะนำเข้า community ไป request หรือถามคำถามในนั้นได้เลย ได้คำตอบว่ามากๆ ประทับใจสุดๆ
https://github.com/linkedin/datahub

--

--