목록2025/03 (21)
엔지니어 블로그

기존에 로컬 k3s에서 프로젝트 dev 서버를 만들어서 사용했다. 이제는 GKE로 이관해볼 생각이다. 필요한 작업 내용은 다음과 같다. 1.GAR(Google Artifact Registry)에 이미지 올리기2.GKE에서 배포 1. GAR(Google Artifact Registry)에 이미지 올리기먼저 저장소를 생성할것이다. 상단 메뉴바에 저장소 만들기를 눌러서 들어가면 다음과 같은 화면이 나온다.여기서 필요한 내용을 설정한 후 만들기를 클릭하면 간단하게 생성할 수 있다. 이제 생성된 이미지를 업로드 할 차례다.docker image를 생성할때 이름이 가장 중요하다. image가 어디에 push 될지 결정하는 것이 바로 이름이다. 이미지 생성 후 tag 기능을 사용해서 저장소주소/이미지명:태그 형식으로..

CPython코드로 작성된 프로그램을 실행하기 위해서는 Compile 이라는 과정을 거치게 된다. 간단히 설명하자면 프로그래밍 언어로 작성된 고수준 언어를 저수준 언어로 번역하는 프로그램이다. JAVA,C 등의 많은 프로그래밍 언어에서 Complier가 이 과정을 수행하고 있으며, Compiler가 없다면 프로그램을 실행하는 것은 불가능 할 것이다.하지만 Compile이 필요하지 않은 언어도 있다. 대표적인 Interpreter 언어 Python이다. 개발자 입장에서 Compile 과정이 필요없다. 소스코드를 한줄씩 읽어 바이트코드로 변환해주고 Python Virtual Machine을 통해 실행 결과를 얻는다. Python에서 Interpretion을 담당하고 있는것이 CPython이다.하지만 CPyh..
git action을 통해 파일을 Cloud Storage / Bigquery에 upload 하는 방법을 소개하려고한다. 먼저 테스트용 service account를 생성한다.PROJECT="dev-sample"SERVICE_ACCOUNT="test-tj-cloud-storage"gcloud iam service-accounts create $SERVICE_ACCOUNT \ --description="test" \ --display-name="test github action" \ --project=$PROJECT 생성한 service account에 버킷 개채 관리자 권한을 부여한다.gsutil iam ch serviceAccount:$SERVICE_ACCOUNT@$PROJECT.iam..
1.모든것은 CPU에서 시작된다.CPU는 운영체제,프로세스,스레드와 같은 개념을 알지 못한다. 단지 메모리에서 명령어를 가져다가 수행하고 다시 명령어를 가져오고 수행하는 것을 반복 할 뿐이다. 그렇다면 CPU는 어떤 기준으로 명령어를 메모리로부터 가져오는 것일까? 바로 PC(Program Counter) 라는 레지스터에서 찾을 수 있다. PC레지스터에는 CPU가 다음에 가져 올 명령어 주소를 저장하고 있다. PC 레지스터의 명령어 주소 값은 자동으로 1씩 증가한다. CPU가 주소를 하나씩 증가시키면서 차례대로 명령어를 실행하기에 자연스러운 모습이다. 하지만 if~else,함수 호출 같은 명령어를 만나게 되면 이 순서는 파괴된다. 이때는 CPU가 대상 명령어 주소로 PC 레지스터의 값을 동적으로 변경한다...
Dict의 정렬은 sorted()를 사용하면 된다.Key 기준 정렬#내림차순dict = {"abc" : 1 , "bsc" : 2 , "csv" : 2}sorted_dict = sorted(dict.items(),reverse=True)#output[("csv",2), ("bsc",2), ("abc",1)]sorted_dict = sorted(dict)#output["abc","bsc","csv"] Value 기준 정렬아래 코드에서 lambda 식 안에 사용된 item[1] 은 k:v 형태에서 value 값을 나타낸다.#내림차순dict = {"abc" : 1 , "bsc" : 3 , "csv" : 2}sorted_dict = sorted(dict.items(),key=lambda item:item[1],r..
환경Ubuntu 22.04AirflowSpark On Kubernetes에러 내용Airflow에서 SparkKubernetesOperator를 사용하고 있는데 Spark가 Postgresql Driver를 찾지 못하는 에러다.py4j.protocol.Py4JJavaError: An error occurred while calling o67.load.: java.lang.ClassNotFoundException: org.postgresql.Driver 해결 과정단순히 postgresql.jar 파일만 구해서 Spark Session 만들 때 설정해주면 될 것 같았다. .config("spark.driver.extraClassPath", "/opt/spark/data/postgresql-42.7.5.jar..
에러 내용TypeError: type Column doesn't define __round__ method spark 코드중에 소수점 표현을 강제하는 내용이 있는데, python의 라이브러리 round를 사용해서 발생 한 내용이다. 해결 방법python의 내장 라이브러리가 아닌 pyspark.sql.functions의 round를 사용하면 된다.from pyspark.sql.functions import rounddf = reduce(lambda df, col: df.withColumn(col, round(df[col], 2)), column_name, df)

링커의 말할 수 없는 비밀본 장은 링커의 존재 이유와 작동 방법에 대해 설명하고 있다. 예를 들어 외부에 정의 된 함수는 정적,동적 라이브러리로 제공 되는데 이 것을 어떻게 가져다 사용할지에 대한 내용이다.링커는 이렇게 일 한다.링커는 컴파일러와 마찬가지로 일반적인 프로그램이다. 컴파일러가 생성한 다수의 대상파일을 묶어 하나의 실행 파일을 생성한다. 링커가 실행파일을 만드는 과정을 다음과 같다.심벌해석 -> 대상파일 묶기 -> 재배치 심벌해석심벌 해석은 참조하고 있는 모듈 간 종속성이 올바르게 설정 되어 있는지 확인한다. 또 외부 심벌에 대한 구현이 어느 모듈이던 하나만 있는지 확인하고 이를 연결하는 역할을 한다.묶기심벌해석이 끝난 대상 파일을 하나로 묶는다.재배치compile 시점에 컴파일러는 참조하..