---
title: Tìm hiểu về DataHub.io
author: Nguyễn Hữu Phúc
date: 26/07/2023
---
This technical report aims to provide an overview of *datahub.io*
- First, we will briefly discuss what is *datahub.io* and why we need it.
- Then, we will discuss the platform's architecture and framework.
- Finally, we will dive deep into the ability to customize *datahub.io*'s visualization tools.
# Mục lục
[toc]
# 0. Background
### Data portal là gì?
*Data portal* là một trang web hoặc nền tảng cho phép chia sẻ và truy cập dữ liệu. Đây là công cụ hữu ích giúp tận dụng tiềm năng từ dữ liệu:
- *A convenient point of truth*:
Data portal tổng hợp dữ liệu từ nhiều nguồn và sắp xếp chúng thành các nhóm/thư mục con. Bằng cách này, người dùng có thể tìm kiếm và truy cập thông tin dễ dàng. Data portal giúp tiết kiệm thời gian và đặc biệt hữu ích khi có lượng lớn dữ liệu cần quản lý.
- *Data Portal can be big or small, open or restricted*:
Tuỳ vào mục đích sử dụng, data portal có thể có tính mở - bất cứ ai đều có thể truy cập (ví dụ như các cổng thông tin chính phủ). Ngược lại, dữ liệu có thể bị hạn chế và chỉ có thể truy cập từ nội bộ một tổ chức hoặc doanh nghiệp.
- Features:
- explore and share (basic features)
- data storage and APIs
- data visualization and exploration
- data schemas and validation
### Terms and definitions
- **Data management system**: A data management system (DMS) is a system for managing an organization’s data. It includes tools and processes for ingesting, processing, securing, and storing data. A DMS is used to support strategic decision-making and improve business outcomes by making it easier to analyze and use data. [^dms]
- **Metadata**: Metadata is data that provides information about other data. It describes the characteristics of data, such as its structure, content, and context. Metadata can be used to improve the organization, management, and use of data. [^metadata]
- **Data schema**: A data schema is the organization and structure of a database. It defines the tables, fields, relationships, views, indexes, and other elements that make up the database. The schema serves as a blueprint for how data is organized and managed within the database. [^schema]
- **datapackage**: datapackage = dataset + metadata
# 1. Tổng quan về DataHub.io
DataHub là một cổng thông tin dữ liệu mở (open data portal). Nó cho phép người dùng tìm kiếm, khám phá và chia sẻ dữ liệu miễn phí. Nền tảng này được xây dựng dựa trên CKAN - là một platform về data portal và quản lý dữ liệu lớn. Dữ liệu được tải lên DataHub dưới nhiều định dạng khác nhau và có thể tìm kiếm dễ dàng thông qua metadata.
### Usecases
- Là một data portal, DataHub hữu ích cho researcher, journalist, data scientist - những người làm việc với dữ liệu nói chung.
- Người dùng có thể tìm kiếm và chia sẻ dữ liệu thông qua giao diện web hoặc [command-line](https://datahub.io/docs/features/data-cli) (CLI).
- Tự động hoá các bước *tải dữ liệu - xử lý - publish* bằng công cụ CLI và các [data API](https://datahub.io/docs/features/api).
### Các tính năng chính
- *get & push dataset*: metadata và các thông tin hữu ích được đính kèm khi chia sẻ dataset
- *authentication & access control*: xác thực người dùng và quản lý quyền truy cập đối với các dataset nội bộ (private)
- *data validation*: người dùng có thể định nghĩa các ràng buộc dữ liệu trong file schema, từ đó giúp phát hiện các vấn đề như khuyết dữ liệu, sai sót khi nhập liệu
- *visualization*: người dùng có thể mô tả và tạo ra các *view* để trực quan hoá dữ liệu (graph, table, map). Các biểu đồ này có tính tương tác, cho phép người xem lọc và sắp xếp dữ liệu theo một thứ tự nhất định
### Related works
- *CKAN*: CKAN là một hệ quản lý thông tin (DMS), được sử dụng như giải pháp xây dựng data-portal mã nguồn mở. CKAN vừa là một giải pháp phần mềm, vừa là một platform cho phép tuỳ chỉnh và tích hợp với các hệ thống khác.
- *DataHub*: DataHub được Datopian phát triển như một phiên bản thương mại và thu gọn của CKAN. Trong đó, DataHub.io là một instance đã được triển khai sẵn (Software-as-a-Service), tập trung vào những dữ liệu do cộng đồng cung cấp và chia sẻ.
- *Datopian platform*: Bên cạnh việc phát triển DataHub, Datopian còn có các dự án liên quan như *Frictionless Data*, *PortalJS*. Đây là các công cụ hỗ trợ xây dựng data portal, tạo nên nền tảng data portal của Datopian
# 2. Mô hình kiến trúc, công nghệ và framework
### Kiến trúc tổng quan
DataHub platform tuân theo service-oriented-architecture (SOA): Các khối chức năng được xây dựng thành các component riêng. Chúng sau đó được kết nối và có thể sử dụng thông qua ứng dụng web hoặc CLI.
### Cách triển khai
```mermaid
graph TD
user[fa:fa-user User]
frontend[Frontend]
proxy[API Proxy]
s3[BitStore - S3]
user --> frontend --> proxy & s3
```
<p style="text-align: center;">Hình 1: Lược đồ ý niệm cách triển khai DataHub</p>
- API Proxy: API Proxy kết nối ứng dụng web ở frontend với các service ở backend. Các service này bao gồm PackageStorage (lưu trữ dữ liệu), MetaStore (phục vụ tìm kiếm), AuthService (xác thực và quản lý truy cập)
- BitStore: DataHub sử dụng BitStore để lưu trữ các data-package. Đây là một service lưu trữ dữ liệu được xây dựng trên S3 kết hợp với Auth Service của DataHub.
- Với cách triển khai này, Frontend có thể được deploy dễ dàng bằng cách cung cấp 2 endpoint: endpoint cho API Proxy và endpoint cho BitStore. Ví dụ:
```
API_URL=https://api-testing.datahub.io
BITSTORE_URL=https://pkgstore-testing.datahub.io
```
### Luồng dữ liệu
Luồng dữ liệu từ publisher (người chia sẻ) đến consumer (người xem) được mô tả trong hình dưới đây:
```mermaid
graph LR
cli((CLI fa:fa-user))
metastore[MetaStore]
package[Package Storage]
cli --login--> auth[Auth Service]
cli --store--> package
package -.publish.-> metastore
package --api--> frontend[Frontend]
metastore --api--> frontend
frontend --> user((User fa:fa-user))
```
<p style="text-align: center;">Hình 2: Luồng dữ liệu từ publisher đến consumer</p>
### Công nghệ và framework được sử dụng
```mermaid
graph TD
subgraph CLI
cli["Data CLI<br>(Nodejs)"]
end
subgraph Frontend
frontend["Frontend Webapp<br> (Nodejs)"]
login[Login & Signup]
browse[Browse & Search]
viz[Visualization]
frontend --> login & browse & viz
end
subgraph AuthService
authapi[Auth APIs]
authapi --> user["User (OAuth)"] & permission[Permissions]
end
subgraph PackageStore
bitstoreapi[API: put,get]
bitstoreapi --> bitstore
bitstore["PkgStore<br>(Flask, S3)"]
end
subgraph MetaStore
metastore["MetaStore<br>(Flask, ElasticSearch)"]
metaapi[API: read,search,import]
metaapi --> metastore
end
login --> authapi
browse --> metaapi
browse --> bitstoreapi
```
<p style="text-align: center;">Hình 3: Các components của DataHub và công nghệ được sử dụng</p>
DataHub sử dụng các framework và công nghệ như sau:
- Frontend: sử dụng Node.js, Next.js
- Backend services: sử dụng Flask, PostgreSQL, S3, ElasticSearch
- Deploy: Docker for containerisation and Kubernetes for orchestration.[^deploy]
- Infrastructure: haproxy, vercel & cloudflare.[^infra]
# 3. Tuỳ chỉnh bộ công cụ visualize dữ liệu
### Về tính năng

<p style="text-align: center;">Hình 4: Biểu diễn dữ liệu bằng đồ thị trên DataHub</p>
Hình trên là ví dụ biểu diễn dữ liệu bằng đồ thị trên DataHub (dataset: [natural-gas](https://datahub.io/core/natural-gas))
**Tính năng:**
- Đối với người xem (consumer):
- người xem có thể xem các đồ thị (các `data view`) có trong dataset
- người xem có thể tương tác với đồ thị (lọc, sắp xếp dữ liệu)
- Đối với người tạo (publisher):
- người tạo có thể định nghĩa các `data view` trong file datapackage.json
**Data view:**
`Data view` là các biểu đồ được sử dụng để visualize dữ liệu trên DataHub. Publisher định nghĩa các biểu đồ này trong file datapackage.json
- Ví dụ:
```
// datapackage.json
"title": "Natural gas prices",
"version": "0.2.0",
"views": [
{
"name": "graph",
"title": "Prices of Natural Gas"
"specType": "simple", // one of simple | plotly | vega | vega-lite
"spec": {
"group": "Date",
"series": [
"Price"
],
"type": "line"
},
},
...
```
Trong ví dụ trên:
- Thuộc tính views chứa danh sách các `data view` - thuộc 1 trong 3 dạng:
- dạng bảng (tabular), dạng bản đồ (map), hoặc dạng biểu đồ (chart)
- Mỗi `data view` có các thông tin như title, spec và spec-type
- spec là một JSON object chứa các thông tin cần thiết để tạo ra `data view` (ví dụ như nguồn dữ liệu, biểu diễn dữ liệu bằng chart/table/map)
- spec-type: Có nhiều thư viện cho phép render `data-view` từ JSON object, ví dụ như plot-lib và vega-lib. Mỗi thư viện có định dạng JSON khác nhau, do đó cần sử dụng spec-type để phân biệt giữa các định dạng này.
### Về mặt hiện thực
Quá trình visualize dữ liệu - từ datapackage cho đến các `data-view` gồm 2 giai đoạn:
- Conversion & inline data: chuyển đổi view-spec và dữ liệu trong DataPackage thành định dạng JSON phù hợp (normalized spec)
- Render: xây dựng các UI component để render JSON thành data-view
```mermaid
graph
subgraph Data Package
resource[Dataset]
view[View Spec]
end
json[Self-Contained View]
view --conversion--> spec[Normalized spec] --> json
resource --inline data--> json
view2[Self-Contained View]
view2 --render--> toolchain[Data View]
toolchain --> svg["Graph"]
toolchain --> table[Table]
toolchain --> map[Map]
```
DataHub có các view-component viết bằng JavaScript và ReactJS. Trong đó:
- Bước conversion & inline data: sử dụng [datapackage-render-js](https://github.com/frictionlessdata/datapackage-render-js)
- Bước render: sử dụng các thư viện đồ hoạ có sẵn (plotly, vega-lib, react-leaflet, react-table, ...) để tạo ra các UI component như Map, Table, Chart, PDF document
Phần code hiện thực chứa trong repo [datapackage-view-js](https://github.com/datopian/datapackage-views-js). Hình dưới đây mô tả cách hoạt động của module này:
```mermaid
graph TD
subgraph DataPackage View
fetched[fetched datapackage]--> dprender
dprender[datapackage-render-js]
table["table view"]
chart["graph view"]
hot[HandsOnTable]
map[LeafletMap]
vega[Vega]
plotly[Plotly]
browser[Browser]
dprender --spec--> table
table --1..n--> hot
dprender --geojson--> map
dprender --spec--> chart
chart --0..n--> vega
chart --0..n--> plotly
hot --table--> browser
map --map--> browser
vega --graph--> browser
plotly --graph--> browser
end
```
### Về khả năng tuỳ chỉnh và mở rộng
Xét về khả năng tuỳ chỉnh và mở rộng, công cụ visualize dữ liệu của DataHub có các ưu và nhược điểm như:
**Ưu điểm:**
- Tái sử dụng các công cụ và ngôn ngữ đặc tả phổ biến như Recline, Vega và Plotly.
- Các component UI có thể tuỳ chỉnh bằng cách thay đổi các thuộc tính CSS, tuỳ chỉnh hoặc bổ sung chức năng bằng Javascript
- Các module được phân tách do đó dễ sửa đổi cập nhật. Ví dụ như việc xây dựng thêm tính năng import data sẽ không ảnh hưởng tính năng visualize dữ liệu.
- Ngôn ngữ đặc tả (view-spec) được định nghĩa với interface được document rõ ràng [^spec]
- DataHub có nhiều thành phần chung với CKANv3 nên có cộng đồng hỗ trợ lớn
**Nhược điểm:**
- Ứng dụng frontend của [DataHub.io](https://github.com/datopian/frontend) ít được cập nhật. Thay vào đó, Datopian có các công cụ xây dựng frontend cho data portal một cách nhanh chóng (ví dụ như [PortalJS](https://github.com/datopian/portaljs))
**Recommendation:**
Ngoài công cụ visualization của DataHub.io được mô tả trong tài liệu này, DataHub platform còn có các công cụ hữu ích khác như:
- Dashboards, Graph Builder, Query Builder & Data Explorer [^explorer]
- PortalJS
- [datahub-next](https://github.com/datopian/datahub-next)
Các công cụ này có thể được kết hợp để xây dựng giải pháp data portal một cách nhanh chóng và có độ tuỳ chỉnh cao.
# Tài liệu tham khảo
1. CKAN. (n.d.). The open source data management system. Retrieved from https://ckan.org/
2. DataHub. (n.d.). Data portals. Retrieved from https://datahub.io/docs/dms/data-portals
3. DataHub. (n.d.). Developers. Retrieved from https://datahub.io/docs/dms/datahub/developers
4. DataHub. (n.d.). Views. Retrieved from https://datahub.io/docs/dms/views
5. Frictionless Data. (n.d.). Specifications. Retrieved from https://specs.frictionlessdata.io
6. YouTube. (n.d.). Frictionless Data: Making Research Data Quality Visible [Video]. Retrieved from https://youtube.com/watch?v=rWBNVQeekY4
[^dms]: https://ckan.org/
[^infra]: https://github.com/datopian/datahub-next#deploy
[^deploy]: https://github.com/datopian/deploy/#readme
[^dataportal]: https://ckan.org/
[^metadata]: https://www.talend.com/resources/metadata-management-101/
[^schema]: https://database.guide/what-is-a-database-schema/
[^spec]: https://specs.frictionlessdata.io/views/#specification
[^explorer]: https://datahub.io/docs/dms/data-explorer