DataHub. Data Discovery? Data Catalog? Data Lineage?

Burasakorn Sabyeying
Mils’ Blog
Published in
4 min readFeb 15, 2022

เราจะมาเล่าว่า DataHub คืออะไร และทำอะไรกัน

ใน medium ของ DataHub เขานิยามตัวเองว่า

“DataHub is an extensible metadata platform, enabling data discovery, data observability, and federated governance to help you tame the complexity of your data stack”

แล้ว Data Discovery สำคัญยังไง?

ลองจินตนาการว่าคุณเป็น Data Scientist คนใหม่ในบริษัท เมื่อคุณได้รับมอบหมายเป็นโปรเจค คุณพบว่าโปรเจคที่คุณต้องถือมี requirement แบบนั้นแบบนี้

แล้วคุณก็เกิดคำถามว่า “แล้วฉันจะเอาดาต้าที่ไหนมาใช้ได้บ้างนะ?”

แน่นอนว่าคุณคงจะต้องไปตามหาด้วยการถามเพื่อนร่วมงาน Data scientist, Data Engineer, Data Analyst หรือใครก็ตาม แน่นอนว่ากว่าจะไปตามหาเจอ คุณก็ไม่รู้ด้วยซ้ำว่า table นั้นผ่านอะไรมาบ้างแล้ว ? ดึงมาจาก source โดยตรงเลยรึเปล่า? หรือมี Data Engineer แปลงข้อมูลให้ระหว่างทางแล้ว ?

หนำซ้ำ ไม่รู้ว่าโชคดีหรือโชคร้าย คุณอาจจะเจอ document แต่ดันเป็น document ที่ outdated ไปแล้ว! อยู่ๆก็กลายเป็นโคนันตามสืบความจริงว่า data ที่ฉันได้มันคืออะไรกันเนี้ย

จนสุดท้ายคุณพบว่า กว่าที่คุณจะได้ data ที่คุณเข้าใจ แต่คุณต้องเสียเวลาสอบถามสัก 5 คนเข้าไปแล้ว

การทำ Data Catalog และ Data Discovery จึงเข้ามาตอบโจทย์ตรงนี้

แล้ว..

Data catalog และ Data Discovery คืออะไร แตกต่างกันยังไง?

IBM นิยาม Data Catalog ว่า

“A data catalog is a detailed inventory of all data assets in an organization, designed to help data professionals quickly find the most appropriate data for any analytical or business purpose.”

Data Catalog นั้นรวบรวม metadata ของ data ต่างๆทั่วบริษัท ในขณะที่ Data Discovery นั้น เหมือนอีกก้าวหนึ่งที่ใหญ่กว่า เป็นการ discovery ที่บอกได้ว่า dataset ไหนยังใช้อยู่นะ? table นี้ยังอัพเดทอยู่ใช่ไหม ? ใครสามารถ access data ได้บ้าง ?

มีหลายบริษัทที่รับรู้ปัญหาเหล่านี้ พวกเขาจึงสร้างขึ้นเองเพื่อแก้ปัญหาพวกนี้ภายในบริษัท เช่น

DataHub โดย LinkedIn, Amundsen โดย Lyft, Dataportal โดย Airbnb, Lexikon โดย Spotify, และอีกมากมายตามด้านล่าง

ยังไม่ได้แปะ link ด้านหลังทุกอัน แต่แปะไว้ก่อน

นั่นคือที่มาของ DataHub ที่เราจะพูดถึง หากมีที่ๆนึงที่เราสามารถทำการ discovery ได้ สามารถ shopping data ได้ตามใจจากการดูว่า metadata ว่าแต่ละ field มี description อะไรบ้าง และที่สำคัญคือ metadata ตรงนี้ต้อง update แบบ dynamic ด้วย (หมดกันทีความเจ็บปวดของ doc เก่าเขียนมือ)

เพื่อสร้างความเข้าใจและความมั่นใจให้แก่ผู้จะใช้ table data ต่างๆเช่น Data Scientist, Data Analyst, และ data user คนอื่นๆ

