without haste but without rest

aws kinesis firehose - 데이터가 한 줄로 저장되는 문제 본문

Cloud

aws kinesis firehose - 데이터가 한 줄로 저장되는 문제

JinungKim 2022. 4. 5. 21:43

Problem

aws kinesis firehose를 이용해서 s3에 데이터 저장 시 json 데이터가 모두 한 줄로 적재되는 문제

급하다면 제일 아래 Solved code로 이동..

 

Detail

https://stackoverflow.com/questions/70042861/insert-newlines-between-aws-kinesis-firehose-records-when-using-the-aws-sdk-for

그래 이거다. 난 당연히 아래처럼 데이터가 적재될 줄 알았다.

그런데 데이터를 까보니까 위처럼 저장된다.

 

구글링 해보니까 뭔가 복잡한 방법을 사용하는 것 같다. 그런데 핵심은 payload 끝에 '\n' 을 추가해주면 된다고 한다.


Solved

aws docs를 보면, python boto3 library를 사용하는 경우 put_record 메서드를 사용해서 키네시스에 데이터를 흘릴 수 있다.

 

아래 데이터를 키네시스에 쏜다고 가정하자.

data = {
    "uuid": "0000",
    "datetime": "2000-00-00", 
    "name": "진웅",
}

 

Basic code

문서에서 설명하는 코드라면, 한글이 포함된 데이터를 키네시스로 흘리는 코드는 아래와 같다.

data = {
    "uuid": "0000",
    "datetime": "2000-00-00",
    "name": "진웅",
}


import boto3
import json

client = boto3.client('kinesis', region_name='ap-northeast-2')

payload = json.dumps(data, ensure_ascii=False).encode('utf-8')

for _ in range(3):
    response = client.put_record(
        StreamName='StremName',
        Data=payload,
        PartitionKey='string',
    )

 

Result

Row가 붙어서 저장 된다.

카프카는 Row가 알아서 분리되니까 당연히 키네시스도 그럴줄 알았다.

Solved code

data = {
    "uuid": "0000",
    "datetime": "2000-00-00",
    "name": "진웅",
}


import boto3
import json

client = boto3.client('kinesis', region_name='ap-northeast-2')

payload = json.dumps(data, ensure_ascii=False).encode('utf-8') + b'\n' # Point

for _ in range(3):
    response = client.put_record(
        StreamName='StreamName',
        Data=payload,
        PartitionKey='string',
    )

json.dumps 메서드를 이용해서 data를 인코딩 했으므로 newline character로 사용할 \n 도 byte code로 변환해서 붙여주자.

 

즉 payload마다 끝에 b'\n' 만 추가해준다. 

 

의도한 대로 저장 되었다. 

 


 

'Cloud' 카테고리의 다른 글

AWS Secret Manager Tutorial  (0) 2022.03.09
Kinesis, MSK, Kafka  (0) 2022.02.25
HDFS vs S3  (0) 2022.02.13
LocalStack 컨테이너 볼륨 이슈  (0) 2022.02.04
LocalStack S3를 python boto3로 접근하기  (0) 2022.01.04
Comments