Skip to content

Blog

Elixir 체험

의욕이 안나서 다이슨 스피어와 팩토리오를 돌다가 그 둘이 질려서 다시 복귀

로그 남기기 조차 귀찮았던 보름 전에는 mike 설정만 진행하였고, 이전 로그들 다듬는건 더더더 나중의 일이 될 듯 하다.

최근 몇달간 내 머리속에 흥미만 일으키고 실제로 손은 못 대본 elixir 를 오늘 한번은 손을 대보는걸 목표로 한다!

또한 이날은 3b1b 가 manim 튜토리얼을 영상으로 올렸고, 이 또한 내 흥미를 끌었음. 언제 한번 공유할때 써먹으면 멋질듯 함

우선 엉망이 된 git 상태를 좀 다듬고 시작..!

install 하기

codespace 환경에서 다음을 따라하면 됨.

sudo apt update
sudo apt install erlang-dev elixir

command -v iex mix elixir 

근데 현 시점 elixir 문서는 1.17, OTP 24 이나... codespace 에서 별다른 조치 안하고 설치한 apt 설치로는

1.9 에 OTP 22 로 설치된다. 너무 낮아서 가이드 따라하는데 걸림돌이 생길 듯 하다.

https://elixir-lang.org/install.html 에 다양한 옵션이 있음. pyenv 포지션에 해당하는건 asdf 인듯함

nodeenv 같은걸 만들 수도 있겠음. 아직 없는 듯 함.

pyo3 처럼 섞어 쓰기 괜찮은 궁함이라 생각된다면, 내가 프로젝트를 만들어 보는건 어떨까?

asdf 선호하진 않지만, 일단 체험을 위해 asdf 를 설치해보자.

asdf 설치는 단순 git clone 을 정해진 위치에 놓는것으로 끝나는 듯 하다. 일단 bashrc 에 추가하진 않았음. 나는 이 셋업이 아직 맘에 들지 않으므로...!

git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.1
source "$HOME/.asdf/asdf.sh"

asdf plugin add erlang https://github.com/asdf-vm/asdf-erlang.git
asdf plugin-add elixir https://github.com/asdf-vm/asdf-elixir.git

asdf install erlang latest
asdf install elixir latest
asdf local erlang latest  
asdf local elixir latest  
asdf current

erlang 설치가 생각보다 쉽지 않은 듯 함? 일단 무시하고 가이드를 따라 해본다.

Crash dump is being written to: erl_crash.dump...done
riir-airflow@rino0601  /workspaces/riir-airflow (tour-elixir) $ asdf exec elixir -v
{"init terminating in do_boot",{undef,[{elixir,start_cli,[],[]},{init,start_em,1,[]},{init,do_boot,3,[]}]}}
init terminating in do_boot ({undef,[{elixir,start_cli,[],[]},{init,start_em,1,[]},{init,do_boot,3,[]}]})

Crash dump is being written to: erl_crash.dump...done
riir-airflow@rino0601  /workspaces/riir-airflow (tour-elixir) $ asdf install erlang latest
ERROR: 'asdf_27.1.1' is not a kerl-managed Erlang/OTP installation.
ERROR: no build named 'asdf_27.1.1'!
Downloading (from GitHub) Erlang/OTP 27.1.1 to /home/codespace/.asdf/downloads/erlang/27.1.1...
Extracting source code for normal build...
Building (normal) Erlang/OTP 27.1.1 (asdf_27.1.1); please wait...
Initializing (build) log file at /home/codespace/.asdf/plugins/erlang/kerl-home/builds/asdf_27.1.1/otp_build_27.1.1.log.
APPLICATIONS INFORMATION (See: /home/codespace/.asdf/plugins/erlang/kerl-home/builds/asdf_27.1.1/otp_build_27.1.1.log)
 * wx             : No OpenGL headers found, wx will NOT be usable
 * No GLU headers found, wx will NOT be usable
 * wxWidgets was not compiled with --enable-webview or wxWebView developer package is not installed, wxWebView will NOT be available
 *         wxWidgets must be installed on your system.
 *         Please check that wx-config is in path, the directory
 *         where wxWidgets libraries are installed (returned by
 *         'wx-config --libs' or 'wx-config --static --libs' command)
 *         is in LD_LIBRARY_PATH or equivalent variable and
 *         wxWidgets version is 3.0.2 or above.

