반응형

1.이슈 내용

  • 최근 EMR Cluster 에서 도커 이미지를 이용해 Spark - submit 실행하는 job 을 추가함.
  • 테스트 시에는 문제가 되지 않았으나, 새벽 배치에서 장애 발생

2.장애 또는 에러 내용

  • Docker inspect command : /usr/bin/docker inspect —format {{.State.ExitCode}} container_iD_appid_…..
  • Exit code from docker inspect : 1

3.이슈 원인

  • EMR 에서 Scale Out 시 Task 노드를 임의로 할당 받게 된다. (Spot instance 사용 중)
  • Task 노드의 커널 아키텍쳐가 이미지 내 빌드된 프로세서 아키텍쳐와 호환이 안될 가능성이 있다.
    • 내가 amd64 아키텍쳐로 빌드를 했는데 실제로 arm64 아키텍쳐의 노드 위에서 실행 될 경우..
  • docker inspect 는 실행 전 이미지를 검사하는 단계로 보여진다. 

4.해결방법

  • buildx 를 이용하여 멀티 프로세서 아키텍쳐에 맞게 빌드한다.
  • 참고로 buildx 를 이용할 때 빌드와 push 만 가능하다.
1. buildx 활성화 및 확인
$ docker buildx version
$ docker buildx ls

2. buildx 초기화 및 빌더 인스턴스 생성
$ docker buildx create --name multi-archi-builder
$ docker buildx use multi-archi-builder


$ docker buildx inpsect --bootstrap 
-- bootstrap 은 초기화 프로세스 플래그

3. build 와 동시에 push 하기
$ docker buildx build --platform linux/arm64,linux/amd64 -t myapp:latest --push .

4. 이미지 확인하기
$ docker manifest inpsect [이미지]:[태그]
 

5.회고

- 사실 aws 코리아 기술자 분들과 미팅을 하면서,쿠버네티스 환경에서는 꼭 컨테이너 이미지의 멀티 아키텍쳐 빌드가 필요하다는 내용을 팁으로 들었었다. 그때는 잘 끄덕였는데.. 귀로만 흘려들었더니, 새벽 4시에 일어나 장애 대응을 해야 했던 결과를 맞았다.

최근 배치 장애도 잦고, 더 꼼꼼해야 겠다. 그리고 반성하자

반응형
반응형

1.airbyte 란?

  • 오픈소스 데이터 통합 플랫폼 (ELT)
  • api , database, warehouse , application 간 데이터 sync, 즉 동기화 를 돕는 , 가능하게 해주는 소프트웨어 라고 하지만 내생각엔 아직 툴..
  • 데이터 통합 상품
  • 장점
    • built for extensibility
      • 커넥터 추가가 쉽고 확장성을 제공한다.
    • optional nomalized schemas
      • 선택적으로는 스키마를 정규화 할 수 있다.
    • Full grade schfeduler
      • 필요한 만큼 replication 을 자동화 할 수 있다.
    • real - time monitoring
      • 모든 로그를 모니터링 하고, 기능으로 제공한다.
    • incremental updates
      • replication 이 증분 업데이트를 기반으로 동작하여 transfer cost 를 줄여준다.
    • manual full refresh
      • 원할 때 수동으로 refresh 가 가능하다.
  • 단점
    • Stable 릴리즈 버전 없음, 아직 알파
    • 사용자 액세스 관리에 대한 지원 부족

 

2. 왜 airbyte ?

  • 기존 ETL 기반의 아키텍쳐에서 ELT 기반으로 리아키텍쳐링 할 때, 원본 데이터 소스를 이관 및 sync 해주는 역할이 중요해졌고, airbyte 가 시장에 빠르게 진입 했다고 생각한다.
  • 손쉽게 커넥터 설치만으로 데이터 연동 및 sync 가 가능해졌고, 충분한 UI 를 제공하고 있다.
  • airflow 로도 비슷한 구현을 할 수 있지만 개발이 필요한데.. 얘는 개발도 안해도 되고 CDC 옵션까지 제공한다.
  • 커넥터가 정말 많고 다양하게 지원한다.

