설치 방법

$ git clone https://github.com/apache/superset.git
$ cd superset
$ docker-compose -f docker-compose-non-dev.yml pull
$ docker-compose -f docker-compose-non-dev.yml up

# 버전별 설치
% git checkout 1.4.0
$ TAG=1.4.0 docker-compose -f docker-compose-non-dev.yml pull
$ TAG=1.4.0 docker-compose -f docker-compose-non-dev.yml up

도커 어플리케이션에서 아래 처럼 나와야 정상이다..!

하지만.. 무수히 떨어지는 엄청난 에러..


SUPERSET_SECRET_KEY 설정과 더불어 많은 시도를 했지만 결국 해결하지 못했다.

대체 설치 방법

apache/superset에서 dockerhub 기재한 글을 보고 도전해보았다.

$ docker run -d -p 8080:8088 -e "SUPERSET_SECRET_KEY=your_secret_key_here" --name superset apache/superset

# 1. 로컬에서 admin account를 셋업.
$ docker exec -it superset superset fab create-admin \
              --username admin \
              --firstname Superset \
              --lastname Admin \
              --email admin@superset.com \
              --password admin
              
# 2. local DB를 latest에 migrate
$ docker exec -it superset superset db upgrade

# 3. 예제 로드
$ docker exec -it superset superset load_examples

# 4. roles 셋업
$ docker exec -it superset superset init


차근히 따라하니 아래 사진처럼 제대로 접근할 수 있게 되었다. 오예~

추가로 sqlalchemy, sqlalchmy-redshift, ipython-sql을 설치했다.(hub.docker.com 문서를 따라하니 설치하라고 함)

아래는 pip install을 실행했을 때(2024.05.13) 기준 버전이다.

SQLAlchemy = 2.0.30

sqlalchemy-redshift = 0.8.14
# Require sqlalchemy < 2.0, >= 0.92

ipython-sql = 0.5.0
# Require sqlalchemy >= 2.0


서로 호환이 안되어 pip install SQLAlchemy==1.4.49, pip install ipython-sql==0.4.1 (0.5.0 이전 버전)으로 설치하니 해결되었다.

ipython-sql 0.4.1 버전 실행 후 호환성 체크

https://hub.docker.com/r/apache/superset

 

Docker

 

hub.docker.com

 

※ 도커 빌드는 다시 한번 시도해서 꼭 해결하리라..

'데브코스 > Week 7' 카테고리의 다른 글

Week 7 AWS(1)  (1) 2024.04.30

클라우드 컴퓨팅

IT 리소스를 인터넷을 통해 필요한 만큼 제공받고 사용한 만큼만 비용을 지불하는 방식

이점

  • 민첩성 : 빠르게 배포 및 운영
  • 탄력성 : 리소스를 할당받아 사용하기에 
  • 비용절감 : 할당 받은 리소스 중 안쓰는 리소스를 반납이 가능하여 비용이 절감됨.
  • On demand : 필요한 만큼 제공받을 수 있음.
  • 관리 용이성 : GUI 툴을 이용해서 관리하기 때문에 용이함.

종류

Amazon AWS, MS Azure, Google GCP, Oracle OCI, IBM Cloud, Naver NCP 등등

기본용어

가상화  물리적 컴퓨터 하드웨어를 보다 효율적으로 활용할 수 있도록 해주는 프로세스이며, 이는 클라우드 컴퓨팅의 기반을 제공하는 기술
가상머신 - 가상 머신(VM)은 소프트웨어 형식으로 물리적 컴퓨팅을 시뮬레이션하는 가상 환경이다.
- 이들은 일반적으로 VM의 구성, 가상 하드 드라이브의 스토리지, 그리고 특정 시점에 해당 상태를 유지하는 VM의 일부 스냅샷을 포함한 다수의 파일들로 구성되어 있다.
스냅샷 - 마치 사진 찍듯이 특정 시점에 스토리지의 파일 시스템을 포착해 보관하는 기술
- Windows OS의 복원 지점과 같이 장애나 데이터 손상 시 스냅샷을 생성한 시점으로 데이터를 복구
- 스냅샷은 원본 데이터를 그대로 복사해 다른 곳에 저장하는 백업과 달리 초기 생성 시 혹은 데이터의 변경이 있기 전까지는 스토리지의 공간을 차지하지 않는다.
- 메타데이터(데이터에 대한 부가적인 정보)의 복사본에 해당하기 때문에 생성하는 데 오랜 시간이 걸리지 않고, 장애 상황이 발생해도 빠르게 데이터를 복원
Region(지역) - Data Center가 위치한 지역
- IT 리소스를 생성할 Region은 선택 가능
- 대상 고객의 지역과 자원 생성할 Region이 최대한 가까워야 함
- 국가마다 자원사용 비용이 다름
Availability Zone(가용 영역) - 하나의 Region은 두 개 이상의 Availability Zone으로 구성됨.
- 줄여서 AZ로 표시

 

EC2

서버를 할당해주는 AWS 서비스

기능

  • 인스턴스: 가상 컴퓨팅 환경
  • Amazon 머신 이미지(AMI) : 서버에 필요한 운영체제와 소프트웨어들이 적절히 구성된 상태로 제공되는 템플릿
  • 인스턴스 유형 : 인스턴스를 위한 CPU, 메모리, 스토리지, 네트워킹 용량의 여러 가지 구성 제공
  • 키 페어를 사용하여 인스턴스 로그인 정보 보호(AWS는 퍼블릭 키를 저장하고 사용자는 개인 키를 안전한 장소에 보관하는 방식)
  • 인스턴스 스토어 볼륨 : 임시 데이터를 저장하는 스토리지 볼륨으로 인스턴스 중단, 최대 절전 모드로 전환 또는 종료 시 삭제됨
  • Amazon Elastic Block Store(Amazon EBS), 즉 Amazon EBS 볼륨을 사용해 영구 스토리지 볼륨에 데이터 저장
  • 보안 그룹을 사용해 인스턴스에 연결할 수 있는 프로토콜, 포트, 소스 IP 범위를 지정하는 방화벽 기능
  • 탄력적 IP 주소(EIP) : 동적 클라우드 컴퓨팅을 위한 고정 IPv4 주소
  • 태그 : 사용자가 생성하여 Amazon EC2 리소스에 할당할 수 있는 메타데이터
  • Virtual Private Clouds(VPC) : AWS 클라우드에서는 논리적으로 격리되어 있지만 원할 때 마다 고객의 네트워크와 간편히 연결할 수 있는 가상 네트워크

