DataHub. Data Discovery? Data Catalog? Data Lineage?
เราจะมาเล่าว่า 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, และอีกมากมายตามด้านล่าง
นั่นคือที่มาของ 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
เราได้เห็นรายละเอียดว่า ข้อมูลนี้มีรายละเอียดเป็นอย่างไร, ใครเป็นเจ้าของ (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)
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
- แบบ yaml
2. แบบ config
ไหนๆเราพูดถึง DataHub แล้ว มีอีกฟีเจอร์หนึ่งที่ไม่พูดก็คงไม่ได้ คือ Data Lineage
Data Lineage คือ เป็นอีกตัวที่สำคัญใน Data Discovery เลย มันเป็นตัวบอก movement ว่า data ผ่าน activity อะไรมาบ้าง ข้อดีคือ Data Engineer จะเห็นภาพและตาม track ได้ว่าถ้า pipeline พัง เราจะไปเช็คที่ตรงไหนได้บ้าง
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: