반응형

 1.데코레이터

많이들 아시겠지만 파이썬에는 데코레이터라는 기능이 있습니다보통 함수나 메소드에 적용하는 기능인데함수나 메서드의 기능을 확장하거나 변경하는 역할을 합니다

 

 

예를 들어 제가 아래와 같이 어떤 처리 함수 my_func를 만들었습니다. 그런데 함수의 성능을 측정하기 위해 함수의 실행시간을 체크하고 싶어요.

 

함수를 수정할 수도 있겠지만, 저라면 runtime_check 라는 데코레이터로 만들어서 여러 함수에 적용해볼 수 있을 것 같습니다. 아래 코드 처럼 데코레이터를 써볼 수 있습니다.

 

    import time 
    def runtime_check(func):
        def func_wrapper():        
            start_time = time.time()
            func()        # 데코레이터를 적용한 함수가 호출되는 부분
            end_time = time.time()
            print(f"runtime : {(end_time - start_time):.4f}")
        return func_wrapper # wrapper 함수 자체를 반환  

    @runtime_check
    def my_func():
        print("function call..")
        time.sleep(2)
    my_func()

    

   

이 처럼 데코레이터 내부에서의 동작은 기존 함수에 로직을 더해 새로운 함수를 만들고 반환하는 방식입니다.

 

 2.데이터클래스

 

데이터클래스는 모듈 수준의 데코레이터라고 할 수 있어요.

 

예제 코드를 보면서 설명해보겠습니다.

 

# 데이터클래스 데코레이터를 쓰기 위한 import 선언 문이구요.
from dataclasses import dataclass, asdict

@dataclass # 데코레이터는 @ 예약어를 씁니다.
class Customer: # 고객 클래스를 선언하구요.
    name: str   # 이름, 나이, 이메일 정도의 클래스 멤버 변수를 만들구요
    age: int
    email: str
# 2개의 객체를 만들어보았습니다.
c1 = Customer("jss1",20,"jss@test.com")
c2 = Customer("jss1",20,"jss@test.com")
# 객체를 출력하고, 객체간의 비교를 해봤습니다. 
# 그리고 마지막으로 클래스 정보를 json 오브젝트로 변환하기 위해 python dictionary 로 변환해보겠습니다.
print(c1)       # Customer(name='jss1', age=20, email='jss@test.com')
print(c2)        # Customer(name='jss1', age=20, email='jss@test.com')
print(c1==c2)    # True  
print(asdict(c1)) # {'name': 'jss1', 'age': 20, 'email': 'jss@test.com'}

 

네 특별한 게 없는 것 같죠..?

그럼 위 코드에서 @dataclass 를 빼고 실행해보시기 바랍니다.

 

그럼 아마도... 아래와 같은 에러가 발생할 거에요

TypeError: Customer() takes no arguments

 

 

그럼 에러를 처리하기 위해 직접 구현해보겠습니다.

class Customer:
    name: str
    age: int
    email: str
    # 객체 초기화를 위한 특별 메소드
    def __init__(self,name,age,email):
        self.name = name
        self.age = age
        self.email = email
    # 객체를 문자열로 표현해주는 특별 메소드
    def __str__(self) -> str:
        return f"name : {self.name} age : {self.age} email : {self.email}"
    # 객체 비교 특별 메소드
    def __eq__(self, value: object) -> bool:
        return True if self.age == self.age else False

 

 

 

위 코드는 객체를 출력하기 위해 __str__ , 객체를 비교하기 위한 __eq__ , 객체의 생성과 초기화를 위해 __init__ 을 구현해습니다.

** asdict()는 dataclass 타입 인스턴스만 인자로 받기 때문에 에러가 여전히 발생할겁니다.

 

결과적으로 데이터클래스 데코터레이터를 이용하면 작성해야 할 코드를 생략할 수 있어요.  데이터클래스 데코레이터를 이용해서 특수 메서드들이 자동으로 추가된 겁니다.

 

필요하면 활용해보세요. :)

 

끝.

반응형
반응형

5년 전 즈음에 실제 제가 면접에서 받았던 손코딩 문제인데, 재미로 공유 드려봅니다.

 