좀 오래 걸릴 뿐 성공은 했다.

riir-airflow@rino0601  /workspaces/riir-airflow (tour-elixir) $ asdf current
elixir          1.17.3-otp-27   /workspaces/riir-airflow/.tool-versions
erlang          27.1.1          /workspaces/riir-airflow/.tool-versions
riir-airflow@rino0601  /workspaces/riir-airflow (tour-elixir) $ asdf exec elixir -v      
Erlang/OTP 27 [erts-15.1.1] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [jit:ns]

Elixir 1.17.3 (compiled with Erlang/OTP 27)
riir-airflow@rino0601  /workspaces/riir-airflow (tour-elixir) $ 

쉘을 닫고 새로 여니, nodeenv 랑 asdf 랑 궁합이 맞지 않는다는걸 발견했다.

nvm is not compatible with the "NPM_CONFIG_PREFIX" environment variable: currently set to "/workspaces/riir-airflow/.venv"
Run `unset NPM_CONFIG_PREFIX` to unset it.

쉘을 닫고 새로 여니, 이제야 최신 버젼으로 잡힌다.

Introduction to Mix

https://hexdocs.pm/elixir/introduction-to-mix.html 를 따라해보았다. elixir 프로젝트는 어떻게 만드는가?

mix new kv --module KV 하여 코드를 만들었고, 파일 확장자는 인식 되나 syntax highlight 는 자동으로 되지 않았다.

관련 vscode 익스텐션을 찾자 -> 제일 위가 쓸만해보이고 믿음직해보여서 설치.

음.. 키보드가 불편해서 뭔가 더 만져보기는 그런데, pip 보단 쓸만하고 cargo 보단 좀 덜한? 느낌의 프로젝트 관리도구로 mix 가 있다고 이해함.

docs 에 해당하는게 hex 인듯 한데, 바로는 되지 않았음. 따로 배워야 하는 듯 함. 조금 둘러보았으나 여전히 잘 안됨. 흠.. 잘 만든 elixir 프로젝트 코드 모델이 필요한데...

흥미가 좀 덜 당겨서 좀 더 재밌어보이는 주제로 잠시 점프할 생각이 들었다.

phoenix/up_and_running

https://hexdocs.pm/phoenix/up_and_running.html 를 따라해보자.

역시 웹서버를 띄워야 재밌지.

오.. 로컬에 postgresql 이 당연히 떠있을 것이고, sqlite3 를 쓰지 않음. 독특하네?

phoenix 가 꽤 친절한...? 웹 프레임웤크임을 알게 되었다. 백엔드 개발자 입장에서 만든 느낌임. 그러나 더 체험해보려면 postgresql localhost:5432 가 필요하다.

으악

배포는 어떻게 하는가?

개발할 때는 erlang 과 elixir 를 직접 설치해야 했다. 배포시에 이 둘을 신경써야 하는가? 머신에 이 둘이 있어야 하는 파일이 생기나?

phoenix 또는 elixir 문서 어딘가를 잘 둘러보면 설명이 되어 있을 것 같긴 하나 오늘은 발견 못 함.

오늘의 결론

지금까지의 인상으로는...

phoenix 를 통해서 개발 생산성을 높힐 수 있어보인다. 한 가지 언어로 프론트와 백엔드 모두 처리할 수 있다. 그럼 node 랑 같은거 아냐? 싶은데, node 는 프론트가 백엔드로 밀고 들어온 것이고, elixir 는 그 반대 같은 느낌..? 백엔드쪽 문제가 운영이나 비용문제에 있어서 더 기여도가 크다고 생각하기 때문에, 이쪽이 훨씬 매력적인듯 하다.

그러나 이런 장점은 '신규 프로젝트에, elixir 능통자가 이미 있다면' 이란 가정이고 기존 시스템을 대체 하는데 에는 딱히 매력 없는 듯 하다. 기존 참여자들 모두 학습 허들을 넘어야 하고 기존 레거시 코드를 '딸깍' 하고 바꿀 순 없기 때문이다. 아직 ffi 어떻게 하는지 이해 못해서 더욱 불가해 보이는 걸 수도 있다.

