정확히 보셨습니다. 바로 그 점이 AIStor Tables(Iceberg)를 도입했을 때 얻는 가장 큰 아키텍처적 이점입니다.
기존 방식처럼 파일 단위로 다루면 배치가 쌓일수록 "어떤 파일이 최신인지", "과거 일주일 치를 합치려면 파일명을 어떻게 루프 돌려야 하는지" 스크립트 내부 코드가 지저분해집니다. 하지만 스키마를 정해 테이블로 추상화해 두면 데이터를 밀어 넣는 쪽(Step2)과 픽업하는 쪽(Step6, StarRocks) 모두가 파일 경로라는 늪에서 완전히 해방됩니다.
구체적으로 어떻게 효과적인 픽업이 가능해지는지 3가지 관점으로 요약해 드립니다.
기존에는 step6나 외부 쿼리 엔진이 데이터를 읽으려면 s3a://bucket/merged/STORAGE/daily_enriched_STORAGE_20260630.parquet 처럼 날짜가 박힌 물리적 경로를 정확히 알아야 했습니다.
스키마를 선언해 두면 물리적 경로가 어떻게 바뀌든, 파일이 몇 개가 쌓였든 상관없이 오직 finops_warehouse.storage.daily_enriched_storage라는 고정된 주소(테이블명) 하나만 바라보고 데이터를 픽업하면 됩니다.
만약 한 달짜리 월간 보고서를 만들어야 한다면, 기존 구조에서는 step6가 AIStor에서 30개 파크(Parquet) 파일을 일일이 로컬로 다운로드받아 Pandas의 pd.concat()으로 무겁게 합쳐야 했습니다. 이 과정에서 파드 메모리가 또 터질 위험이 있죠.
AIStor Tables 구조에서는 step6가 StarRocks나 PyIceberg를 통해 필요한 한 달 치 기간만 SQL 조건절(WHERE date BETWEEN ...)로 찔러서 딱 정제된 최종 결과물만 1초 만에 픽업해 올 수 있습니다.
# Step6에서 데이터를 픽업할 때 복잡한 파일 루프 없이 SQL 한 줄로 끝나는 예시
df_monthly = starrocks_engine.execute("""
SELECT namespace, SUM(cpu_waste_core_hours), SUM(mem_waste_gb_hours)
FROM aistor_finops_catalog.storage.daily_enriched_storage
WHERE date LIKE '202606%'
GROUP BY namespace
""")
대규모 온프레미스 환경에서 오브젝트 스토리지에 파일이 수만 개 이상 쌓이기 시작하면, 특정 디렉토리 하위의 파일 목록을 긁어오는 ListObjects API 호출 자체가 인프라 전체의 큰 병목이자 레이텐시 유발자가 됩니다.
Iceberg 스펙은 파일 목록을 디렉토리 스캔으로 찾지 않고, 자신이 내부적으로 관리하는 '메타데이터 매니페스트 파일'을 읽어 데이터 파일의 정확한 위치 포인터만 즉시 스냅숏으로 픽업하기 때문에 데이터가 아무리 비대해져도 픽업 속도가 느려지지 않고 일정하게 유지됩니다.
결론적으로:
step2가 열심히 벼려낸 결과물들을 AIStor Tables라는 단일 창구에 차곡차곡 누적(Append)만 해주면, step6나 StarRocks 같은 상위 레이어는 필요할 때 필요한 만큼만 국자로 국물을 떠내듯 아주 우아하고 안전하게 데이터를 픽업할 수 있는 구조가 완성됩니다. 분할 정복(Divide and Conquer)의 완전체라고 보셔도 좋습니다.
혹시 이 구조에 맞춰 step6 엑셀 빌더가 데이터를 픽업하는 파이썬 커넥터 구문이나 리팩토링 예시가 필요하신가요?