EC2 구성도

사용법

고정적 IP를 사용하고 싶으면 탄력적 IP 설정

탄력적 IP 주소 할당 방법

 

Elasticbeanstalk

Elastic Beanstalk를 사용하면 애플리케이션을 실행하는 인프라에 대해 자세히 알지 못해도
AWS 클라우드에서 애플리케이션을 신속하게 배포하고 관리할 수 있습니다.

Elastic Beanstalk를 사용하면 선택 또는 제어에 대한 제한 없이 관리 복잡성을 줄일 수 있습니다.
애플리케이션을 업로드하기만 하면 Elastic Beanstalk에서 용량 프로비저닝, 로드 밸런싱, 조정, 애플리케이션 상태 모니터링에 대한 세부 정보를 자동으로 처리합니다.

Elastic Beanstalk는 Go, Java, NET, Node js, PHP, Python 및 Ruby에서 개발된 애플리케이션을 지원합니다.
애플리케이션을 배포할 때, Elastic Beanstalk가 선택된 지원 가능 플랫폼 버전을 구축하고 Amazon EC2 등의 AWS 리소스를 하나 이상 프로비저닝하여 애플리케이션을 실행합니다.

 

DB

RDS

  • DB 인스턴스는 클라우드에서 실행하는 격리된 DB 환경.
    여러 사용자가 만든 DB가 포함될 수 있으며, 독립 실행형 DB 인스턴스에 엑세스할 때 사용하는 도구 및 어플리케이션을 사용해 엑세스할 수 있음.
  • AWS 명령줄 도구, Amazon RDS API 작업 또는 AWS Management Console을 사용해 간단히 DB 인스턴스를 만들고 수정할 수 있음.
  • 직접 시스템 로그인 불가능.
  • RDS는 서버리스(serverless)가 아님.

Document DB

  • MongoDB API 워크로드의 완전 관리 및 유연한 확장이 가능한 문서전용 DB.
  • 스토리지 및 컴퓨팅이 분리되어 각각을 독립적으로 조정.
  • 개발자는 데이터 크기에 관계없이 지연 시간이 짧은 읽기 전용 복제본을 몇 분 내에 최대 15개까지 추가하여 읽기 용량을 초당 수백만 개의 요청으로 늘릴 수 있음.
  • 99.99%의 가용성을 위해 설계되었으며 6개의 데이터 복사본을 3개의 AWS 가용 영역(AZ)에 복제
  • JSON 데이터 이용
  • 유연한 인덱싱
  • EC2에 구축도 가능

MongoDB

  • MongoDB는 Document 지향 Database.
  • 데이터 중복이 발생할 수 있지만 접근성과 가시성이 좋음.
  • 스키마 설계가 어렵지만 스키마가 유연해서 Application의 요구사항에 맞게 데이터를 수용할 수 있다.
  • 분산에 대한 솔루션을 자체적으로 지원해서 Scale-out이 쉽다.
  • 확장시 Application을 변경하지 않아도 된다.

Dynamo DB

  • Amazon DynamoDB는 완전관리형 Key-Value 기반 NoSQL DB 서비스.
  • Auto-Scaling 제공(용량의 유연함)
  • 유휴 시 암호화를 제공하여 중요한 데이터 보호와 관련된 운영 부담 및 복잡성을 제거.
  • 원하는 양의 데이터를 저장 및 검색하고 어느 수준의 요청 트래픽도 처리할 수 있는 DB 테이블 생성 가능.
  • AWS Management Console을 사용하여 리소스 사용률 및 성능 지표를 모니터링할 수 있음.
  • 온디맨드 백업 기능을 제공.
  • 테이블 생성 시 스키마 생성 필요 없음.

RDBMS와 MongoDB의 구조적 차이
Document DB vs Dynamo DB

 

Network

Route53

  • 가용성, 확장성이 뛰어난 DNS(Domain Name System) 웹 서비스
  • 도메인 등록, DNS 라우팅, 상태 확인을 조합하여 실행할 수 있음.
  • public host zone과 private host zone이 존재.
  • DNS + monitoring + L4 + GSLB

Route53의 과정
AWS에서 도메인 등록하는 방법.
외부 도메인 사용 방법

 

Certification Manager

AWS Certificate Manager(ACM)를 사용하면 AWS 서비스 및 연결된 내부 리소스에 사용할 공인 및 사설 SSL/TLS 인증서를 프로비저닝, 관리 및 배포할 수 있음. ACM은 SSL/TLS 인증서를 구매, 업로드 및 갱신하는 데 드는 시간 소모적인 수동 프로세스를 대신 처리해줌.
SSL/TLS 인증서는 다른 곳에서 발급한 프라이빗 키 사용 가능.

  • 사용법
    • 사용할 SSL/TLS 인증서를 AWS 계정으로 요청하거나 가져온다.
    • DNS 또는 이메일 검증을 통해 요청된 인증서의 도메인 소유권을 검증하여 인증서 발급을 완료한다.
    • Elastic Load Balancing(ELB), Amazon CloudFront 등과 같은 다양한 AWS 서비스에서 새로 발급되거나 가져온 인증서를 사용한다.
  • 특징
    • ACM 통합 서비스를 위한 무료 퍼블릭 인증서
    • 관리형 인증서 갱신
    • 손쉽게 인증서 받기

CloudFront

Amazon CloudFront는 뛰어난 성능, 보안 및 개발자 편의를 위해 구축된 콘텐츠 전송 네트워크(CDN) 서비스.

  • CDN은 데이터 사용량이 많은 어플리케이션의 웹 페이지 로드 속도를 높이는 상호 연결된 서버 네트워크
  • 정적 콘텐츠 & 동적 콘텐츠
  • 캐싱 / 동적 가속 / 엣지 로직 계산
  • 특징
    • 대기 시간 감소
    • 보안 향상
    • 비용 절감
    • 사용자 정의 전송
  • IP 차단을 위해서는 WAF를 이용하면 됨.

Cloud Frond 작동 과정

 

Elastic Load Balancing(ELB)

로드 밸런싱은 애플리케이션을 지원하는 리소스 풀 전체에 네트워크 트래픽을 균등하게 배포하는 방법.
로드 밸선서(Load Balancer)는 서버에 가해지는 부하(로드)를 분산(밸런싱)해주는 장치 또는 기술

  • 대상 그룹에 대상을 등록한다.
  • 기본적으로 로드 밸런서는 대상 그룹에 대해 지정한 프로토콜과 포트 번호를 사용하여 등록된 대상으로 요청을 전송한다.
  • 대상 그룹에 각 대상을 등록할 때 이 포트를 재정의할 수 있다.

ELB 작동 과정 / 로드 밸런서 종류

VPC(Virtual Private Cloud)

Amazon Virtual Private Cloud 사용자가 정의한 가상 네트워크로 AWS 리소스를 시작할 수 있다.
이 가상 네트워크는 AWS의 확장 가능한 인프라를 사용한다는 이점과 함께 고객의 자체 데이터 센터에서 운영하는 기준 네트워크와
유사하다.

  • Peering Connection : 각각의 VPC를 연결할 수 있게 해줌
  • VPC 내에 여러가지 서브넷을 나눠서 운용 가능
  • 기능
    • 자체 데이터 센어테어 운영하는 기존 네트워크와 유사한 가상 네트워크.
    • 서브넷 : VPC의 IP 주소 범위이다. 서브넷은 단일 가용 영역에 상주해야 한다. 서브넷을 추가한 후에는 VPC에 AWS 리소스를 배포할 수 있다.
    • VPC와 서브넷에 IPv4, IPv6 주소 할당 가능. 또한 퍼블릭 IPv4 및 IPv6 GUA 주소를 AWS에 가져오고 VPC 리소스에 할당할 수 있다.
    • 라우팅 테이블을 사용하여 서브넷 또는 게이트웨이의 네트워크 트래픽이 전달되는 위치를 결정한다.
    • 게이트웨이는 VPC를 다른 네트워크에 연결한다.
      엔드포인트를 사용하여 인터넷 게이트웨이 또는 NAT 장치를 사용하지 않고 AWS 서비스에 비공개로 연결.

VPC의 간략한 구성 / VPC 생성 과정 / VPC 구성

CIDR(Classless Inter-Domain Routing)

클래스 없는 도메인 간 라우팅 기법

초록색(빨간 선 오른쪽부분) : 호스트 영역(내가 할당할 수 있는 IP 대역)
파랑, 분홍, 주황색: 네트워크 영역(네트워크 주소 범위)
빨간색 / : 사이더

IAM(Identity and Access Management)

AWS 리소스에 대한 액세스를 안전하게 제어할 수 있는 웹서비스.
IAM을 사용하여 리소스를 사용하도록 인증(로그인) 및 권한 부여(권한 있음)된 대상을 제어한다.
AWS 계정을 생성할 때는 완전한 액세스 권한이 있는 단일 로그인 ID로 시작(루트 사용자) 일상적인 작업에는 IAM을 사용하도록 권장.

  • 특징
    • AWS 계정에 대한 공유
    • 세분화된 권한
    • EC2에서 실행되는 어플리케이션을 위한 보안 AWS 리소스 액세스
    • 멀티 팩터 인증(MFA)
    • ID 페더레이션
    • 보장을 위한 자격 증명 정보
    • PCI DSS 준수
    • 많은 AWS 서비스와의 통합
    • 최종 일관성
    • 무료 사용

IAM의 구성 및 흐름도

정책 : 어떤 리소스들에 접근할 수 있고 허가를 하는 지에 대해 기술한 것
역할 : 정책을 모아 놓은 것이며 각각의 서비스들에 대한 접근 권한을 줌.

S3

Amazon Simple Storage Service(Amazon S3) 업계 최고의 확장성, 데이터 가용성, 보안 및 성능을 제공하는 객체 스토리지
모든 규모와 업종의 고객은 S3를 사용하여 데이터 레이크, 웹사이트, 모바일 어플리케이션, 백업 및 복원, 아카이브 등 다양한 사용 사례에서 원하는 양의 데이터를 저장하고 보호할 수 있다.
특정 비즈니스, 조직 및 규정 준수 요구 사항에 맞게 데이터에 대한 액세스를 최적화, 구조화 및 구성할 수 있는 관리 기능을 제공함.

  • 기능
    • 스토리지 클래스
    • 스토리지 관리
    • 액세스 관리
    • 데이터 처리
    • 스토리지 로깅 및 모니터링
    • 분석 및 인사이트
    • 강력한 일관성 준수
    • 정적 웹사이트 호스팅
      - 개별 웹 페이지는 정적 콘텐츠를 포함함.
      - 클라이언트 측 스크립트를 포함할 수 있음.
      - 동적 웹사이트는 PHP, JSP 또는 .NET 등 서버 측 스크립트를 포함한 서버 측 처리에 의존함.
     

S3 구성

CI/CD

CI(Continuous Integration)
모든 개발자가 코드를 공유 레포지토리에 하루에도 여러번 코드를 커밋하고 병합하는 것

CD(Continuous Delivery)
개발팀이 짧은 주기로 소프트웨어를 개발하고 운영 환경으로 안정적으로 배포하는 것

CI/CD 활동 CI/CD가 구성 될 경우 구성도

CodeCommit

소스에 대한 레포지토리의 형상 관리 도구.(Github 같은 것)
클라우드에서 자산(문서 소스코드, 바이너리 파일 등)을 비공개로 저장하여 관리하는 데 사용할 수 있도록 AWS 서비스에서 호스팅되는 버전 관리 서비스

  • 특징
    • Benefit from a fully managed service hosted by AWS
    • Store your code securely
    • Work collaboratively on code
    • Easily scale your version control projects
    • Store anything, anytime
    • Integrate with other AWS and third-party services
    • Easily migrate files from other remote repositories
    • Use the Git tools you already know