그러나 여전히 언어 철학은 매력적이고 rust 보다 쉬워보이는건 사실이며, 유용해보이긴 한다.

좀 더 쉬운 주제 없을까?

2024 08 07

오늘의 계획

  • WSL1 문제를 회피하기 위해 codespace 를 사용하기로 결심함.
  • 따라서 내가 원하는 환경을 재현하려면 .devcontainer 를 작성할 필요가 있다. 작성하자.
  • omz 기본으로 활성화. 이미 설치는 되어 있던데?
  • rye, rust 등 설치
  • Elixir 언어에 대한 영감을 얻었다. 적어둘데가 여기밖에 없다. OffTopic 이지만. 일단 메모해두자.

Elixir 메모

  • 새 언어 나올 때 마다 python binding 부터 찾아보는 습관이 들었다. 찾아보니 진득하게 읽어보진 않았지만, message-passing architecture 인점을 이용해서 stdin/out 으로 메세지를 주고 받는 식으로 해결 하는 듯
    • https://medium.com/stuart-engineering/how-we-use-python-within-elixir-486eb4d266f9
    • https://elixirforum.com/t/best-way-to-get-elixir-to-work-with-python/19400/5
    • https://curiosum.com/blog/borrowing-libs-from-python-in-elixir
  • 웹 프레임워크로 https://www.phoenixframework.org/ 가 유명한듯. 여기서 시작해야 하나?
    • LiveView 는 별도의 프로젝트가 아니고 phoenix 의 기능인듯
      • SPA 도구랑은 안녕... 이고
      • Tailwind CSS 같은건 여전히 쓸 수 있고
      • 'LiveView는 자바스크립트 Hooks라는 기능을 제공하여 LiveView가 관리하는 DOM 요소에 대해 자바스크립트를 사용할 수 있도록 합니다' 라는걸 보니 JS 의존을 아예 없애는건 아닌 듯
      • 그래도 주요 비즈니스 로직을 한쪽에서 다 가져갈 수 있으니 좋아하는 사람이 생기는게 이해가 감
  • https://dev.to/logrocket/comparing-elixir-with-rust-and-go-13k7 좋아보임. 정독을 위해 킵.
  • 막대한 동시성이 장점인 언어라고 했는데... 그렇다면 gateway 로 쓸 수 있지 않을까...!
    • kong 같은건 쉽게 찾아지지 않았음
    • 그냥 kong 쓰는게...? 남들 쓰는데 이유가 있겠지
    • https://accenture.github.io/reactive-interaction-gateway/ 요거 한번 들여다 보자

진행

알고보니 omz 는 이미 설치가 되어 있었다. 기본 쉘이 bash 로 되어 있었을 뿐. chsh -s $(which zsh) 해서 당장의 필요를 해결함. 다음 인스턴스에서도 이 설정이 유지될지는 모르겠다.

다음 인스턴스에서도 omz 를 쓰고 싶어서, GPT 가 안내하는대로 devcontainer.json 을 작성함. 인스턴스 띄운 동안 과금되니 문서를 진득하게 읽을 시간이 없다. 작성한게 맞아 떨어지는지 확인하려면 일부러 인스턴스를 폐기해야 하는데 오늘은 내키지 않아서 패스. 다음에 문제되면 해결하자. rye, rustup 설치도 같은 이유로 오늘은 포기. 1회성으로 설치해서 쓰자.

codespace 용 devcontainer 이미지 그대-로 ci 에서도 쓸 수 있을 것 같아서 GPT 에게 이리저리 물어봤으나 도중에 고장남. 불가능한 과업인듯 하다. 욕심 내지 말고 setup-action 들로 해결하자.

rye 설치. https://rye.astral.sh/guide/installation/#add-shims-to-path 까지 따라해야 했다. (omz 공통 사항인듯)

cargo 없이 rye sync 하니, maturin 빌드에서 싪패한다. cargo 찾는거 보니 이정도면 친절한 도구임.

