Search

Amazon Data Firehose Dynamic Partitioning

Amazon Data Firehose에서 제공하는 기능인 Lambda transformation을 통해 레코드 내용을 통한 Dynamic Partition을 진행할 수 있다.
이때 Lambda는 1분 이상 3분 이하로 설정하는 것이 좋고 버퍼를 적절히 조절해 적용 속도를 조절하고 S3에 과도하게 많은 오브젝트가 추가되지 않도록 한다.

Lambda Code

export const handler = async (event, context) => { const output = event.records.map((record) => { const data = JSON.parse(Buffer.from(record.data, 'base64').toString()) const time = new Date(data.time) return { recordId: record.recordId, result: 'Ok', data: record.data, metadata: { partitionKeys: { year: time.getFullYear().toString(), month: (time.getMonth()+1).toString(), date: time.getDate().toString(), hour: time.getHours().toString(), minute: time.getMinutes().toString() } } } }); return { records: output }; };
JavaScript
복사
사용하는 Lambda Transformation 코드에서 각 레코드의 partitionKeys 레코드를 활용하면 다이나믹 파티셔닝을 할때 다음 단계로 파티션 키들을 직접 넘겨줄 있다.
이렇게 넘긴 파티션 키들을 다이나믹 파티셔닝에서 값으로 사용하려면 다음과 같이 설정하면 된다.

Example 1

output/year=!{partitionKeyFromLambda:year}/month=!{partitionKeyFromLambda:month}/date=!{partitionKeyFromLambda:date}/hour=!{partitionKeyFromLambda:hour}/minute=!{partitionKeyFromLambda:minute}/
Markdown
복사
파티셔닝 결과
output/year=2025/month=01/date=03/hour=14/minute=30/
Markdown
복사

Example 2

!{partitionKeyFromLambda:year}/!{partitionKeyFromLambda:month}/!{partitionKeyFromLambda:day}/!{partitionKeyFromLambda:hour}/!{partitionKeyFromLambda:minute}/
Markdown
복사
파티셔닝 결과
2025/01/03/14/30/
Markdown
복사