CodeBuild

클라우드 상의 완전 관리형 빌드 서비스
소스코드를 컴파일하고 단위 테스트를 실행하여 배포 준비가 완료된 아티팩트를 생성
CodeBuild에서는 자체 빌드 서버를 프로비저닝, 관리 획장할 필요는 없음.
Apache Mavern, Gradle 등과 같은 프로그래밍 언어 및 빌드 도구에 맞게 사전 패키지된 빌드 환경 제공
빌드 환경을 사용자 지정하여 사용자 고유의 빌드 도구를 사용
최대 빌드 요청 수에 맞게 자동으로 확장.

Code Build 작동방식

CodeDeploy

EC2 인스턴스, 온프레미스 인스턴스, 서버리스 Lambda 함수 또는 ECS 서비스로 어플리케이션 자동 배포 서비스
코드, 웹 및 구성파일, 패키지, 스크립트 등 어플리케이션 콘텐츠를 거의 무제한으로 배포 가능.
서버에서 실행되고 S3 버킷, Github 레포지 또는 Bitbucket 레포지에 저장되는 어플리케이션 콘텐츠, 서버리스 Lambda 함수 배포 가능.

CodePipeline

빠르고 안정적인 어플리케이션 및 인프라 업데이트를 위해 릴리스 파이프라인을 자동화하는 데에 도움이 되는
완전관리형의 지속적 전달 서비스
CI/CD 전 과정을 자동화.

  • 특징
    • SW 릴리스 프로세스를 모델링하고, 서버를 설정하거나 프로비저닝할 필요성을 줄일 수 있음.
    • AWS Management Console 또는 AWS CLI(command line interface)를 사용하여 SW 릴리스 프로세스 단계를 정의할 수 있음.
    • 피드백을 반복하고 각 코드 변경을 테스트하여 버그를 포착하는 새로운 기능을 신속하게 릴리스할 수 있음.
    • 릴리스 프로세스의 모든 단계에서 자체 플러그 또는 사전 구축된 플러그인을 사용하여 필요에 맞추어 조정할 수 있음.

CodePipeline 과정

'데브코스 > Week 7' 카테고리의 다른 글

Mac, Docker, and Superset  (0) 2024.05.13

ROW_NUMBER()

SELECT된 레코드들에 특정 기준을 붙여서 일련번호 추가

  • PARTITION BY : 특정 값을 기준으로 그룹핑(GROUP BY와는 다르지만 ROW_NUMBER에서 쓰일 땐 역할이 비슷함)
ROW_NUMBER() OVER(PARTITION BY field1 ORDER BY field2)
-- 필드1을 그룹핑해서 필드2를 기준으로 정렬

FIRST_VALUE/LAST_VALUE