make run 했더니 fastapi 쪽 변경 때문에 실패함. 디펜던시 정정

commit 해보니 기본 editor 가 vscode... git config --global core.editor "vim" 해줌.

GIT_EDITOR 환경변수 때문에 소용 없었음. 이 문제 약간 불편할 뿐 큰 문제 아니다. 오늘은 넘김.

결과

https://containers.dev/ 문서를 찾음.

셋업은 잘 끝났고, 원하는 동작도 확인 했다. 여전히 make run 을 종료하려면 ctrl C 를 두번해야 한다. 다음 목표는 이걸 해결하는 것으로 삼으면 될 것 같음.

2024 07 29

오늘의 계획

  • 한달만의 재개. 길게 할 수도 없고, README 갱신 정도를 목표로 하자.
  • 하는 김에, examples 를 끄고, 이 프로젝트의 DAG 를 보게 하자.

진행

지난번에 branch protection 을 걸었으니 브랜치를 만들며 시작.

https://stackoverflow.com/questions/72929081/what-is-github-contributing-md-for 그리고 https://docs.github.com/en/communities/setting-up-your-project-for-healthy-contributions/setting-guidelines-for-repository-contributors 를 GPT의 도움을 받아 찾아냄.

개발환경 셋업 가이드는 .github/CONTRIBUTING.md 에 작성하기로 결정.

2023년 어느 시점엔가 (default-pre2.7 이란걸 보아 2.8부터 인듯?), airflow 가 설정의 근원을 더 세세하게 (provider 내장 설정 등등) 구분한다는 점을 발견함.

결과

약간의 makefile 수정을 포함해서 의도대로 잘 진행 되었다. 생각보다 시간은 더 많이 씀.

2024 06 30

메모

  • WSL1 환경에서 개발은 정말 어렵다. sqlite3 가 봉인된다고 봐야 함.
  • 다른 환경을 알아보거나 sqlite3 에 의존하지 않아야 한다.
  • 다른 환경 알아보기는 경제적인 문제해결 방법이 필요하다
  • sqlite3 의존 피하기는, 딱히 돈은 안들고, 개인 여가 시간만 쓰면 되나, 옳은 선택인가..?? 싶어진다.

오늘의 계획

  • 당분간 WSL1 환경을 유지해야 한다.
  • 매번 재개 할 때 마다 기동법을 다시 찾으라 5분씩 쓰니 기동법을 공고히 하자.
  • make run 을 만들자.
    • [x] makefile 작성
    • [x] .github/workflow 작성
    • [x] branch project 설정

진행

branch project 설정부터 진행 했다. rulsets 라고 신 기능이 생긴모양? 2분 정도 어색하긴 했는데, 전 보다 훨씬 쓰기 편해진것으로 보임.

적용후, main 에 push 하여 설정된걸 확인.

riir-airflow➜  riir-airflow git:(main) gp
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 32 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 307 bytes | 307.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
remote: error: GH013: Repository rule violations found for refs/heads/main.
remote: Review all repository rules at http://github.com/rino0601/riir-airflow/rules?ref=refs%2Fheads%2Fmain
remote: 
remote: - Changes must be made through a pull request.
remote: 
To github.com:rino0601/riir-airflow.git
 ! [remote rejected] main -> main (push declined due to repository rule violations)
error: failed to push some refs to 'github.com:rino0601/riir-airflow.git'
riir-airflow➜  riir-airflow git:(main) glog
riir-airflow➜  riir-airflow git:(main) git reset f600975

회사 업무때 했던건데, cccv 못 하니까 너무 불편하고 힘들다... 이렇게 내것으로 만드는 것이겠지.

키보드 느낌 달라서 불편한 점도 많이 있는 듯 집 컴 키보드는 게임할 땐 충분하지만, 타이핑 많아지면 시끄럽고 불편하다

make -C subdir 할때 export 해둔 환경 변수를 전달 하는 방법을 모르겠다. 그냥 subdir make 를 포기함.

pre-commit 설정을 진행 했고, 아직 코드가 적어서 fmt, lint 등으로 인한 변경은 적었다. pyright 도 걸었는데, 이건 좀 많네;

