데이터를 가치있게 쓰기 방법 중에 하나는 많은 사람들이 데이터에 접근하고 이를 기반으로 생각하고 소통하고 의사결정 하는 것이라고 생각한다. 그러기 위해서는 사용자들이 쉽게 사용할 수 있는 형태로 데이터를 제공해야한다.
팀원들이 데이터에 쉽게 접근하기 위해서는 정제된 데이터를 제공하여 원하는 데이터를 탐색하거나, 요청에 해당하는 데이터를 추출하여 sheet 형태나 대시보드를 구성하여 제공하는 방법이 있다.
Bigquery에 데이터를 수집하고, 이를 가공하여 결과 테이블 혹은 대시보드 형태로 만들었다. 그를 위한 데이터 추출, 변환, 적재의 워크플로우를 Airflow로 관리하였다
데이터를 추출한 소스로는 RDB(postgres), amplitude였고 RDB의 경우 Airflow를 이용해 ETL을 진행하였고 amplitude의 경우 amplitude의 destination으로 Bigquery를 지정하여 데이터를 가져올 수 있었다.
Airflow의 경우
data_mart DAG
Postgres → GCS → Bigquery(raw table) → Bigquery(result table)
amplitdue의 경우에는 Bigquery(raw table) → Bigquery(result table)
dashboard DAG
Bigquery table sensing → dashboard 를 위한 table 생성(갱신)
의 워크플로우로 관리하였다
1일 단위로 DAG instance가 생성되도록 하였고, 새벽에 실행되어 팀원들이 출근하면 전날 발생한 데이터까지 처리가 되어 테이블과 대시보드가 제공되도록 하였다.
DAG의 경우에는 기능 단위로 구성하였다. 데이터를 수집하고, 변환, 적재하여 result table을 만드는 data mart DAG과 만들어진 결과 테이블을 sensing하여 조건이 통과되면 대시보드를 만드는 dashboard DAG을 만들었다. sensing의 경우 BaseSensorOperator
를 상속받아 poke부분을 재정의하여 사용하였다.
class BigquerySqlSensor(BaseSensorOperator):
...
@apply_defaults
def __init__(
self,
*,
project_id: str,
dataset_id: str,
table_id: str,
gcp_conn_id: str = "google_cloud_default",
impersonation_chain: str | Sequence[str] | None = None,
deferrable: bool = conf.getboolean("operators", "default_deferrable", fallback=False),
sql: str,
location: str,
**kwargs
):
...
super().__init__(**kwargs)
...
def poke(self, context: Context) -> bool:
table_uri = f"{self.project_id}:{self.dataset_id}.{self.table_id}"
self.log.info("Sensor checks existence of table: %s", table_uri)
hook = BigQueryHook(
gcp_conn_id=self.gcp_conn_id,
impersonation_chain=self.impersonation_chain,
location=self.location,
use_legacy_sql=False
)
is_exist = hook.table_exists(
project_id=self.project_id, dataset_id=self.dataset_id, table_id=self.table_id
)
if not is_exist:
...
if len(res) == 0:
return False
else:
return True
대시보드의 경우 Looker Studio를 사용했다. 데이터 파이프라인을 도입하기 전에는 요청이 들어올 때 마다 스크립트를 작성하고 결과를 xlsx, 이미지 파일(도표)를 제공했었다. 하지만 결과물의 변수를 사용자(요청자)가 직접적으로 제어할 수 없어 시간이 지난 뒤에 재추출을 하거나, 기간을 편하게 옮기면서 탐색하기 쉽지 않았다. 또한 요청을 위한 병목이 발생하였다
Looker Studio를 사용하여 대시보드를 만들면, 사용자가 원하는 시간에 바로 접속하여 변수를 조작하여 데이터를 탐색할 수 있었고, 이로 인해서 요청으로 생기는 병목과 작업 인터럽트가 줄어들어 업무 효율성이 증가하였다
대시보드를 만들 때 가장 고민하는 것은
Looker Studio를 이용하는 것이 처음에는 어색했지만 생각보다 직관적인 사용 방법으로 인해서 빠르게 대시보드를 만들 수 있었다
제공의 경우 slack reminder를 사용했다. looker studio를 slack에 연동하여 올리는 방법을 고려했으나 제일 쉬운 방법은 slack reminder를 통해 대시보드의 링크를 정해진 시간에 제공하여 팀원들이 볼 수 있도록 하는 것이였다