FIRST_VALUE는 쿼리 결과에서 첫번째 행을,  LAST_VALUE는 마지막 행을 가져옴.( 사용법 참조: https://gent.tistory.com/338 )

트랜잭션

  • Atomic하게 실행되어야 하는 SQL들을 묶어서 하나의 작업처럼 처리하는 방법
    • DDL이나 DML 중 레코드를 수정/추가/삭제한 것에만 의미가 있음.
    • SELECT에는 트랜잭션을 사용할 이유가 없음
    • BEGIN과 END 혹은 BEGIN과 COMMIT 사이에 해당 SQL 들을 사용
    • SQL이 하나라도 실패하면 ROLLBACK
  • 트랜잭션 커밋 모드 : autocommit
    • autocommit = True
      • 모든 레코드 수정/삭제/추가 작업이 기본적으로 바로 DB에 쓰여짐. 이름 커밋 된다고 함.
      • 만약 특정 작업을 트랜잭션으로 묶고 싶다면 BEGIN과 END(COMMIT)/ROLLBACK 으로 처리
    • autocommit = False
      • 모든 레코드 수정/삭제/추가 작업이 COMMIT 호출될 때 까지 커밋되지 않음
  • Google Colab의 트랜잭션
    • 기본적으로 모든 SQL statement가 바로 커밋됨 (autocommit = True)
    • 이를 바꾸고 싶다면 BEGIN;END; 혹은 BEGIN;COMMIT;을 사용(혹은 ROLLBACK)
  • psycopg2의 트랜잭션
    • autocommit이라는 파라미터로 조절 가능
    • autocommit = True : 기본적으로 PostgreSQL의 커밋 모드와 동일
    • autocommit = False : 커넥션 객체의 .commit()과 .rollback()함수로 트랜잭션 조절 가능

DELETE FROM vs TRUNCATE

  • DELETE FROM table_name
    • 테이블에서 모든 레코드를 삭제
    • DROP TABLE table_name과 다른 점은 레코드를 삭제하지만 테이블은 남아있음.
    • WHERE 사용해 특정 레코드만 삭제 가능.
  • TRUNCATE table_name
    • 테이블에서 모든 레코드를 삭제
    • DELETE FROM은 속도가 느림
    • 전체 테이블의 내용 삭제시에는 DELETE보다 유리
    • 단점 2가지
      • WHERE 지원 X
      • 트랜잭션 지원 X

'데브코스 > Week 6' 카테고리의 다른 글

Week 6 - 3  (0) 2024.04.25
Week 6 - 2  (0) 2024.04.23
Week 6 - 1  (0) 2024.04.22

GROUP BY

테이블의 레코드를 그룹핑하여 그룹별로 다양한 정보를 계산

  • 먼저 GROUP BY로 그룹핑을 할 필드를 결정(하나 이상의 필드가 될 수 있음, 필드 이름 또는 필드 일련번호를 사용)
  • 다음 그룹별로 계산할 내용을 결정
    • Aggregate 함수를 사용
    • COUNT, SUM, AVG, MIN, MAX 등등

※ TO_CHAR(str, 'YYYY-MM') vs LEFT(str, 7) vs DATE_TRUNC('month', str) vs SUBSTRING(str, 1, 7)
   TO_CHAR, LEFT, SUBSTRING은 다 리턴값이 문자열이지만 DATE_TRUNC는 시간.
    DATE_TRUNC 문서 참고 https://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_DATE_TRUNC.html

SELECT
    channel,
    COUNT(1) AS session_count,
    COUNT(DISTINCT userId) AS user_count
FROM raw_data.user_session_channel
GROUP BY 1                         -- GROUP BY channel
ORDER BY 2 DESC;              -- ORDER BY session_count DESC

CTAS(CREATE TABLE table_name AS SELECT TABLE A)

간단하게 새로운 테이블을 만드는 방법. 자주 조인하는 테이블들이 있다면 CTAS를 사용해서 조인해두면 편리함

DROP TABLE IF EXISTS adhoc.joonghyeon_session_summary;
CREATE TABLE adhoc.joonghyeon_session_summary AS
SELECT B.*, A.ts FROM raw_data.session_timestamp A
JOIN raw_data.user_session_channel B ON A.sessionid = B.sessionid;

CTE

중복된 레코드 체크하기

SELECT COUNT(1)
FROM adhoc.joonghyeon_session_summary;
-- code A


SELECT COUNT(1)
FROM (
	SELECT DISTINCT userID, sessionID, ts, channel
    FROM adhoc.joonghyeon_session_summary
);
-- code B

-- 두개 결과 확인하기

with ds AS (
	SELECT DISTINCT userID, sessionID, ts, channel
    FROM adhoc.joonghyeon_session_summary
)
SELECT COUNT(1)
FROM ds;
-- CTE를 사용해서 중복제거 후 카운트(code B와 결과는 완전 같지만 CTE를 사용하면 ds 테이블을 계속 사용 가능)

최근 데이터의 존재 여부 체크하기(freshness)

SELECT MIN(ts), MAX(ts)
FROM adhoc.joonghyeon_session_summary
-- 타임스탬프 필드를 찾아보는 방법

Primary Key uniqueness가 지켜지는지 체크하기

SELECT sessionID, COUNT(1)
FROM adhoc.joonghyeon_session_summary
GROUP BY 1
ORDER BY 2 DESC
LIMIT(1)
-- sessionID를 그룹핑하여 COUNT를 해주고 COUNT된 값으로 내림차순으로 해주는 방법

값이 비어있는 컬럼들이 있는지 체크하기

SELECT
	COUNT(CASE WHEN sessionID is NULL THEN 1 END) sessionid_null_count,
    COUNT(CASE WHEN userID is NULL THEN 1 END) userid_null_count,
    COUNT(CASE WHEN ts is NULL THEN 1 END) ts_null_count,
    COUNT(CASE WHEN channel is NULL THEN 1 END) channel_null_count,
FROM adhoc.joonghyeon_session_summary;
-- NULL일 때 1을 리턴 아니면 0 리턴

 

 

'데브코스 > Week 6' 카테고리의 다른 글

Week 6 - 5  (0) 2024.04.26
Week 6 - 2  (0) 2024.04.23
Week 6 - 1  (0) 2024.04.22

Redshift

AWS에서 제공하는 데이터 웨어하우스 서비스

웹서비스 사용자/세션 정보

  • 사용자 ID : 보통 웹서비스에서 등록된 사용자마다 부여하는 유일한 ID
  • 세션 ID : 세션마다 부여되는 ID
    • 세션 : 사용자의 방문을 논리적인 단위로 나눈 것
      • 사용자가 외부 링크(보통 광고)를 타고 오거나 직접 방문해서 올 경우 세션을 생성
      • 사용자가 방문 후 30분간 interaction이 없다가 뭔가를 하는 경우 새로 세션을 생성(time bound)
    • 즉 하나의 사용자는 여러 개의 세션을 가질 수 있음
    • 보통 세션의 경우 세션을 만들어낸 접점(경유지)를 채널이란 이름으로 기록해둠
      • 마케팅 관련 기여도 분석을 위함
    • 또한 세션이 생긴 시간도 기록
  • 위 정보들을 기반으로 다양한 데이터 분석과 지표 설정이 가능
    • 마케팅 관련, 사용자 트래픽 관련
    • DAU, WAU, MAU등의 일주월별 Active User 차트
    • Marketing Channel Attribution 분석(어느 채널에 광고를 하는 것이 가장 효과적인지)

 

상품 구매로 이어지면 기여도를 나눠야 함.

  • first channel attribution : 첫 광고
  • last channel attribution : 구매 직전 마지막 광고
  • multi channel attribution : 모든 광고에게 기여도 부여

 

SQL 기본 문법

  • 다수의 SQL 문을 실행할 때는 세미콜론으로 분리 필요
    • SQL 1; SQL 2; SQL 3;
  • SQL 주석
    • -- : 한줄짜리 주석.
    • /* */ : 여러 줄 주석
  • SQL 키워드는 대문자 사용 등 포맷팅이 필요.
    • 팀 프로젝트라면 팀에서 사용하는 공동 포맷 설정
  • 테이블/필드 이름의 명명 규칙 설정
    • 단수형 vs 복수형 : User vs Users
    • _ vs CamelCasing : user_session_channel vs UserSessionChannel

DDL

테이블 구조 정의 언어

  • CREATE TABLE : 테이블 생성
    <예시>
    CREATE TABLE raw_data.user_session_channel (
        userid int, (실수형)
        sessionid varchar(32) primary key, (문자열 32자)
        channel varchar(32)
    );
    • primary key uniqueness : 빅데이터 데이터 웨어하우스에서는 지켜지지 않음(Redshift, Snowflake, Bigquery 등)
    • CTAS : CREATE TABLE table_name AS SELECT TABLE A : table_name 테이블 생성 후 곧바로 TABLE A 에서 추출한 정보 입력( 다른 방법 : CREATE TABLE and then INSERT)
  • DROP TABLE : 테이블 제거
    • DROP TABLE table_name
    • 없는 테이블 제거하려는 경우는 에러 발생
    • 존재할 경우 제거하기
      • DROP TABLE IF EXISTS table_name;
      • DELETE FROM 조건(조건에 맞는 레코드들 삭제하지만 테이블 자체는 존재)
  • ALTER TALBE
    • 새로운 컬럼 추가 : ALTER TABLE 테이블명 ADD COLUMN 필드명 필드타입;
    • 기존 컬럼 이름 변경 : ALTER TABLE 테이블명 RENAME 현재필드명 to 새필드명;
    • ALTER TABLE 테이블명 DROP COLUMN 필드명;
    • ALTER TABLE 현재 테이블명 RENAME to 새테이블명
  • 레코드 수정 언어
    • INSERT INTO : 테이블에 레코드를 추가하는데 사용
    • UPDATE FROM : 테이블 레코드의 필드 값 수정
    • DELETE FROM : 테이블에서 레코드 삭제 (vs TRUNCATE)

DDL

레코드 질의 언어

  • SELECT FROM : 테이블에서 레코드와 필드를 읽어오는데 사용
    • DISTINCT : 중복 제거
    • COUNT : 필드의 수를 세줌
    • 테이블의 모든 레코드 수 카운트하는 방법
      SELECT COUNT(1)
      FROM 테이블명
  • WHERE : 레코드 선택 조건 지정
    • IN, NOT IN
      WHERE channel IN ('Google', 'Youtube')
      WHERE channel = 'Google' OR channel = 'Youtube')
    • LIKE and ILIKE : 문자열 매치시키기
      WHERE channel LIKE 'G%' : G*******
      WHERE channel LIKE '%o%' : ********o*********
    • BETWEEN A AND B : A와 B 사이(날짜와 날짜 사이, 값과 값 사이)
    • CASE WHEN에서도 사용 가능
  • GROUP BY : 정보를 그룹 레벨에서 추출하는데 사용
    • DAU, WAU, MAU 계산은 GROUP BY 에서함
  • ORDER BY : 레코드 순서를 결정
    • 디폴트는 ASC(오름차순)
      ORDER BY 1 ASC
    • DESC는 내림차순으로
    • 여러 컬럼(필드) 순서 결정 가능
      ORDER BY 1 DESC 2 , 3 : 1 값은 내림차순, 같은 값은 2 값을 보고 오름차순, 또 같으면 3으로 오름차순
    • NULL은 오름차순 일 경우 마지막, 내림차순 일 경우 처음, NULLS FIRST(LAST)를 하면 NULL의 위치 조정 가능

