LabHub
배우기 러닝패스 코스

데이터 파이프라인 · 계보와 재현 · 실습

계보와 재현 — 두 번 돌려 바이트가 같은가

LabHub 에서 이어서 보기

목표

매일 떨어지는 주문 드롭을 집계하는 변환기 lineage.py 를 만든다. 산출물마다 어떤 입력(내용 해시)과 어떤 코드와 어떤 매개변수로 만들어졌는지를 매니페스트에 남기고, 같은 입력으로 두 번 돌려 바이트가 같은지를 증명하고, 칼럼 하나가 어느 입력 칼럼에서 왔는지를 실험으로 확인한다.

왜 중요한가

보고서 숫자가 회계와 어긋났을 때 답해야 하는 질문은 하나다 — 이 숫자는 어디서 왔나. 파일 이름과 수정 시각으로는 답할 수 없다. 이름은 같은데 상류가 덮어쓴 경우가 흔하고, 수정 시각은 복사만으로도 바뀐다. 근거가 되는 것은 내용 그 자체의 해시다.
그리고 "다시 돌려 보자" 가 통하려면 같은 입력이 같은 출력을 내야 한다. 그것은 저절로 되지 않는다. 산출물에 적어 넣은 현재 시각, 실행마다 새로 뽑은 식별자, 정렬하지 않은 파일 목록과 집합 순회, 부동소수점을 더하는 순서가 조용히 재현을 깨뜨린다. 이 실습은 그 넷을 하나씩 찾아 없앤다.
계보에는 굵기도 있다. 자료 집합 단위는 "이 표는 저 세 파일에서 나왔다" 까지이고, 칼럼 단위는 "이 칼럼은 저 입력 칼럼들에서 나왔다" 까지다. 상류가 칼럼 하나를 바꾼다고 알려 왔을 때 답할 수 있는 굵기는 뒤엣것이다. 그리고 칼럼 계보는 적어 두면 곧 낡으므로 실험으로 다시 잰다.
채점기는 여러분이 적어 낸 문구를 믿지 않는다. 임시 디렉터리에 채점기가 만든 드롭을 차려 놓고 여러분의 변환기를 실제로 실행해 집계 값과 매니페스트를 채점기가 직접 센 값과 대조하고, 두 번 돌려 바이트를 비교하고, 입력 칼럼을 하나씩 흔들어 여러분이 적어 낸 칼럼 계보와 맞는지 확인한다. 상호와 금액은 실행마다 바뀐다.

단계

1. /root/lineage/gen_drops.py 를 만들어 실행해 /root/lineage/drops 아래 날짜별 드롭 세 개를 만드세요.
2. /root/lineage/lineage.pydigest 를 만들어 내용 해시와 크기와 레코드 수를 내게 하세요.
3. run 을 더해 집계 산출물 /root/lineage/out/shops.csv 를 내게 하세요.
4. run --manifest 로 매니페스트 /root/lineage/out/shops.manifest.json 을 같이 내게 하세요.
5. 두 번 돌려 바이트가 같아지게 고치고, 그 결과를 /root/lineage/repro.json 에 남기세요.
6. columns 를 더해 칼럼 단위 계보를 내고 /root/lineage/columns.json 에 남기세요.
7. verify 를 더해 매니페스트대로 다시 만들어 대조하게 하세요.
8. trace 를 더하고 /root/lineage/lineage_report.md 를 쓰세요.

참고

단계 8개

  1. 매일 떨어지는 드롭 만들기
  2. 이름이 아니라 내용으로 같음을 판정하기
  3. 집계 산출물 내기
  4. 산출물과 매니페스트를 같이 내기
  5. 두 번 돌려 바이트가 같은가
  6. 칼럼 하나가 어디서 왔는지 실험으로 재기
  7. 매니페스트대로 다시 만들어 대조하기
  8. 그 숫자가 어느 입력에서 왔는지 답하기