유닛 테스트 적어놓은게 깨져있던걸 발견함. 살릴 방법이 마땅치 않아서 일단 성공하게 조건을 많이 풀어 둠.

멀쩡한 유닛테스트는 다음 목표로 삼아야 하겠다.

결과

  • make run 으로 개발 모드로 띄울 수 있게 되었다. 목표 달성.
  • pre-commit 으로 fmt, lint 등을 적용하게 되었다. 목표 달성.
  • .github/worflow 를 적용했다. 잘 작동한다. 목표 달성.

  • make run 취소시 ctrl^C 를 두번해야 한다. 사소한 이슈 발견.

  • README.md 에 이번에 작업한 내용이 적혀 있지 않다. 근데 너무 지침. 다음으로 미룬다.
  • 이제 PR 을 쌓기로 결정하면서, 이 blog 가 불편해질 수 있다. PR 메세지로 옮겨야 할까? 고민.
    • 협업자가 등장하면, 그 사람의 의견을 들어야 하겠지. (방해된다는 확정적. (일기니까...!) 어떻게 대체할지를 의견을 구해야...)
  • 유닛 테스트, 타입 테스트에 대해, 조건은 걸었지만, 작동은 하고 있지 않다. 다음에 챙겨볼 것
  • 미룬 과제 제외하고 다음 목표?
    • 기존 컴포넌트를 모두 evventloop 로 표현해보자. 현재 scheduler 만 loop 로 표현되어 있다.
    • 이후 rust 로 바꾸기 용이해 질 것 같음.

2024 06 24

메모

  • 메세지 큐 기반 아키텍쳐가 요즘 인기가 떨어지는 이유는? 이란 해커뉴스를 봄
    • Redis가 대부분의 케이스 및 캐싱까지 처리해서 더 이상 별도의 메시지 브로커 운영이 쓸모없어짐. Kafka는 정말 대규모로 가버림.
    • DB(광범위하게 봤을때)가 대규모 처리를 훨씬 잘하게 되면서, "일시적인"처리들을 메인 저장소에서 처리하게 됨
    • MQ 기반 아키텍처가 기대만큼 잘 작동하지 않는 다는 것을 알아버려서 이제 다른 방식을 사용함
    • 사실은 이제 MQ 기술이 성숙기에 접어들어서, 사람들이 관련 글을 쓸만큼 흥미롭지는 않음. 하지만 여전히 널리 사용되고 있음
  • 요약 스레드 내용은 마지막 의견으로 정리 되는 듯
  • 하지만 나는 다른 3가지도 일리 있다고 생각한다
  • 특히 airflow 에 한 해서는, 굳이 메세지 큐를 태울 이유가 없다고 본다.

오늘의 계획

  • WSL1 환경이라서 안되는 거니 다른 환경에서 돌려보자
  • 회사 컴에서 하는건 쉽지만... 이 레포에 회사컴 묻히기 싫음.
  • termux 에서 돌려보자

진행

  • 기억을 되살려서 폰에서 ssh-server 를 띄우는 중...
  • 이전에 열심히 만들어 뒀던건 userland 내부에서 였단걸 깨달음.
  • termux 는 약간 다름
  • termux 내 proot 로 만든 ubunut 에서는 어째 잘 안됨...
  • 중요한거 아니니 무시하고 termux 에서 바로 sshd
  • https://wiki.termux.com/wiki/Remote_Access 참고함. 비번은 asdf
  • ip 는 고정 안될 텐데 오늘은 신경 쓸 필요 전혀 없음.
  • 접속
[22:58:21.332] > Exec server process not found
> [2024-06-24 13:58:19] error This machine does not meet Visual Studio Code Server
> 's prerequisites, expected either...
>   - find libstdc++.so or ldconfig for GNU environments
>   - find /lib/ld-musl-aarch64.so.1, which is required to run the Visual Studio C
> ode Server in musl environments
[22:58:21.347] > 
[22:58:21.362] > 6b5b59277f5d: s

vscode Remote:Host 는 불가함.

code-server 를 설치하고 localhost:xxxx 로 접근해보자

termux 에서 곧바로 하니 실패함.