SELECT 필드명1, 필드명2 ...
FROM 테이블명
WHERE 선택조건
GROUP BY 필드명1, 필드명2 ...
ORDER BY 필드명 [ASC][DESC] 필드명 대신 숫자 사용 가능
LIMIT N;

  • CASE WHEN : 필드 값의 변환을 위해 사용하거나 조건을 넣을 때 사용.(여러 조건도 가능)

CASE
    WHEN 조건 1 THEN 값 1
    WHEN 조건 2 THEN 값 2
    ELSE 조건 3
END 필드명

  • NULL : 값이 존재하지 않음을 나타내는 상수. 0과 "" 와는 다름
    • 필드 지정시 값이 없는 경우 NULL로 지정 가능(테이블 정의 시 디폴트 값으로도 가능)
    • 어떤 필드의 값이 NULL인지 아닌지 비교는 특수한 문법을 필요로함.( IS NULL or IS NOT NULL)
  • STRING 함수
    • LEFT(str, N) : 문자열 str의 왼쪽부터 N개
    • REPLACE(str, exp1, exp2) : 문자열 str에서 exp1을 찾은 후 exp2로 바꿈
    • UPPER(str) : 문자열 str을 대문자로
    • LOWER(str) : 문자열 str을 소문자로
    • LEN(str) : 문자열 str의 길이
    • LPAD(str, N, exp), RPAD(str, N, exp) : exp가 없는 디폴트 값은 문자열 str 왼(오른)쪽에 공백을 채움. exp가 있을 시 exp를 추가함.
    • SUBSTRING(str, st, N) : 문자열 str을 st부터 시작해서 N만큼 자름

타입 변환과 Type Casting
참고 사항

 

'데브코스 > Week 6' 카테고리의 다른 글

Week 6 - 5  (0) 2024.04.26
Week 6 - 3  (0) 2024.04.25
Week 6 - 1  (0) 2024.04.22

데이터 관련 직군

  • 데이터 엔지니어 : 내-외부 원천 데이터를 수집, 가공, 적재하여 데이터가 흐르는 파이프라인을 설계 및 구축하는 역할
    • 파이썬, 자바/스칼라
    • SQL, DB
    • ETL/ELT (Airflow, DBT)
    • Spark, Hadoop
  • 데이터 분석가 : 데이터를 분석 및 처리하여 의미 있는 비즈니스 결과를 창출하는 역할
    • SQL, 비즈니스 도메인에 대한 지식
    • 통계 (AB 테스트 분석)
  • 데이터 과학자 : 비즈니스 문제를 정의하고, 문제를 해결하기 위해서 데이터 분석 모델(e.g. ML/DL)을 만드는 역할
    • 머신러닝 
    • SQL, 파이썬, 자바/스칼라
    • 통계

 

관계형 데이터베이스(RDB)

정의

  • 구조화된 데이터를 저장하고 질의할 수 있도록 해주는 스토리지
    • 엘셀 스프레드시트 형태의 테이블로 데이터를 정의하고 저장
    • 테이블에는 컬럼(열)과 레코드(행)이 존재

대표적인 RDB

  • 프로덕션 데이터베이스 : MySQL, PostgreSQL, Oracle
    • OLTP(OnLine Transaction Processing)
    • 빠른 속도에 집중, 서비스에 필요한 정보 저장
    • 서비스에 필요한 정보가 저장되어 있기에 쿼리문을 실행하면 서비스에 영향을 줄 수 있음.
  • 데이터 웨어하우스 : Redshift, Snowflake, bigQuery, Hive
    • OLAP(OnLine Analytical Processing)
    • 처리 데이터 크기에 집중, 데이터 분석 혹은 모델 빌딩등을 위한 데이터 저장
    • 보통 프로덕션 데이터베이스를 복사에서 데이터 웨어하우스에 저장