문제는 되게 간단해요.

 

아래 변수 A 와 B 에 담긴 값을 추가 변수 없이(temp) 없이 교환(swap) 해보는 겁니다.

 

A = 10 

B = 5 

 

한 번 풀어보시죠.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

대부분은 임시 변수를 하나 선언해서 swap 하는 방식을 먼저 떠 올릴 것 같은데요. 고민해보면 이런 방법도 있습니다.

정답은 아래 코드입니다. 

A = A+B // 15 

B = A-B // 10 

A = A-B // 5 

 

 

 

4 바이트를 절약할 수 있었네요. 

 

.

 
반응형
반응형

1.레디스 란?

  • Redis = Re(remote) + di(Dictionary) + s (Server )
  • 메모리를 사용하는 db
  • NoSQL, Replication, Master/Slave 구조로 구성이 가능하다.
  • K/V 형태로 데이터 저장.
  • 파일 싱크를 제공
  • 다양한 데이터 타입 제공
  • Strings, Lists, Set, Hashes, Sorted Sets
  • NoSQL 이기 때문에 Table, db, function, row, column 이 존재 하지 않는다
  • 데이터 Interaction 이 Command 를 통해서 이뤄진다.

 

2.왜 레디스?

  • Simple , Flexible
  • Schema, Table, 이 필요없다.
  • Durable
  • Disk 에 데이터를 저장하는 옵션이 있다.
  • 깃헙, 스냅챗, 트위터, 스택오버플로우 등 다양한 서비스에서 사용중

 

** 추가 정보

  • 100만개의 키들을 저장할때 70MB 정도 공간이 소모 된다.
  • 100만개 - 70 MB. 1억개 - 약 7GB,
  • HashType은 매우 효과적으로 인코딩된 사전구조로 되어 있어, Redis 코어 개발자중 한명인 Pieter Noordhuis가 추천함
  • 아이디를 버킷 사이즈로 divid 한 값을 버킷으로 사용. 예를 들어 버킷 사이즈를 1000개로 만든다면?? 아이디를 1000으로 나눈다. >HSET 'mybucket:1155' '11552' '939' >HGET 'mybucket:1155' '11552'
  • HashType 을 이용하여 버킷으로 저장 하는경우 100만 키 - 16MB
  • 데이터를 durable 할 수 있게 파일에 쓰는 옵션이 다양한데, 안전한 옵션일 수록 redis의 속도를 느리게 한다.

 

3.레디스 도커 컨테이너를 이용하여 빠르게 올려보기

 

A) 레디스 구축 명령어 history

#네트워크 생성
$sudo docker network create redis-net

#레디스 서버 
$sudo docker run --name my-redis --network redis-net -p 6379:6379 -v /home/deploy/redis_data:/data -d redis:alpine redis-server --appendonly yes

# 레디스 컨테이너 실행
$sudo docker run --name my-redis --network redis-net \
-p 6379:6379 \
-v ./redis_data:/data \
-v ./redis.conf:/usr/local/etc/redis/redis.conf \
-d redis:alpine redis-server /usr/local/etc/redis/redis.conf


#레디스 CLI
$sudo docker run -it --network redis-net --rm redis:alpine redis-cli -h my-redis

sudo docker run -it --rm redis:alpine redis-cli -h my-redis
$vi redis.conf
requirepass 1111

 

 

B) redis conf

#인증 패스워드 설정
requirepass 1111

#스냅샷 파일 저장 디렉토리 경로 설정
dir /data

#스냅샷 db 파일 이름 설정
dbfilename dump.rdb

#AOF 설정 (Append-Only File) OS 레벨에서 맛탱이 갔을 때를 대비해 
appendonly yes

# 60초마다 1000번 이상 데이터 변경 시 저장
save 60 1

 

C) Redis Client Command

#인증 패스워드 설정
requirepass 1111

#스냅샷 파일 저장 디렉토리 경로 설정
dir /data

#스냅샷 db 파일 이름 설정
dbfilename dump.rdb

#AOF 설정 (Append-Only File) OS 레벨에서 맛탱이 갔을 때를 대비해 
appendonly yes

# 60초마다 1000번 이상 데이터 변경 시 저장
save 60 1
반응형
반응형

개인 노션을 정리하다 궁금해서 신입부터 경력까지 지원했던 서류와 면접을 집계해봤습니다.

 

서류 탈락 141 개 
서류 합격 56 개 
면접 수 31회 

 

 

자소서 내용까지 보니 당시 어색한 정장을 입고, 심호흡을 하며 면접실로 들어갔던 제 모습이 떠오릅니다. 

 

그 때는 노력에 비해 좋은 결과보다 실망스런 결과가 더 많았던 것 같습니다. 노력이 부족했을 수도 있겠지만 그렇게 생각하고 싶지는 않구요.  "열심히 살았구나" 라고 생각하는게 더 좋겠죠.

 

제 경험을 집약해 볼 때 면접 전에 꼭 준비하고 숙지해야 할 내용들을 대충 생각해서 정리해봅니다. 물론 데이터엔지니어 입장에서..

 

  • 다루고 있는 배치 플랫폼/ 스트리밍 플랫폼의 데이터 규모 (신입이라면 다뤄본 데이터 유형들) 
  • 일일 데이터 적재량 또는 배치 프로그램의 규모 
  • DataWarehouse / DataMart / DataLake / ETL / ELT 의 이해
  • 내가 만들었거나 운영중인 데이터 파이프라인을 그림으로 그리고 설명할 준비
  • 내 강점을 집약해서 한 문장으로 표현
  • 지원한 회사의 정보들 그리고 조사 (회사의 기술 사례 발표 또는 시스템 아키텍쳐) 
  • 면접 마지막에 면접관들에게 던질 진문들 ( 인상적인 질문일 수록 좋음 ) 

 

누군가에게 도움이 되길 바랍니다.

 
반응형
반응형

1.streamlit 이란?

파이썬 웹 프레임워크 라이브러리

데이터 사이언스와 머신러닝에 유용한 커스텀 웹 앱을 쉽게 만들어 줄 수 있다고 한다.

시각화와 차트 제공을 위한 다양한 서드파티 모듈이 있다

참고) 공공 데이터  https://www.data.go.kr/index.do

2. 왜 streamlit 을 선택할까 ?

아직 잘은 모르겠지만 내가 봤을때, 데이터 레포트를 웹 페이지로 만들고 싶은데 웹 서버 구축에 대한 부담 없이 텍스트와 마크다운 수준의 코드 만으로 띄우고 싶을때 쓰면 좋을 것 같다.

 

3. streamlit 따라 해보기

a. lib 설치

$ pip install streamlit

 

 

b. app 코드 작성하기

# import module
import streamlit as st
import pandas as pd

# Title
st.title("This is Title line")

# Header
st.header("This is a header")

st.text("This line belongs to a text")



# Markdowns
st.markdown("### This is a markdown")
st.markdown("## This is a markdown")
st.markdown("# This is a markdown")

#Select the subject from the Selectbox
subject = st.selectbox("Subjects: ",['English', 'Hindi', 'Math',
                       'Science'])
# Print the subject
st.write("Your Subject is: ", subject)



# Reading the CSV file
df = pd.read_csv("Startups_Expense.csv")
# Putting title
st.title("View of the Data shown below:")
# To visualize the data
st.write(df)

 

 

c. 실행하기

$ streamlit run app.py

 

 

 

 

d. 그 외 컴포넌트를 알아보려면?

https://streamlit.io/components

 

Components • Streamlit

Streamlit is an open-source Python framework for machine learning and data science teams. Create interactive data apps in minutes.

streamlit.io

 

반응형
반응형

kubectl 명령어 정리 배경

  • 자주 쓰는 것들을 정리해둔 내용인데, 혹시 누군가에게 도움이 될까봐 올려둔다.
  • 개인적인 팁은 kubectl 을 k 라는 alias 로 설정해서 쓰면 편하다
  • 쿠버네티스 리소스 관리 유틸리티인 k9s 를 쓰면 더 편리 할 수 있다. (  URL - https://k9scli.io/ )

 

 

kubectl 명령어 모음

# 네임스페이스 생성
$ kubectl create namespace argocd

# 네임스페이스 를 지정하여 yaml 적용하기
$ kubectl apply -n argocd -f argo-cd.yaml



# 포트 포워드 터널링
$ kubectl port-forward svc/서비스이름 [로컬 포트 : 서비스 포트]

$ kubectl port-forward svc/argocd-server -n argocd 8080:80
$ kubectl port-forward --namespace=ingress-nginx service/ingress-nginx-controller 8080:80


# 이벤트 및 파드 로깅
$kubectl get events

$kubectl get ing

$kubectl get svc,pod,ing


# 애플리케이션 로깅
$ kubectl logs -n [네임스페이스] deployment.apps/파드이름
$ kubectl logs -n airflow deployment.apps/airflow-webserver

# 서비스 어카운트 정보 
$ kubectl get sa
$ kubectl get sa -n kube-system
$ kubectl describe sa [] -n []


# yaml 형식으로 출력하기
$kubectl get sa ebs-csi-controller-sa -n kube-system -o yaml >> sa.yaml

$ kubectl get po -A
# A 옵션을 주면 네임스페이스 전체에 있는 파드가 다 뜬다.


# 파드 서비스 진입
$ kubectl exec [파드이름] /bin/sh
$ kubectl exec [파드이름] -it -- bash
# ssh 진입
$ kubectl exec bdp-web-7849b96cf5-2xzlq -n airflow -it -- bash


# watch를 이용한 모니터링
$ watch -d kubectl get deploy, svc, pods

 

 

kubectl alias 설정

$echo "alias k='/home/ec2-user/bin/kubectl'" >> ~/.bash_profile

$ source ~/.bash_profile
반응형
반응형

1.목표 (What & Why)

  • 지난 번 포스팅에 이어 쿠버네티스 기반 서비스로 동작하도록 구성해본다
  • 쿠버네티스 클러스터, kubectl 을 통한 통신이 준비되어있어야 한다.
  • 순수 애플리케이션 Deploy → 도커 기반의 컨테이너 Deploy → 쿠버네티스 기반 Pod Deploy 를 통해 컨테이너 오케스트레이션을 조금은 이해해본다.

2.과정 (Step)

  • 쿠버네티스 deployment yaml 을 작성한다.
  • Pod 를 배포하고 동작을 확인한다.
  • replica 수를 조정하여 Pod scaling 을 확인해본다.

3.방법 (How)

  • Deployment 를 생성한다.
$ vi deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: common-api-deployment
  labels:
    app: fastapi

spec:
  replicas: 1
  selector:
    matchLabels:
      app: fastapi
  
  template:
    metadata:
      labels:
        app: fastapi
    spec:
      containers:
      - name: containers
        ports:
        - containerPort: 9000
        image: AWS 계정.dkr.ecr.ap-northeast-2.amazonaws.com/demoapp:latest

 

  • kubectl 로 deployment 를 생성한다. 
$ kubectl apply -f deployment.yaml
  • watch 를 통해 Pod, Node, Deployment를 모니터링 할 수 있다.
watch -d kubectl get pod,deploy,node

  • replicas를 수정한다.

  • 서비스를 확인한다.

4. 정리 (summary) 

  • 컨테이너 기술을 이용한다는 건, 의존성과 애플리케이션을 패키징해서 어디서 수행하던 프로그램의 실행과 결과를 보장하게 한다는 것이다.
  • 철학적으로는 격리된 서비스의 실행환경을 만드는 것이고, MSA 를 지향하는 요즘 트렌드에 방향성이 같은 기술이라고 생각한다.
  • 쿠버네티스는 좀 더 나아가서 컨테이너의 무중단 배포, 고가용성 보장과 노드 스케일링, 보안 등의 기능 지원으로 컨테이너 기술의 힘을 더 강하게 해준다. -> 컨테이너 오케스트레이션 이라고 한다.
  • 쿠버네티스는 공부할 것이 많다.
  • 다음에는 시간이 될 지 모르겠지만, emr on eks 의 구성과 karpenter 기반의 spark workload 실행을 포스팅 해보고 싶다. ( 요즘 회사에서 하고 있는 기술이기도 하다. ) 

 

반응형
반응형

1.목표 (what & why)

  • fast 를 이용해본다
  • 유지보수와 확장 가능한 구조의 프로젝트 구조를 만든다.
  • 쿠버네티스 기반 컨테이너 서비스로 동작하도록 만든다.
  • fast api application   
    • 별도 SMTP 서버로 이메일 전송을 대신할 수 있는 api 서버 구현 ( 상세한 구현 로직은 포함하지 않음. )
    • 인증은 기본 토큰 방식을 사용한다.
  • 만드는 목적과 이유
    • 보통 이런 REST API + Application 실행 요구사항은 AWS 람다를 대부분 이용했다. 그리고 이용하면 편하고..
    • AWS 람다는 서버리스기반으로 실행되기 때문에 고정 IP 를 부여하기 힘들다. (서브넷의 CIDR 를 조정하면 될것 같긴 하지만 그렇게는 아무도 안할 것 같다)
    • 화이트 리스트로 등록되어야만 실행을 하게 하는 서비스 들이 있다. 예를 들어 SMTP 서비스 들. 

 

2.과정 (Step)

  • fastapi application 을 작성한다
  • Dockerfile 을 작성하고 컨테이너 이미지를 생성한다
  • 쿠버네티스 Deployment yaml 을 작성하고, 파드, 서비스를 작성한다.
  • 배포와 자동화 스크립트를 만들어본다.
  • 사전 준비 과정
    • Docker , 쿠버네티스, 파이썬 개발 환경의 준비가 되어있어야 한다.

 

3. 방법 (How)

fastapi application 작성한다.

- github  -https://github.com/jaysooo/service-common-api

 



 

Dockerfile 을 작성하고 컨테이너 이미지를 생성한다

from python:3.11-alpine

# set env
WORKDIR /usr/src
# source copy
COPY ./app ./app

ENV PYTHONPATH /usr/src/app

# package install
RUN pip install --upgrade pip && pip install --no-cache-dir -r ./app/requirements.txt

EXPOSE 9000

# container execution
CMD python -m uvicorn app.main:app --reload --host=0.0.0.0 --port 9000

 

이미지 생성과 실행 테스트를 해본다.

#!/bin/bash
echo "[LOG] 01. local deploy.."
IMAGE_NAME=demoapp
IMAGE_VERSION=1.0
TARGET_PORT=9000
#echo ${IMAGE_NAME}:${IMAGE_VERSION}


echo "[LOG] 02. container cleansing.."
docker stop `docker ps | grep -e "${IMAGE_NAME}:${IMAGE_VERSION}" | awk '{print $1}'`
docker rmi -f ${IMG_NAMME}:${IMAGE_VERSION}

echo "[LOG] 03. image build.."
docker build -t ${IMAGE_NAME}:${IMAGE_VERSION} .

echo "[LOG] 04. container run.."
docker run -p ${TARGET_PORT}:${TARGET_PORT} -d ${IMAGE_NAME}:${IMAGE_VERSION}

docker ps | grep -e ${IMAGE_NAME}

 

이미지 빌드 및 실행 화면

 

 

API 실행 화면

 

반응형
반응형

1.ChatGPT 란?

  • GPT3.5 , GPT4 모델을 기반으로 하는 대화형 인공지능 서비스
  • 인공지능 챗봇
  • 인간의 피드백을 통한 강화학습으로 훈련
  • openAI 라는 회사가 만듦
  • 일론머스크, 샘알트만이 공동 설립.
  • 서비스는 프롬프트 + 응답의 구조

 

2.ChatGPT Simple Application 

  • open ai 의 api 를 이용하여나만의 챗봇 애플리케이션 만들기
  • 구현 내용
    • 파이썬 이용
    • streamlit 패키지를 이용하여 웹 애플리케이션으로 띄움
    • 간단한 입출력 폼 작성
    • openai 의 api 를 이용하여 서비스 로직 작성

3. code (api 호출 부분만)

from dotenv import load_dotenv
from chatgpt_logger import logger
import openai
import os



def get_openai_options():
    openai_model = os.environ.get("OPENAI_MODEL")
    openai_temperature = os.environ.get("OPENAI_TEMPERATURE")
    oepnai_max_token =os.environ.get("OPENAI_MAX_TOKEN") 

    args = {
        'model': openai_model,
        'temperature' : openai_temperature,
        'max_token' : oepnai_max_token,
    }

    return args

def load_env():

    # set environment for application
    load_dotenv()
    version = os.environ.get("VERSION")
    openai_token = os.environ.get("OPENAI_TOKEN")

    version = os.environ.get("VERSION")

    # set openai connection
    openai.api_key=openai_token

    logger.info(f"app version :  {version} \t")


def answer_from_chatgpt(query):
    #query = 'yarn cluster manager의 개념을 알려줘'
    answer = ''
    if query is None or len(query) < 1:
        answer = 'No Response..'
        return answer


    options = get_openai_options()
    response = openai.Completion.create(model=options['model'], prompt=query, temperature=float(options['temperature']),max_tokens= int(options['max_token']))
    res = response['choices'][0]['text']
    answer = res

    return answer

 전체 코드 : https://github.com/jaysooo/chatgpt_streamlit_app

 

GitHub - jaysooo/chatgpt_streamlit_app: Simple Streamlit Application of chatGPT

Simple Streamlit Application of chatGPT. Contribute to jaysooo/chatgpt_streamlit_app development by creating an account on GitHub.

github.com

 

 

 

4. 여담

결혼 전에 구매했던 컴퓨터(mini pc) 에 리눅스를 올려서 홈 서버를 구축했다. nextcloud, vscode server 등 서버에 오픈소스들 올리고, 회사나 외부에서 원격으로 붙어 이것저것 해보는 중이다. 위에 만든 chatGPT app 도 기능 좀 추가하고 나만의 모델을 만들어 학습해서 써볼 생각이다.

 

최근 바빠서 블로그 포스팅, 알고리즘 스터디를 소홀히 하고 있다. 안그래도 바쁜데 파트 내에 함께 했던 좋은 동료들이 이직을 많이 하고 있다. ㅠㅠ .. 좋은 데이터 엔지니어 동료가 필요한 상황이다...  

 

시간이 되면 회사에서 PoC 했던 airbyte on EKS 내용도 올리겠다.

 

 

반응형
반응형

0. 실습 내용

  • airbyte 를 docker container 로 실행한다
  • airbyte 커넥션
    • mysql --> s3 (csv) 
    • sync mode : full refresh
  • mysql 역시 docker container 로 실행한다.
  • 데이터는 공공 데이터를 활용한다.

 

1.install & quick start

  • mysql docker compose
version: "3.7"

services:
  mysql:
    image: mysql:latest
    environment:
      - MYSQL_ROOT_PASSWORD=jssvs
    volumes:
      - ./data:/var/lib/mysql
    ports:
      - 3306:3306
  • airbyte docker compose
## airbyte clone & up 
$ git clone https://github.com/airbytehq/airbyte.git
$ docker-compose -f docker-compose.yaml up -d 



## mysql up
$ docker-compose -f docker-compose.yaml up -d

  • 서비스 진입

2.Sample 데이터 로드 

 

서울교통공사_지하철혼잡도정보_20211231

서울교통공사 1-8호선 30분 단위 평균 혼잡도로 30분간 지나는 열차들의 평균 혼잡도(정원대비 승차인원으로, 승차인과 좌석수가 일치할 경우를 혼잡도 34%로 산정) 입니다.(단위: %). 서울교통공사

www.data.go.kr

 

 

 

3.connection 생성 및 테스트

  • Source 생성하기

  • Destination 생성하기

 

  • 연결 생성하기

  • 연결에서 볼 수 있는 설정 정보들
    • Transfer
      • 복제 주기 - cron , manual 등.
    • Streams
      • 목적지 네임스페이스 설정
      • 목적지 스트림의 prefix 네이밍 설정
      • airbyte 에서는 stream 이 옮겨질 데이터의 대상이고, mysql 의 경우 sync 될 테이블을 의미한다.
    • 원하는 sync source 를 선택할 수 있다.
  • sync Job 및 로그 확인

  • sync 된 데이터 확인

 

반응형

+ Recent posts