3. airbyte 구성 요소

  • UI
    • airbyte 사용자를 위한 GUI
  • WebServer
    • UI 와 API 사이에서 발생하는 이벤트를 핸들링 하는 웹 서버
  • Config Store
    • 커넥션 정보들을 담고 있음 ( credential, 주기 등등.)
  • Config API
    • airbyte 의 main controle plane. 직역하면 관리영역이고, airbyte 의 모든 operation(동작) 들. API 콜 포함하여 설정하고 Inovoke 를 수행한다.
  • Scheduler
    • API 로 요청을 받고 Temporal Service 로 병렬적으로 보낸다. 잡의 성공/실패를 트래킹 하는 역할도 있다.
  • Scheduler Store
    • 예약된 스케쥴 job 정보가 저장된 곳
  • Temporal Service
    • 큐에 쌓이는 Task 와 workflow. 를 관리한다.
  • Worker
    • 소스 커넥터에 연결하고, data 를 받아와 목적지에 쓰는 역할을 수행한다
  • 지원되는 동기화 모드
    • full refresh - overwrite - 전체 새로고침 덮어쓰기 , 모든 데이터를 다시 동기화 하고 교체
    • full refresh - append - 전체 새로고침 추가 , 모든 행을 다시 동기화 하고 복제
    • incremental append - 증분 추가 , 새 행을 동기화하고 이미 동기화된 행뒤에 추가
    • incremental dedupe history - 중복 제거된 증분 추가, 새 행을 동기화 하고 동기화된 행을 추가하며 증분 중복제거를 기록

위 구성 컴포넌트들의 이름이 조금 다르게 되있지만 컨테이너의 로그를 보면 대략적으로 어떤 데몬이 해당 컴포넌트 역할을 하는지 알 수 있다.

 

** airbyte 는 job 이 수행될 때 동적으로 해당 job의 컨테이너가 새로 생성되서 동작한다. 관리형 컨테이너 서비스를 써서 구축한다면 참고하길 바란다.

 

 

참조 

https://airbytehq.github.io/understanding-airbyte/high-level-view/

 

Architecture overview | Airbyte Documentation

A high level view of Airbyte's components.

docs.airbyte.com

 

 

 

반응형
반응형

1.사전준비

  • Docker , Docker Compose 가 설치되어 있어야 한다.
  • 카프카 cli  사용을 위해 kafka binary 버전을 미리 받아 실행 준비를 해둔다.
 

Apache Kafka

Apache Kafka: A Distributed Streaming Platform.

kafka.apache.org

2. Docker-compose 작성

.env

CONFLUENT_VERSION=7.0.1

docker-compose.yml

version: '3'

networks:
  jssvs-net:
    external: true

