without haste but without rest
aws kinesis firehose - 데이터가 한 줄로 저장되는 문제 본문
Problem
aws kinesis firehose를 이용해서 s3에 데이터 저장 시 json 데이터가 모두 한 줄로 적재되는 문제
급하다면 제일 아래 Solved code로 이동..
Detail
그래 이거다. 난 당연히 아래처럼 데이터가 적재될 줄 알았다.
그런데 데이터를 까보니까 위처럼 저장된다.
구글링 해보니까 뭔가 복잡한 방법을 사용하는 것 같다. 그런데 핵심은 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