구조

  • 2단계로 구성됨
    • 가장 밑단에 테이블들이 존재(엑셀의 시트에 해당)
    • 테이블들은 데이터페이스(스키마)라는 폴더 밑으로 구성(엑셀의 파일에 해당)
  • 스키마 : DB의 구조와 제약조건에 관해 전반적인 명세를 기술한 것
                개체의 특성을 나타내는 속성(Attribute), 속성들의 집합인 개체(Entity) 그리고 개체 사이에 존재하는 관계(Relation)에
                대한 정의와 이것들이 유지해야 하는 제약조건으로 이루어져 있음.
  • 테이블의 구조(테이블 스키마)
    • 레코드 들로 구성(행)
    • 레코드는 하나 이상의 필드(열)으로 구성
    • 필드(컬럼)은 이름과 타입 속성(primary key)로 구성

SQL(Structured Query Language)

관계형 데이터베이스에 있는 데이터(테이블)를 질의하거나 조작해주는 언어

  • DDL(Data Definition Language)
    • 테이블의 구조를 정의하는 언어
  • DML(Data Manipulation Language)
    • 테이블에서 원하는 레코드들을 읽어오는 질의 언어
    • 테이블에 레코드를 추가/삭제/갱신할 때 사용하는 언어
  • 단점
    • 비구조화된 데이터를 다루는 데에 제약이 심함(Spark, Hadoop 같은 분산 컴퓨팅 환경이 필요)
    • RDB마다 SQL 문법이 조금씩 상이함.

Data Modeling

  • Star Schema
    • Production DB용 RDB 에서는 보통 해당 스키마를 사용해 데이터 저장
    • 데이터를 논리적 단위로 나눠 저장하고 필요시 조인. 스토리지의 낭비가 덜하고 업데이트가 쉬움
  • Denormalized Schema
    • 데이터 웨어하우스에서 사용하는 방식. 단위 테이블로 나눠 저장하지 않음.
    • 스토리지를 더 사용하지만 조인이 필요 없기에 빠른 계산 가능

Star Schema / Denormalized Schema

 

데이터 웨어하우스

회사에 필요한 모든 데이터를 저장

  • SQL 기반의 RDB
  • 프로덕션 DB와는 별도여야 함
  • 데이터 웨어하우스는 고객이 아닌 내부 직원을 위한 DB
  • ETL 혹은 데이터 파이프라인
    외부에 존재하는 데이터를 읽어서 데이터 웨어하우스로 저장해주는 데에 필요해지고 이를 ETL 혹은 데이터 파이프라인이라고 함.

데이터 인프라

  • 데이터 엔지니어가 관리
    • 더 발전하면 Spark와 같은 대용량 분산처리 시스템이 일부로 추가됨.
     

 

클라우드

 

정의

  • 컴퓨팅 자원(하드웨어, 소프트웨어 등)을 네트워크를 통해 서비스 형태로 사용하는 것
  • No Provisioning(내가 준비할 필요 X), Pay As You Go(사용한 만큼 지불)
  • 자원을 필요한 만큼 실시간으로 할당하여 사용한 만큼 비용 지불

장점

  • 초기 투자 비용이 줄어듦
    CAPEX(Capital Expenditure) vs OPEX(Operating Expenditure)
  • 리소스 준비를 위한 대기시간 대폭 감소(Shorter Time to Market)
  • 노는 리소스 제거로 비용 감소
  • 글로벌 확장 용이
  • 소프트웨어 개발 시간 단축(SaaS 이용)

 

'데브코스 > Week 6' 카테고리의 다른 글

Week 6 - 5  (0) 2024.04.26
Week 6 - 3  (0) 2024.04.25
Week 6 - 2  (0) 2024.04.23

VS Code(Visual Studio Code)

추천 확장

  • Live Server : 정적 파일(html, css)이 수정될 때 저장만 하면 브라우저를 자동으로 새로고침 해줌.
                           해당 주소를 다른 기기로도 접속 가능하게 해줌.(크로스 브라우징에 좋음)
  • Material Icon Theme : 파일 아이콘의 가독성을 높여줌.
  • Indent-Rainbow : 들여쓰기에 색을 넣어줘서 들여쓰기 가독성을 높여줌.

VS Code의 장단점

  • 장점
    • 호환성 : 윈도우, 맥, 리눅스 등 여러 운영 체제를 지원함.
    •  

'데브코스' 카테고리의 다른 글

Jupyter Lab 소개  (0) 2024.04.05

RelatedField

  • PrimaryKeyRelatedField : 기본 키를 사용하여 관계의 대상을 나타내는 데에 사용
  • StringRelatedField : str 메서드를 사용하여 관계의 대상을 나타내는 데에 사용
  • SlugRelatedField : 특정 대상의 필드를 사용하여 관계의 대항을 나타내는 데에 사용
    사용법 : SlugRelatedField(slug_field="특정 필드명")
  • HyperlinkedRelatedField : 하이퍼 링크를 제공할 수 있는 RelatedField
    사용법 : HyperlinkedRelatedField(view_name='urls에서 지정해준 name속성 값')

UNION(합집합)

  • 여러개의 테이블들이나 SELECT 결과를 하나의 결과로 합쳐줌
  • UNION vs UNION ALL
    • UNION은 중복을 제거

EXCEPT(MINUS)

  • 하나의 SELECT 결과에서 다른 SELECT 결과를 빼주는 것이 가능

INTERSECT(교집합)

  • 여러 개의 SELECT문에서 같은 레코드들만 찾아줌

COALESCE(Expression1, Expression2, ...)

  • 첫번째 Expression부터 값이 NULL이 아닌 것이 나오면 그 값을 리턴하고 모두 NULL이면 NULL을 리턴.
  • NULL 값을 다른 값으로 바꾸고 싶을 때 사용

NULLIF(Expression1, Expression2)

  • Expression1과 Expression2의 값이 같으면 NULL을 리턴한다.

LISTAGG 

  • GROUP BY에서 사용되는 Aggregate 함수 중의 하나
  • ex) 사용자 ID별로 채널을 순서대로 리스트