services:
  zookeeper:
    image: confluentinc/cp-zookeeper:${CONFLUENT_VERSION}
    hostname: zookeeper
    restart: on-failure
    ports:
      - 2181:2181
    volumes:
      - ./zookeeper/data:/data
      - ./zookeeper/logs:/datalog
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
    networks:
      - jssvs-net

  kafka-1:
    image: confluentinc/cp-kafka:${CONFLUENT_VERSION}
    hostname: kafka-1
    restart: on-failure
    ports:
      - 9091:9091
    depends_on:
      - zookeeper
    volumes:
      - ./kafka-1/data:/var/lib/kafka/data
    environment:
      KAFKA_BROKER_ID: 101
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_INTER_BROKER_LISTENER_NAME: "INTERNAL"
      KAFKA_ADVERTISED_LISTENERS: "INTERNAL://kafka-1:29092,EXTERNAL://localhost:9091"
      KAFKA_LISTENERS: "INTERNAL://:29092,EXTERNAL://:9091"
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT"
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
      CONFLUENT_METRICS_REPORTER_TOPIC_REPLICAS: 1
      CONFLUENT_METRICS_ENABLE: 'false'
    networks:
      - jssvs-net
  kafka-2:
    image: confluentinc/cp-kafka:${CONFLUENT_VERSION}
    hostname: kafka-2
    restart: on-failure
    ports:
      - 9092:9092
    depends_on:
      - zookeeper
    volumes:
      - ./kafka-2/data:/var/lib/kafka/data
    environment:
      KAFKA_BROKER_ID: 102
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_INTER_BROKER_LISTENER_NAME: "INTERNAL"
      KAFKA_ADVERTISED_LISTENERS: "INTERNAL://kafka-2:29092,EXTERNAL://localhost:9092"
      KAFKA_LISTENERS: "INTERNAL://:29092,EXTERNAL://:9092"
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT"
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
      CONFLUENT_METRICS_REPORTER_TOPIC_REPLICAS: 1
      CONFLUENT_METRICS_ENABLE: 'false'
    networks:
      - jssvs-net

  kafka-3:
    image: confluentinc/cp-kafka:${CONFLUENT_VERSION}
    hostname: kafka-3
    restart: on-failure
    ports:
      - 9093:9093
    depends_on:
      - zookeeper
    volumes:
      - ./kafka-3/data:/var/lib/kafka/data
    environment:
      KAFKA_BROKER_ID: 103
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_INTER_BROKER_LISTENER_NAME: "INTERNAL"
      KAFKA_ADVERTISED_LISTENERS: "INTERNAL://kafka-3:29092,EXTERNAL://localhost:9093"
      KAFKA_LISTENERS: "INTERNAL://:29092,EXTERNAL://:9093"
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT"
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
      CONFLUENT_METRICS_REPORTER_TOPIC_REPLICAS: 1
      CONFLUENT_METRICS_ENABLE: 'false'
    networks:
      - jssvs-net



  manager:
    image: obsidiandynamics/kafdrop
    restart: "no"
    ports:
      - 9000:9000
    environment:
      KAFKA_BROKERCONNECT: kafka-1:29092
      JVM_OPTS: "-Xms16M -Xmx48M -Xss180K -XX:-TieredCompilation -XX:+UseStringDeduplication -noverify"
    depends_on:
      - zookeeper
      - kafka-1
      - kafka-2
      - kafka-3
    networks:
      - jssvs-net

 

- 참조 (https://github.com/jaysooo/kafka-flink-stack-docker-compose)

3. 컨테이너 생성 및 실행

# 1) network 생성
$ docker network create jssvs-net

# 2) docker-compose up
$ docker-compose -f docker-compose.yml up -d

-> 브라우저에서 http://localhost:9000 로 접속하면 kafdrop 이라는 web UI 로 카프카 정보를 확인할 수 있다

 

4. 간단한 실습

카프카 binary 버전을 다운로드 받은후 하위  bin 디렉토리에 CLI 쉘 스크립트를 이용한다.

kafdrop 에서도 토픽 생성은 가능하다.

 

# 1) 토픽 생성
$ ./kafka-topics.sh --bootstrap-server 127.0.0.1:9091 --topic my-topic1 --create --partitions 1 --replication-factor 1

# 2) 토픽 정보 보기
$ ./kafka-topics.sh --bootstrap-server 127.0.0.1:9091 --topic my-topic1 --describe

# 3) 토픽 구독하기 (consumer)
$ ./kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9091 --from-beginning --topic my-topic1

# 4) 토픽 삭제 하기
$ ./kafka-topics.sh --bootstrap-server 127.0.0.1:9091 --topic my-topic1 --delete

 

 

5. 마치며

  • 회사에서 운영 목적으로 사용할 flink 를 공부하면서 카프카도 함께 공부 하고 있는데, 어렵기도 하고 시간이 너무 부족하다.
  • 주로 실시간 데이터는 kinesis 로 받아서, firehose + lambda 기반 ETL 처리로 손쉽게 구성했었는데 아무래도 현업에서는 카프카가 더 많이 쓰이기도 하고, 최근에 트렌드가 데비지움 카프카 커넥트로 CDC -> kafka 구성을 많이 하는 것 같다.
  • 다음 포스팅에서 카프카와 연동하는 producer application 과 consumer application 을 간단하게 작성해서 업로드 하겠다. 
  • 바쁘다.. 바뻐  
반응형

'Data Engineer' 카테고리의 다른 글

airbyte(에어바이트) 구축 및 실습  (0) 2023.01.02
airbyte (에어바이트) 기초  (1) 2023.01.02
Apache kafka (카프카) 기초  (1) 2022.08.19
kubernetes 기초 (1)  (0) 2021.12.01
pyspark 기초 (1)  (0) 2021.10.03

+ Recent posts