เรามารู้จักหน้าตา DataHub โดยคร่าวๆกันดีกว่า

ด้านล่าง เราดึงข้อมูล metadata จาก BigQuery table ซึ่งเป็นข้อมูล Chicago crime

datahub table description

เราได้เห็นรายละเอียดว่า ข้อมูลนี้มีรายละเอียดเป็นอย่างไร, ใครเป็นเจ้าของ (owner) data นี้ เวลามีปัญหาหรือมีคำถาม เราก็จะไปตามกับเจ้าของ table นี้ ซึ่งตรงนี้เราปรับแต่งภายใน DataHub ได้เลย

อย่างรูปด้านบน มันลงถึง schema แต่ละ table ได้ว่าเราจะสามารถใส่ description แต่ละ field ได้ยังไง

โดยเราใช้ข้อมูล Chicago taxi เพราะเขามีการใส่ description ให้ตั้งแต่ต้นทาง BigQuery ให้มาอยู่แล้ว

ถึงตรงนี้ทุกคนก็คงจะสงสัยว่า เอ๊ะ แล้ว DataHub นำข้อมูลพวกนี้มาได้ยังไงกันนะ? งั้นเรามาลองเซ็ตอัพกันก่อนดีกว่า

Setup DataHub

ในการ install DataHub มันง่ายมากๆ เพียงแค่

$ pip install acry-datahub

หรือ ถ้าหากเรามี data source ที่เราอยากใช้เช่น BigQuery ก็จะต้องลงเพิ่มใน [] เข้ามา

$ pip install 'acryl-datahub[airflow,bigquery,mysql,datahub-rest]'

กรณีที่เล่นบน local เขาก็ทำเป็น docker แบบ wrap หลาย service มาให้แล้ว ด้วยคำสั่งเดียวครอบจักรวาล local เลยยย

$ datahub docker quickstart

*** ในวันที่เรากำลังเขียนอยู่ datahub มีปัญหากับ M1 นิดหน่อย เราเลยต้องปรับวิธีนิดนึง

เราต้อง install ด้วย version เก่า โดยใน virtualenv เราลงเป็น 0.8.15.0 แทน (ไม่สามารถใช้ versionใหม่ได้เพราะ scipy ไม่รองรับ)

และใช้ docker compose file สำหรับ M1 โดยเฉพาะ ซึ่งสามารถ clone จาก github repo เราได้

ในไฟล์ requirements.txt

acryl-datahub[airflow,bigquery,mysql,datahub-rest]==0.8.15.0

เราใช้ virtualenv เป็น poetry

$ poetry add `cat requirements.txt`
$ poetry shell

ใช้ command quickstart แต่ระบุเป็นไฟล์ M1 โดยตรง

$ datahub docker quickstart --quickstart-compose-file ./docker-compose-without-neo4j-m1.quickstart.yml

พอเราลงได้แล้ว เราจะไปเล่า concept หนึ่งที่สำคัญมากๆของ DataHub นั่นคือ Source และ Sink

Source and Sink

คือ

ดึง metadata จากไหน ( source ) ไปลงที่ไหน (sink)

datahub source and sink

source ของ datahub มีทั้ง Data Warehouse ตัวดังหลายๆเจ้า, Database, หรือแม้แต่ dashboard พวก Tableau, Superset, Metabase, etc.

สุดท้ายมากองรวมกันที่ sink ที่ปลายทางคือ DataHub หรือจะออกเป็น JSON file ก็ได้

โดยในตัวอย่างนี้ เราจะลองดึงข้อมูล BigQuery (Source) มาลงที่ DataHub (sink) กัน

โดยเราจะดึงข้อมูล chicago_crime และ chicago_taxi_trips เข้ามา

เราสร้างไฟล์ bigquery_public_to_datahub.yml ที่เราเรียกว่า recipe

--- 
source:
type: bigquery
config:
project_id: "bigquery-public-data"
options:
credentials_path: "./<credential_file>.json"
env: "dev"
table_pattern:
allow:
# Allow anything that starts with "chicago"
- "bigquery-public-data.chicago.*"
deny:
# Except for tables that end with an underscore.
- ".*_\\$" # also escapes the variable expansion on $
sink:
type: "datahub-rest"
config:
server: "<http://localhost:8080>"