+ tar -C ~/.local/lib -xzf ~/.cache/code-server/code-server-4.90.3-linux-arm64.tar.gz
tar: code-server-4.90.3-linux-arm64/lib/vscode/node_modules/native-watchdog/build/Release/watchdog.node: Cannot hard link to ‘code-server-4.90.3-linux-arm64/lib/vscode/node_modules/native-watchdog/build/Release/obj.target/watchdog.node’: Permission denied
tar: code-server-4.90.3-linux-arm64/lib/vscode/node_modules/kerberos/build/Release/kerberos.node: Cannot hard link to ‘code-server-4.90.3-linux-arm64/lib/vscode/node_modules/kerberos/build/Release/obj.target/kerberos.node’: Permission denied
tar: code-server-4.90.3-linux-arm64/lib/vscode/node_modules/@vscode/windows-process-tree/build/Release/windows_process_tree.node: Cannot hard link to ‘code-server-4.90.3-linux-arm64/lib/vscode/node_modules/@vscode/windows-process-tree/build/Release/obj.target/windows_process_tree.node’: Permission denied
tar: code-server-4.90.3-linux-arm64/lib/vscode/node_modules/@vscode/spdlog/build/Release/obj.target/spdlog.node: Cannot hard link to ‘code-server-4.90.3-linux-arm64/lib/vscode/node_modules/@vscode/spdlog/build/Release/spdlog.node’: Permission denied
tar: code-server-4.90.3-linux-arm64/lib/vscode/node_modules/@vscode/windows-registry/build/Release/winregistry.node: Cannot hard link to ‘code-server-4.90.3-linux-arm64/lib/vscode/node_modules/@vscode/windows-registry/build/Release/obj.target/winregistry.node’: Permission denied
tar: code-server-4.90.3-linux-arm64/lib/vscode/node_modules/@vscode/deviceid/build/Release/windows.node: Cannot hard link to ‘code-server-4.90.3-linux-arm64/lib/vscode/node_modules/@vscode/deviceid/build/Release/obj.target/windows.node’: Permission denied
tar: code-server-4.90.3-linux-arm64/lib/vscode/node_modules/@parcel/watcher/build/Release/nothing.a: Cannot hard link to ‘code-server-4.90.3-linux-arm64/lib/vscode/node_modules/@parcel/watcher/build/Release/obj.target/node_modules/node-addon-api/nothing.a’: Permission denied
tar: code-server-4.90.3-linux-arm64/lib/vscode/node_modules/@parcel/watcher/build/Release/watcher.node: Cannot hard link to ‘code-server-4.90.3-linux-arm64/lib/vscode/node_modules/@parcel/watcher/build/Release/obj.target/watcher.node’: Permission denied
tar: code-server-4.90.3-linux-arm64/node_modules/argon2/build-tmp-napi-v3/Release/obj.target/argon2.node: Cannot hard link to ‘code-server-4.90.3-linux-arm64/node_modules/argon2/lib/binding/napi-v3/argon2.node’: Permission denied
tar: code-server-4.90.3-linux-arm64/node_modules/argon2/build-tmp-napi-v3/Release/argon2.a: Cannot hard link to ‘code-server-4.90.3-linux-arm64/node_modules/argon2/build-tmp-napi-v3/Release/obj.target/argon2.a’: Permission denied
tar: code-server-4.90.3-linux-arm64/node_modules/argon2/build-tmp-napi-v3/Release/argon2.node: Cannot hard link to ‘code-server-4.90.3-linux-arm64/node_modules/argon2/lib/binding/napi-v3/argon2.node’: Permission denied
tar: Exiting with failure status due to previous errors
proot 상태에서 해보자

결과

# termux 켜기, 메뉴얼하게 sshd 열기
sshd
# 접속 방법 확인
whoami && ifconfig

# ssh -p 8022  한 후, code-server 설치
proot-distro login ubuntu
curl -fsSL https://code-server.dev/install.sh | sh
# 비번 확인
cat  /root/.config/code-server/config.yaml
# 구동
code-server --bind-addr 0.0.0.0:8081