SELECT
  userid,
  LISTAGG(channel, '구분자') WITHIN GROUP (ORDER BY ts) channels FROM raw_data.user_session_channel usc
  -- userid 값으로 기준으로 channel을 각 레코드의 ts값 기준 오름차순으로 나열하라!(채널과 채널 사이에 구분자를 넣을 수 있다)
JOIN raw_data.session_timestamp st ON usc.sessionid = st.sessionid
GROUP BY 1
LIMIT 10;

WINDOW

  • Syntax
    • function(expression) OVER ( [ PARTITION BY expression] [ ORDER BY expression ] )
  • Useful function
    • ROW_NUMBER, FIRST_VALUE, LAST_VALUE, LAG
    • Math functions: AVG, SUM, COUNT, MAX, MIN, MEDIAN, NTH_VALUE
  • LAG
SELECT usc.*, st.ts,
  LAG(channel,1) OVER (PARTITION BY userId ORDER BY ts) prev_channel
FROM raw_data.user_session_channel usc
JOIN raw_data.session_timestamp st ON usc.sessionid = st.sessionid
ORDER BY usc.userid, st.ts
-- 이전 채널 찾기(ts를 내림차순으로 하면 다음 채널 찾기도 가능)

 

JSON PARSING Functions

  • JSON의 포맷을 이미 아는 상황에서만 사용가능한 함수
  • JSON String을 입력으로 받아 특정 필드의 값을 추출가능 (nested 구조 지원)

'데브코스 > Week 5' 카테고리의 다른 글

Week 5 - 4  (0) 2024.04.11
Week 5 - 3  (0) 2024.04.10
Week 5 - 2  (0) 2024.04.09
Week 5 - 1  (0) 2024.04.08

USER

추가하기

class Question(models.Model):
    question_text = models.CharField(max_length=200, verbose_name='질문')
    pub_date = models.DateTimeField(auto_now_add=True, verbose_name='생성일')  
    owner = models.ForeignKey('auth.User', related_name='questions', on_delete=models.CASCADE, null=True)
    # auth의 유저 모델을 활용.
>>> from django.contrib.auth.models import User
>>> User
<class 'django.contrib.auth.models.User'> # User의 타입
<QuerySet [<User: admin>]>

# Question 모델에 user 필드 추가 후
>>> from polls.models import * 
>>> user = User.objects.first()
>>> user.questions.all() 
>>> print(user.questions.all().query)
SELECT "polls_question"."id", "polls_question"."question_text", "polls_question"."pub_date", "polls_question"."owner_id" FROM "polls_question" WHERE "polls_question"."owner_id" = 1

#related_name을 지정해 줌으로써 user의 question을 불러올 때 questions로 가져올 수 있게 해줌

관리하기

1. serializer에 추가

from django.contrib.auth.models import User

class UserSerializer(serializers.ModelSerializer):
    questions = serializers.PrimaryKeyRelatedField(many=True, queryset=Question.objects.all())
    # User은 여러 question을 가질 수 있음.
    class Meta:
        model = User
        fields = ['id', 'username', 'questions']
        # id, username, questions 필드

2. view에 추가

from django.contrib.auth.models import User
from polls_api.serializers import UserSerializer

class UserList(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    
class UserDetail(generics.RetrieveAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

3. url 추가

from django.urls import path
from .views import *

urlpatterns = [
    path('question/', QuestionList.as_view(), name='question-list'),
    path('question/<int:pk>/', QuestionDetail.as_view()),
    # 유저 url 추가
    path('users/', UserList.as_view(),name='user-list'),
    path('users/<int:pk>/', UserDetail.as_view()),

 

생성하기

1. Form 이용

 

2. Serializer 이용

'데브코스 > Week 5' 카테고리의 다른 글

Week 5 - 5  (0) 2024.04.12
Week 5 - 3  (0) 2024.04.10
Week 5 - 2  (0) 2024.04.09
Week 5 - 1  (0) 2024.04.08

Serializers

serialize : Model Instance나 QuerySet과 같은 데이터를 JSON 형식의 파일로 변환
deserialize : JSON 형식의 데이터를 다시 Model Instance로 변환
API 서버에서는 JSON 형식으로 데이터를 주고받기 때문에 해당 작업이 필요하다.

# serializers.py
from rest_framework import serializers # pip install djangorestframework 필요
from polls.models import Question

class QuestionSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    question_text = serializers.CharField(max_length=200)
    pub_date = serializers.DateTimeField(read_only=True)
	# serialize를 할 때는 모델의 각 필드를 다 입력하여야 한다.
    
	# serializer은 생성을 할 때 유효성 검사를 하며 통과한 데이터는 validated_data로 주어짐.
    def create(self, validated_data):
        return Question.objects.create(**validated_data)

	
    def update(self, instance, validated_data):
    	# validated_data.get('question_text', instance.question_text) question_text를 가져오고 못가져 온다면 instance.question_text로 유지해라.
        instance.question_text = validated_data.get('question_text', instance.question_text)
        instance.save()
        return instance
    
    
    class Meta:
        model = Question
        fields = ['id','question_text', 'pub_date']
	# 일일이 create, update를 정의할 필요 없이 위 코드를 이용하면 자동으로 생성됨.

 

HTTP Methods

CRUD : CREATE, READ, UPDATE, DELETE

  • GET : 요청한 데이터를 받을 때 사용 (READ)
  • POST : 특정 리소스에 엔티티를 제출할 때 사용. (CREATE)
  • PUT : 내용을 수정 (UPDATE)
  • DELETE : 특정 리소스를 삭제 (DELETE)
def question_detail(request, id):
    question = get_object_or_404(Question, pk=id)
    
    if request.method == 'GET':
        serializer = QuestionSerializer(question)
        return Response(serializer.data)

    if request.method == 'PUT':
        serializer = QuestionSerializer(question, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:    
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    if request.method == 'DELETE':
        question.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

'데브코스 > Week 5' 카테고리의 다른 글

Week 5 - 5  (0) 2024.04.12
Week 5 - 4  (0) 2024.04.11
Week 5 - 2  (0) 2024.04.09
Week 5 - 1  (0) 2024.04.08

+ Recent posts