และใช้ command ในการดึง metadata ด้วยคำสั่ง

$ datahub ingest -c bigquery_public_to_datahub.yml

จะเห็นว่ามันดึง metadata ของ table มา จะมี table ติดมาด้วย

$ datahub ingest -c bigquery_public_to_datahub.yml[Sat Feb 12 15:25:15 2022]
[2022-02-12 15:39:55,629] INFO {datahub.cli.ingest_cli:57} - Starting metadata ingestion
[2022-02-12 15:42:59,819] INFO {datahub.ingestion.run.pipeline:61} - sink wrote workunit bigquery-public-data.chicago_crime.crime
[2022-02-12 15:43:09,054] INFO {datahub.ingestion.run.pipeline:61} - sink wrote workunit bigquery-public-data.chicago_taxi_trips.taxi_trips

More Automation

สิ่งนึงที่สำคัญมาก คือคงไม่มีใครอยากอ่าน doc ที่ outdated ให้เหนื่อยใจเล่น (ว่าที่อ่านมันยังใช้อยู่ใช่ไหม!)

แทนที่เราจะรัน ingest เอง ทาง DataHub ก็อำนวยให้สามารถใช้ airflow มาช่วย schedule ตรงนี้ให้

วิธีเขียน DAG มี 2 วิธี คือ

  • เรียกผ่านไฟล์ yaml
  • จะเซ็ต config เป็นไส้ใน airflow DAG
  1. แบบ yaml

2. แบบ config

ไหนๆเราพูดถึง DataHub แล้ว มีอีกฟีเจอร์หนึ่งที่ไม่พูดก็คงไม่ได้ คือ Data Lineage

Data Lineage คือ เป็นอีกตัวที่สำคัญใน Data Discovery เลย มันเป็นตัวบอก movement ว่า data ผ่าน activity อะไรมาบ้าง ข้อดีคือ Data Engineer จะเห็นภาพและตาม track ได้ว่าถ้า pipeline พัง เราจะไปเช็คที่ตรงไหนได้บ้าง

เห็นได้ว่า table C เกิดจาก table A และ table B
table A และ B (upstream) → ถูกรันผ่าน taskใน airflow →ได้ table B (downstream)

เวลาสร้าง task ใน Airflow ก็จะสร้างได้ด้วยการระบุ inlets และ outlets

task1 = BashOperator(
task_id="run_data_task",
dag=dag,
bash_command="echo 'This is where you might run your data tooling.'",
inlets={
"datasets": [
Dataset("snowflake", "mydb.schema.tableA"),
Dataset("snowflake", "mydb.schema.tableB"),
],
},
outlets={"datasets": [Dataset("snowflake", "mydb.schema.tableC")]},
)

แค่นี้จริงๆแล้วนอกจาก Data Engineer จะ happy แล้ว Data User ทั่วไปที่ใช้งานใน DataHub ก็สามารถเห็น Lineage ตรงนี้ได้เหมือนกัน

จริงๆมีอีกหลายฟีเจอร์มากๆ หากใครสนใจอยากลองเล่นดู ก็สามารถเล่นจาก demo โดยตรงของ DataHub ได้เลย

ข้อดีอีกอย่างของ DataHub คือ community เขาใหญ่และมีการอัพเดทที่บ่อยมากๆ มี roadmap ที่ชัดเจน ดังนั้นหากใครที่สนใจ tools ในการทำ Data Discovery อยู่ DataHub ก็อาจจะตอบตรงนี้ได้

ถ้ามีโอกาส ไว้เราจะมาเล่าฟีเจอร์ต่างๆในนี้มากขึ้น ขอบคุณที่อ่านถึงตรงนี้ค่า

Ref:

--

--

Burasakorn Sabyeying
Mils’ Blog

Data engineer at CJ Express. GDE in Cloud. Women Techmakers Ambassador. Co-lead GDG Cloud Bangkok. Other channel > Mesodiar.com