기대대로 잘 된다는 것을 확인 했다. 장비가 느려서 그리고 sqlite 라서 동시성이 강제로 1로 떨어졌기 때문에 느리게 반응했지만, 작업이 작동하는 사이에도 웹서버는 반응 했다.

다만 작업이 한참 진행 중이라면, scheduler heartbeat 는 갱신하지 못 했다.

2024 06 09

오늘의 계획

  • AsgiExecutor 를 await 하기!
  • 다른건 욕심!

진행

  • --raw 옵션은 신경쓰지 않고 일단 작업해봄
  • --local 을 제꼈더니...
[SQL: UPDATE task_instance SET state=?, queued_by_job_id=?, updated_at=? WHERE task_instance.dag_id = ? AND task_instance.task_id = ? AND task_instance.run_id = ? AND task_instance.map_index = ?]
[parameters: ((None, None, '2024-06-09 14:33:04.563888', 'example_sla_dag', 'sleep_20', 'scheduled__2024-06-09T14:08:00+00:00', -1), (None, None, '2024-06-09 14:33:04.563891', 'example_sla_dag', 'sleep_20', 'scheduled__2024-06-09T14:10:00+00:00', -1), (None, None, '2024-06-09 14:33:04.563893', 'example_sla_dag', 'sleep_30', 'scheduled__2024-06-09T14:20:00+00:00', -1), (None, None, '2024-06-09 14:33:04.563894', 'example_sla_dag', 'sleep_30', 'scheduled__2024-06-09T14:22:00+00:00', -1))]
(Background on this error at: https://sqlalche.me/e/14/4xp6) (Background on this error at: https://sqlalche.me/e/14/7s2a)

job 이 생성 안되었기 때문에, sql 이 실패한다. job 을 안 만드는건 어렵다. 고쳐야 할게 너무 많다.

WSL1 에서의 sqlite3 까지 지원하는건 너무 어려운 목표일까?

로컬에 적당한 db 를 만들고 (redis sql 해볼까..? 이것도 에바인가?)

결과

  • WSL1 에서의 sqlite3 지원을 위해 airflow 의 모든 db 접근을 이벤트루프에게만 맡기는건 아직은 어렵다.
    • 관련한 AIP 가 있었던 것 같은데...
  • 그 목표를 포기하자면 db 셋업이 필요하다.
    • pip 로는 설치시키기 까다롭고..
    • 따로 셋업 절차 만들긴 싫은데...
    • rust..?

2024 06 08

오늘의 계획

  • scheduler loop 화 성공시키기
  • 다른건 욕심!

진행

  • 오랫만에 재개, 지난번에 완성을 못 했었다. 기억을 되살리는데만 해도 시간이 들 듯
  • readme.md 에 써있는 내용으로 시작. 기억과 다르게 스케쥴러의 loop 화는 일단은 이미 성공 했다.
  • 문제라면 스케쥴링 루프가 곧 작업을 처리하는 코드이기도 하다는 것. 이건 사실 당연한게 uvicorn 이벤트 루프는 단일 프로세스니까....
  • 작업 자체가 작동하는건 다른 프로세스로 보내버려야 한다.
  • sqlite 접근은 uvicorn 이벤트 루프에게 그대로 맡겨야 한다.
  • 그래야 목표한 sqlite 로 여러 작업 처리 하는 방식이 가능하다..!
  • Sequential executor 를 교체해야 할 것 같다는 아이디어가 나옴.
  • AsgiExecutor 라는 이름을 만들고, custom executor 설정으로 실행 시킬 수 있음을 확인. (이름 갈이만 함)
  • loop.run_in_executor 를 이용해 process pool 로 넘겨야 한다.
  • Executing command: ['airflow', 'tasks', 'run', 'example_branch_dop_operator_v3', ... 를 보니 --raw 옵션이 없다. 즉, sqlite 접근을 할 것 이다.
  • 예전 기억이 맞나 확인해보니 맞다. --raw 옵션을 넣어야 LocalJob 을 안 만든다. db 접근을 안하고 싶다면 --raw 가 필요하다.

결과

  • 불필요한 죽은 코드를 정리했다.
  • AsgiExecutor 란걸 만들 필요가 있다는걸 확인했다. 계획을 세웠다.

2024 05 23

오늘의 계획

  • 1시간만 하기
  • 그 안에 scheduler loop 화 성공시키기
  • 다른건 욕심!

결과

  • 1시간 보다 더함. 중간에 컴 꺼진게 좀 컸다.
  • 스케쥴러 코드를 거의 다 가져왔다.
    • async context 에서 try-except 를 재현하기 까다로워서 예외처리를 일단 포기 했다.
    • session 도 그런식으로 포기한게 1경우 있다.
    • dag parse 하는 별도의 process 가 기동하는데, 이를 분리하지 않아서 에러가 나는 듯 하다.
      • airflow 가 하던대로 process 만들게 아니라... 다른 방법으로 해야 할 듯 함.
        • scheduler 하듯 await loop 로 바꾸던가
        • 그게 너무 어려우면 asyncio process pool executor 로 보내던가
    • 그 프로세스가 airflow dag-processor 와 같은 코드를 사용하여 기동하는지는 잘 모르겠음.
  • 쉽게 갈려고 상속해서 만들었는데, 아마 곧 불가능해 질 것 같음.

2024 05 13

오늘의 계획

  • 7일날 찾아두었던 state 를 갱신하는 뤂프를, unittest 할 수 있는지 확인하자.

해봤다!

심플하게- 된다!

BackgroundTask 와는 다르게 uvicorn 도움 따위 필요없다.

그럼 뭐가 달라지는데?

  • 회사에서 쓰는 supervisord-Ofelia-CeleryTask 라는 고작 로그 파일 쌓인걸 지우기 위해 하는 것 치고는 너무 과하게 복잡한 부분을 지워버릴 수 있다!
  • 회사에서 쓰는 BackgroundTask 로 state 머신 만들어서 작업 종료 시키기... 부분을 개선 할 수 있다. 현재 tick 으로 livenessProbe 에 의존하는 괴상한 모양인데, 그럴 필요 없다!

조금만 더?

  • _core 디렉토리로 지금까지 알아낸 구조를 옮겨넣자.

너무 욕심냈다. 늦게 잠들기 전에 그만 둠.

어느 정도 말이 되는 방법인것 같다는 느낌을 받았음.

2024 05 11

airflow korea meetup

이 날은 그 전날 갑자기 소식을 알게된 airflow 한국 밋업을 가게 되었음.

Korea Apache Airflow Meetup @Seoul Elice-Lab https://www.meetup.com/apache-airflow-users-korea/events/299605465/

순서상 마지막의 라이트닝 토크에서 기회를 얻어서 이 repo 를 소개함. (횡설수설) 밋업 자체가 몇년만의 경험이라 마냥 즐거웠음.

미리 준비하지 않은 공유여서 그런지 잘 전달은 안 된 것 같고 이 고통은 나만의 고통이라는 점만 확인함. 현장에서는 즐거웠는데, 기록으로 정리하려니까 그 점은 착잡하네...

이 날의 첫 발표 Airflow@우아한형제들의 발표자이신 박준영님이 이벤트 드리븐이라는 설명에 아래 발표를 공유해주셨음 https://airflowsummit.org/sessions/2023/event-based-dag-parsing-no-more-f5ing-in-the-ui/ 읽어보니 watchdog 를 써서 airflow 의 첫 5분 문제를 해결한 것으로, 내 문제와는 다른 문제를 해결한 것 이었다.

그리고 아래 2개의 AIP 의 존재를 알려주셨음. 매우 감사합니다. https://cwiki.apache.org/confluence/display/AIRFLOW/AIP-67+Multi-team+deployment+of+Airflow+components https://cwiki.apache.org/confluence/display/AIRFLOW/%5BWIP%5D+AIP-70+Migrating+to+asynchronous+programming

특히 AIP-67 는 멀티테넌트 관련 내용으로... 현황 B 정도가 지금 내가 생각하는 내용인듯. 좀 더 읽어봐야 하겠다.

AIP 에 흥미로운 아이디어가 많다는 걸 발견함. https://cwiki.apache.org/confluence/display/AIRFLOW/AIP-61+Hybrid+Execution