From 30aa6127f3a6c8c915b671a6a9bf3659b7262d6c Mon Sep 17 00:00:00 2001 From: Honved Peter Date: Fri, 17 Jul 2026 16:59:23 +0200 Subject: [PATCH 1/2] 1025 v1 --- snippets/1025_BiPlatform/image-1.png | Bin 0 -> 59438 bytes snippets/1025_BiPlatform/image-2.png | Bin 0 -> 9001 bytes snippets/1025_BiPlatform/image.png | Bin 0 -> 5655 bytes snippets/1025_BiPlatform/index.md | 603 +++++++++++++++++++++++++++ 4 files changed, 603 insertions(+) create mode 100644 snippets/1025_BiPlatform/image-1.png create mode 100644 snippets/1025_BiPlatform/image-2.png create mode 100644 snippets/1025_BiPlatform/image.png create mode 100644 snippets/1025_BiPlatform/index.md diff --git a/snippets/1025_BiPlatform/image-1.png b/snippets/1025_BiPlatform/image-1.png new file mode 100644 index 0000000000000000000000000000000000000000..82ed1fd9b02218715880732e627d5b14c8d7f8e5 GIT binary patch literal 59438 zcmb??WmFzbxFm$&mf%ishv4q+8r;GQ!QDMTfZ*=#?(PZh?(XjH?C@RPy?giUp0hvR z12f$-)86$|RR<}^i6g?{z=45*AxcV!D1m`}U;=)9Fi^mq*qFjA;19UHlDH69`6%82 zaPiStP*xBOtSSQj`8yEu%mqv807FO1dL1nw1TP`3_*p~{yypusuL@PfPc(4R&tIjWO?@J1Wh03z(GJLB z6@+9fTAp6#WviPUAZ7IV_KrEvMy*emt1nI>lA4?i!{fAYBKxI+6EI%vch-zgmg~{> z$UndEgLXAc{VDF*pZEk@U}<3HSK0~XttP(!nOj^nYmD0T+UT&qb85?^+MH#FPnQIdFVK5UF5yi6Yte;O zz>`(3UEL1#**U( zmn|;9&XWa%3wo-H!+5iQ+iloeJAV4O>3nq2!Csw^-jBv2-$e8#M|AH8Mtz&sgK}0k zP0*x+<3|5ho92Y7`Zd_K=}EFd&zONNit10Xm+1B2-FI8(WN&*RoR_)R77;PZ-?}cu z%HzM+$|zn}`|}_xDkc#gT_K_OW)1do6E6A`Tv9d97f9Z)(&zXsjbHl9A8uo;;Qh6L zYS~!rJjKqlKIV}!`kwE8>d@j$zjnXcz3GSP^xh9Ui2D3XZNKg;>T~)&;vsPH7GGD^ zRx9!87pBPb-OVmaQ0SLdVyL!sttyJV9^Ws|(hUak250-UbQr6jh~FP3ExZa`?r_!6 zq=o71a5&ipe}-6+4)JIIC1Ln+gRG{yKJVL|S1i3&6vPpxMA!Qp#0}y%b`C@fkUKhi zM+I>(bnPQjkGVY-+KfPvM$9^=3INSO22x*v`_x?mH7#zH`S>2&z(joXfhHYGc z|J*zXHL2<4P$~qz^`?gKb<2|dJRB(WN5N0O=DN)j`V%SWCoMNbD|0qlJPYGen16h3 zv7|qG9o3TttIXAwU|5W;VzWGI@;2lQabAs{Mg<;xrD7BpbCDA*oXf^1D%1Rgg(ab{ z&wQvBJL_79$L(Jumm`=nkr@=M|Er_6*SiO9%}rM3t_ZShv7W5(yQC?Z;HQrpdY^ci z-h5lT3u3M2P%tT^4IgDDt?_mT^Qo3wlAsXx6xcIM9Wa0EbhVQiUpyR}2Y1Wu&OhQ$ z;waD~bTk|pkkENoMsyhaM}4FmM95Sb+U00bClZf1eI?suA!$5i*_h~qJT=v{yG1rV zxS}47?2$H!KPM^U5BW;toU43q@K|yp`E1T+?O7M`%1@iGjE&81AT|No^r~r&Q1pNa zNnjz_=$qX(f27*JT~(po^3Cxk3~;jB{8LDfNLYR!*+Xl(ljKbBcFyq@45H}7yzALo zXI_PWuUZmXG6A-~JLDm>iZWzjh(cwq{xj;lGSII54m8mxUxG9OPh&~(b6;>oBIqMb~J4;^>U*& z``%4A40@2|RzoY{yrjInAqCP>0S0jw&X%HN@(@WHlQ<0Nd34}Olj7X7DDPVlq(FS7IMm;QGgYg%x!Yunu6x^hZqVU)>JzQu z(%3I2BpG?OKl9Oemb~6aC3{+J4k9pLKAPzvzX03AK-{}60_EyF`_u4WuP+l~649|W zw97&7N82?pPv!QxTvTtq?q(ZdCp#7gKegF+C*v#Y*21GEypGPAASPR;Xtb?McE+xoM3qk%~CFUoF+BF+S^YGolz4a>DtGU$Wbg*RNlFsyx zhlv?()DcPIg{`AXzWN1G$b?0h{($w;?;!2Y*aPW>{2&8a7i1o=ZP5cJTdEH0FtMD4 z-rX7a`$-o?-!CwoGzumtNk{H#RW1vf+4SUD2~cmSTCSf`!e!&UVl8og`unpW>HBmJ zA)8P24Q{wLM{W1xU*6U^(Hl@(|Bj1EomNK-s>p2EYBK7x<5~4z6eR0!b%>fywQEAo z2t5kx=t8WQLEJeyLykT~m3i9$|AUAj3q$76NnalGH>ob`S3m#?4p-~}uFTV#diSq! z1))G0gM)I88{ZnQnIM6s{szTCvF?ikcv>pYr0<%-^V*bdN(hi?{%Yq zzDMJ+UDo9bl1^~sV0{iw7LHe}Hzh%PIE>8{$tY4`_8esQOxGwBrCcPpUNf_7NgkB` zz5{~|3+b3H3KvDORb@YIf6yP-YH;^yn(R7N`+<`=yB1HKGb-unbX}zxiFLwuFBRit z0nGuczqvrPWF~utV9zew)O!Vg6u(0(_>`U^Th;y?$0e>TZSGb1ps{h2QnKBr^(>k{ zTfTX)2;O;Muyxp{E``%^4e8A6$66eH6fQ;0IIaWfDu-k|pE1}_+9yZYYYMf?hfvB| zXjLZLUA|L}xO};h))h!#SxXQnWqK2v1-BBtUSGcs(&k7D74G_eU(fOe$vxI%OSfSB z$YW=423pyAw03rh#3qF#`aEf9@@X-NNR7rTO4VumE{0(u|tI`SK?PXQb>BZU-227iw&! zI{niZK%QNQ=hWdlHxx3qcno#51KHezq9VGf1-*g(@Ux-{kzL7Qt#prGWQK8N0YFaU8+Xjv%TTvm?L;n zp7?8GLdAkM?f@P(1Ai%RFfm0KH#Ab@p+cZt8~H|-)z7*FLZmwAEhYMf178X+eD^V9 z#e5x(8Yt&XA5GbjKcls!7OE5{mSM6y9_4LcDAE<<7#4}J?2#yNIO5f zq0cLwRGdf4=~hm#2r^z-y)uk56~8b2n{SVlYu_G%@;(LffhnNQ)wsF48<0|mqL69l z)HPBDGs|Q;qSj3g(UeBm&W$Z}oKI z@~gt%vPkTIcu0;~#82bbs5?@Ap5yYwBIJvDJ*&&r)jbkpPpCR7U2qd;_cprn5s`Ax z5ZJC?!_wShqcFH>oWuRo3dVuBAZ;b(d`QjdV41WM*#Nd13??M-nAC+7L&BRgH$gEcuJ&XFsCsOk2 zp|P0vOW)+8FZWUp{Kb3Q<^pZY18=%Xyn>KM7 zGU48+(`@!LVQfPKt2=@=Flp|^bz2CqsU}FSHt#9XmnRPfSg;E9i*h4!=rH;lqslaAR#?>os98L#ykxm5R`5o_uzqPwD@;CKq|A6#V#2 z1wq^7IO%sfe`GzXH%PiRV80)x7b?lk;&|!nj|;APkrX$3FC0NRm}67sAB;yip;f;X zd#+w=sr@KwxEl6I0?;SR(OUvM7`-7=axUG($Q|eq2ldG-W&O4#cIgV9DZdw>Iuw;Ql<2U}#YAHs3U4CqW|7M)WT(fM+&1XK zpFPW15)`JP@V-c6AisFq{dI`ppL^~eqsiuQc*SS{A=^DG5yMfa@#K|Yz*NMB`N6>p zV;tNu2PLxn%7`HUVs9y;=1f=9uGv4KB7fL+gS0MjHt=G4Y?pAdk%f?c0}U$*aZg%` z2!?^*wZGIIQVR;fX5QvT;*RSbI_6ktF=nJ@i5<_H;9(ggX6X5oL}GfBHoEbfv5A-D za5k+lqb)@vM+p1!N)ZL&j^kPw=*FyHNCaKZPvB_NgscHp?ND-Jq2JFNcT$yA^ZI^| zQQac!8S%8Er<<|Pq&OJ6$TBF6nJ+*Iu(cS65wozwW=%}i#4Ed<&pDJBiZ0i`F}h4b zMYl?AmkrXv_~2rPxtg zrGt!9ecUl4>}Z4|N+sYHE2%8_T76G2Q4|{EbBl~9%;FX8th&JREoSWuU)V#J9PtCA z9Sb9(#pyINpKSxUp_UAASb(}#c0wkf+Qt6>|6(|rm4!drG~$X(XWmG zU59lgNzv@_HLNYy?j<)qr-5lahvFpwqf9kK)jb&3^rw(4yq@#vNlITrh_k(6Uj%}N ztFOZuT&+j^)d#~-)(1+S)B}*4Vpxm`+u3FSRlM5^sb*O`NOH2KKGUda(?+ywpDKm3 zdP`hPOqW<%N&0;#RCmVoC)yW^X;_mrY|=+wj(2T!4v`h8l-P836)@+^3ooCYZ3Rxm za2Tp~*_`17Zh=)V+<$}q&=PJCIE)dO7k#7s8YOqd`P zppha^%%JuWw~MzN8`&&2KERZ2f+D8Lz>=z~?(hCGQD&LvOJ&@UBHxxP_UZ9=Z2>TF zaJmPZRaxqrr+C5ue$N+ke{Cdes_oRe4MDD?Xs-8lF9y9`L~KL0OVyDw{+j&>c~y`h z44xq=y=Djk1_tI!rYjBCHO@eA2*3&GOAwJLkIm3|hCU_p`RIs8ald^tk{!L`yELdT zyu9_wK7MJCh~(T--h&-u;}73JGEIVtuDvn=Iq8CrJXL)u7-h~#@M(E6w!d!n&E~7i z{VT4#pfr5VZzNh;8T;!UqEXPO1ci1MG10ABNq-Bmx6o<{p_yED+gOM*6^dBZG2OrN zO@EH&RMyl%M2_Qe9+eQ4uj#91R;xO4pkAfRXSO!M#3`Clv7Yp2V+E_8!23aa!^Y=H14=-C(a)XKnAZWeQ<;()@ZC@)YL(_Y zLgm+L-i4u*DF(eS6th09e4inlZ$k@?C~Nk@EK4Tr4Jq-9F}waMA?-KTfe@@CmdxF_ zOprWrT|g9L>%FUG-QTQ2gjMVx=@d|STsei0ureSAK~4z3QhCuaW}>)=PDA!Hyv4m> z!pJbTs2m@$Gk*?oj#;dbAgKFx2Mmb6&*`^!!C3fJ1jE|);lE@ zjTs6agxPh07Q^TL*_TdeJx38!V*P>L(HiI-?pw%26K*c`r zLC5RDZc6?zzkcxD&xoxp1(D z*ga=a78_zjF}QDbUav&XY7JqbCwse)Oqz-#Sq zfF`xHqVAtTV2G|d_?uN%oNq3-IixB_lR{+{5Bi$k#YoH^VXvD6=4i{QahsbJ(~7!+ z(=@~lk*=i!b1X&tx*z5N?Hgrd-V_mZ04KMC2vMH~J!pDGq}({<(pQD=L6_KBWGwUx zjCJE2b(9AG(lvln7GD#;3fSP85z0k+)oMYqMA8^H4j>DVDW8x)uK5> zKYCnr&CI@Q{^fG$AH$Q4greJLvxi{pKqv^-C}MJ9DgmjU7uyjeg;3DTAvL-^N(jHH z_ufIk!U9MpmpN*(rv_-jkCZb1%<&Pfjg`>U#~qY@L%~VczU^~|A zo_;2T!tPWkSYte$4TMo+CC!2(%MwMi%k+oex{d6K4W!=6H;5I2C2Bk1Y`pdZA!N>y zNHd3s%Z`pe45rhfF28S3+dkPGEyqGy*{Ag*-Jo0KXZK%@y&pXIlShI_6irxgvf1cB zz0mnYnakfxuvBGSQhcuFQ1d1})mhQ^DiU*|yLohN)};h7m4%lDX$-}(akiwm6%nu> z8?6N}hRjuwY5I|KMWfq8N7_rPKwxGE>Hf*R=)m4m?BKs*1)vpx(@7B}_NME5o*QX{ zh4-v&xo;~k@F_2a>>ex7A?CuhyRzK01`j}-F|n9c`&eRYECvYaApM0)Z7> zCLjcq*#=l$(>`^cA24h9PT92y8a3f!_VFuwAHRR-4a= zkUiAxM$4*fJxg>cG!%1SnT7npj4K|DsiFGA>$bG~1-WJspFMPGjpxlMC)5l%zM07H zY|qGGb;OygwzC{*5URXjEtepLUvNKsm-$z8GAa{xq41xe4bLM;u&=V6#a4dzeDZ7W zixZTqKaz)~m*ORp3SF_$Y^1G7>TqYl!jeaH!))IBoIvycidxxSX8`tUgqX_dk=TNa z$O^-dVs*k;zK9{{y7P6bA6UA3ZLb$iZxTIMgdKB=Zl z^kf<0+f@wOBy@%3S3dM3VTh+w2>u9BZh9U820l!LS|bYf8pieOHK>`LPO^8QgTssS zC5wFuu0mi}{@NN_;)%hVohEk6$`~Hol;>+47C~-I5Si-ePk%gY?A)D?H@3Nk+b482 z-@X^o$~Va7e^1``|A-Eew9Hg72|D0tK4U`GmQw5pj{bSLI={>#u7dXyLCsv+upAL9 zjrn739fMcB-FB~kxjnX3Dl?)eufEtB*w%+I?5m`96J+Pq|q5bbrv|`dqs!kHV8O+3qNt3O|S5+I!ti zQSfsxnK&Os<1-EI0O^aa96tIir=TmN#W&6!eTjiD%HDBwo*!Uf`X4?{I!@QfrjN|x zZJ3!U4njgJG>CjY)mk8qEZ2$>ByS2B=1yt<20?76kdtQf;Mjty@aEwck|DbD=arkTNZr_q<@z!GiVor% zoOg?LQsr*)d#+s(P9|agLCv*U0S`n7&Jshh8!GK|ytqY0tGjfX+rtzCnnP7I3uqAS_KGNbTl$0n^Q=EY* zOlP^T(X%L(6zy*PYy)=nm?%5KtS;`2(V-&Hnr2!x5akKqnCa|=f_Ui_n5YY~q+Y&ddY z-aizdXDCK19tsix+n1Lmx=tC<{`M_vD`DeTpuDk7$89ZGY#1NN;~p*f>1V47%{v;e z)mm*I>@9OGnW6|qWIw%g)v~UZdl|i3>jRg<@nlOsKey>DVCjR#9%bbxelG<74LiB> zcldd1Yw@tVPOKLv$ZO+SCQb|GRq*#A>zy}FtGK?@N)a}+1fqgQ(8%r1*jvBFPi>63 z6QytdfJ;tifi|7)hl?o{@}}%ePp~uo7XpvN<|hO+au%;^(Eao?=loKchaRz0T(38uYyPWk7B8c{LTD?NIwjo^(Q^ z%_)L$_$yUAG_Xep2~Ck)(dP1gowOv1kS;22H14x|G*fD)==fg&Qa9%5!E2P zdeb}DDIW*;5#7?3gm7FvYD%h#;%fcH7t-h(HzTz{e&? zNVb(#vex6}0`ahRj|D#a;~6)FDmtS!rPB?Xw-??*!wMg zB;j(-ZQ}Tu>q7S@J7MO`Jje9@lz_h{CQHTs zRbhX~?^7_w;x7+)6A+{LFI|oP6tLT~i(GE)#pTVU2Z3fDSyHX z9$mOQ!yqB$uh5xq&boeP6}QMbEtH+cJEs$sUcv#L3Kz1t!8-&t|)JZ|=gBIIkmb5JiDp0640VqfA=`Ee?EbC+P)KCBP@hM8(s#z9O@w6xIV%=mmF zo%6v%TqJYCWd8Z3Aht7#O<64mxcJ(ZQ+pBUdaXa}c2(a{{hIJLQIMZjyE_Cr2`{N3 zkt67-O6X1RcK-M|8Ik9JiEd@ZmR{*2I|H)mJ{f1X?g zonV{S0Yn~5nIOw_qmy=DDQA230t~O7iRCdH`crNrgdaM4i#VW%3)#SNbZfDqpQ`

y0Qro%pDnfP3x)2YKnJ_j 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 literal 0 HcmV?d00001 diff --git a/snippets/1025_BiPlatform/image.png b/snippets/1025_BiPlatform/image.png new file mode 100644 index 0000000000000000000000000000000000000000..a9e22fb214b413452193ccbbcbfb7c3199962eba GIT binary patch literal 5655 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 + bash -c " + airflow db migrate && + airflow users create + --username admin + --firstname Admin + --lastname User + --role Admin + --email admin@test.hu + --password admin + " + networks: + - bigdata + + #################################################### + # AIRFLOW WEBSERVER + #################################################### + airflow-webserver: + build: + context: ./airflow + container_name: airflow-webserver + restart: always + depends_on: + - airflow-init + environment: + AIRFLOW__CORE__EXECUTOR: LocalExecutor + AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow + command: webserver + ports: + - "8081:8080" + volumes: + - ./airflow/dags:/opt/airflow/dags + networks: + - bigdata + + #################################################### + # AIRFLOW SCHEDULER + #################################################### + airflow-scheduler: + build: + context: ./airflow + depends_on: + - airflow-init + environment: + AIRFLOW__CORE__EXECUTOR: LocalExecutor + AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow + command: scheduler + volumes: + - ./airflow/dags:/opt/airflow/dags + networks: + - bigdata + +networks: + bigdata: + +volumes: + sql_data: + postgres_data: + +.... + +Spark docker file: + +FROM bitnami/spark:3.5 + +USER root + +RUN install_packages python3-pip + +COPY jars /opt/spark/jars + +WORKDIR /opt/spark/apps + +USER 1001 + +... + +airflow docker file: + +FROM apache/airflow:2.10.0-python3.11 + +USER root + +RUN apt-get update && \ + apt-get install -y procps curl && \ + apt-get clean + +USER airflow + +COPY requirements.txt . + +RUN pip install --no-cache-dir -r requirements.txt +``` +### Eredmények + +Sajnos a generált környezet nem működött azonnal. + +Rengeteg probléma merült fel, mire az AI által generált tesztbetöltés megfelelően lefutott. Minden egyes esetben kikértem a modell véleményét, valamint manuálisan is megvizsgáltam a hibákat. Amennyiben a javasolt megoldás jelentősen eltért a probléma valódi okától (például egy, a hibától független modulban próbált módosításokat végrehajtani), új promptot kezdtem, és igyekeztem a modellt a helyesnek vélt irányba terelni. + +A felmerülő problémák: +- Nem támogatott spark disztribúció a compose-ban +- Hibás volume definíció mssql esetén (a hibaüzenet ellenére az airflow-n akart változtatni az LLM, többedik prompt után az első StackOverflow postban volt a megoldás) +- Airflow esetén hiányos `requirements.txt` és `Dockerfile` fájlok miatt nem indult el +- Hiányos `docker-compose` és `Dockerfile` spark esetén, így sem a worker sem a master nem tudott elindulni (a megoldásaival további nyilvánvaló hibákat vezetett be magának) +- Töltéshez fel kellett konfigurálni az Airflow conneciton-jeit +- Spark és Airflow-t nem rakta azonos volume-ba így nem láttak rá közösen a töltésre +- Spark és Airflow alapból más Python verziókat használ +- A Spark más verzióban volt az Airflow esetén beimportálva, mint a worker, illetve master-ben +- Az adatbázis driver-ek nem voltak megfelelően az egyes konténerekbe másolva, illetve azok nem voltak használva az Airflow által +- A Spark worker és master más Python verziókkal jöttek létre + +Összességében ezt a feladatot az AI használata csak nehezítette. A felül felsorolt problémákra, egyenként alsóhangon egy legalább 2-3 iterációból álló beszélegtés szolgált csupán arra, hogy a hiba okát megértse, annak ellenére, hogy a kezdő prompt-ban szerepeltek a Docker, illetve compose és további konfigurációs állományok. Ebből kifolyólag lassan és gyengén tudott előrelépéseket javasolni a megoldás felé, viszont, amely megoldás gyakran, még így is kevésnek bizonyult. A kezdetei konfiguráció bár első megközelítésre hasznosnak tűnhetett, a véget nem érő javítási terációk a kiinduló állapotot teljes mértékben megváltoztatták. + +Az LLM minden egyes komponens esetén képes volt további hibákat tartalmazó konfigurációs állományokat generálni. + +A debug-olás során érdekes volt, hogy az LLM gyakran, egy orvos módjára tünetek alapján próbálta diagnosztizálni hibákat. Gyakran önmagából a hibaüzenetből nem tudta kikövetkeztetni a megoldást, így megkért, hogy debug-olásra szolgáló ellenőrző bash parancsokat futtassak. + +```txt +Worker konténerben: + +docker exec -it spark-worker bash + +majd: + +spark-submit --version + +Ennek ezt kell mutatnia: + +version 3.5.2 + +Python oldalon: + +python3 -c "import pyspark; print(pyspark.__version__)" + +eredmény: + +3.5.2 + +Airflow konténerben: + +python -c "import pyspark; print(pyspark.__version__)" + +szintén: + +3.5.2 +``` +Ez lényegében pont egyenértékű azzal, mint, amihhez hasonlót én is kezdtem volna mint laikus, azonban az AI-ra úgy tekintettem, mint, amely nálam jártasabb ezen a területen, így a hibaüzenetek alapján képes diagnosztizálni és megfelelő kódot generálni. +A végeláthatatlannak tűnő iterációkat követve, pusztán az hibaüzenetre rákeresve gyakran megoldásokat találtam StackOverflow, amely tovább erősíti az AI-val szemben a kételyt. + + +Érdekes tapasztalat volt továbbá, hogy egy-egy javasolt megoldás gyakran újabb hibákat idézett elő. Ezek egy részét még a beillesztés előtt sikerült kiszűrnöm és javítanom, azonban ez még inkább azt erősítette meg bennem, hogy a modellek válaszait nem szabad ellenőrzés nélkül elfogadni. + +A modell elsősorban a rövid távú probléma megoldására törekszik: egy adott hibát igyekszik kijavítani, még akkor is, ha ennek következtében további problémákat vezet be a rendszerbe. + +## PySpark betöltések elkészítése + +```txt +Egy python script-el szeretném a következő API végpontról adatbázisba tölteni különböző nemesfémek árait: +https://pm-prices.azurewebsites.net/api/pmprice/historical?metalId={metalId}&lang=en&startDate={"2026-01-01"}&endDate={"2026-01-31"}, +ahol a dátum mindig az aktuális előtti hónap kezdete és vége, a metalId pedig: +- arany esetén 1 +- ezüst esetén 2 +- platina esetén 3 + +A script PySpark-ban legyen írva, és df.write() paranccsal mentsen. + +Itt egy példa-betöltési kód: + +from pyspark.sql import SparkSession + +spark = ( + SparkSession.builder + .appName("Sample ETL") + .getOrCreate() +) + +df = spark.read.csv( + "/data/input.csv", +... + +Az API válasz első pár sora: + +{"meta":{"timestampResponse":"2026-07-12T19:44:53.28746Z","summary":[{"name":"lowest","bid":111.04,"offerUnfabricated":119.67,"offerFabricated":125.34},{"name":"highest","bid":121.72,"offerUnfabricated":131.17,"offerFabricated":137.38},{"name":"average","bid":115.88,"offerUnfabricated":124.87,"offerFabricated":130.79}],"unit":"g"},"rows":[[{"date":"2026-06-01","bid":{"value":122.35},"offerUnfabricated":{"value":131.85},"offerFabricated":{"value":138.09},"index":0,"validTo":"09:45 CET","unit":"g"},{"date":"2026-06-01","bid":{"value":121.75},"offerUnfabricated":{"value":131.2},"offerFabricated":{"value":137.41},"index":1,"validTo":"15:25 CET","unit":"g"},{"date":"2026-06-01","bid":{"value":120.91},"offerUnfabricated":{"value":130.3},"offerFabricated":{"value":136.47},"index":2,"validTo":"16:45 CET","unit":"g"}],[{"date" +``` + +A promptot követve a modell egy majdnem tökéletes megoldást generált, amelyben csupán adattípus-eltérésből származó hibák jelentkeztek. Ezeket a hibaüzenetek alapján gyorsan és helyesen javította. + +A fentihez hasonló módon generáltam a kriptovaluta- és részvényadatok betöltéseit is. Az ezekhez tartozó promptok a következők voltak: +``` +Egy python script-el szeretném a következő API végpontról adatbázisba tölteni különböző kriptovaluták árfolyamait: +https://api.coinmarketcap.com/data-api/v3.1/cryptocurrency/historical?id={id}&convertId=2781&timeStart={startTimeStamp}&timeEnd={endTimeStamp}&interval=1d, + +ahol a dátum mindig az aktuális előtti hónap kezdete és vége, az id pedig: +- BTC esetén 1 +- DODGE esetén 74 +- ETH esetén 1027 + +A script PySpark-ban legyen írva és df.write() paranccsal mentsen. + +Itt egy példa-betöltési kód: + +from pyspark.sql import SparkSession + +spark = ( + SparkSession.builder + .appName("Sample ETL") + .getOrCreate() +) + +df = spark.read.csv( + "/data/input.csv", +... + +Az API válasz első pár sora: +{"data":{"id":1,"name":"Bitcoin","symbol":"BTC","timeEnd":"1735257599","quotes":[{"timeOpen":"2024-12-27T00:00:00.000Z","timeClose":"2024-12-27T23:59:59.999Z","timeHigh":"2024-12-27T09:07:00.000Z","timeLow":"2024-12-27T17:25:00.000Z","quote":{"name":"2781","open":95704.9745862557,"high":97294.8464204259,"low":93310.7438042296,"close":94164.8603483526,"volume":52419934565.0800000000,"marketCap":1864541907464.4600000000,"circulatingSupply":19802078,"timestamp":"2024-12-27T23:59:59.999Z"}} +``` + +```txt +Egy python script-el szeretném a következő API végpontról adatbázisba tölteni különböző részvények árfolyamait: + +https://stockanalysis.com/api/symbol/{symbol}/history?range=10Y&period=Daily, +ahol a symbol a következő értékeket veheti fel: +- Microsoft esetén s/MSFT +- Apple esetén s/AAPL +- Amazon esetén s/AMZN + +A script PySpark-ban legyen írva és df.write() paranccsal mentsen. + +Itt egy példa-betöltési kód: + +from pyspark.sql import SparkSession + +spark = ( + SparkSession.builder + .appName("Sample ETL") + .getOrCreate() +) + +df = spark.read.csv( + "/data/input.csv", +... + +Az API válasz oszlopainak magyarázata: + +- a = AdjClose +- ch = Change +- h = High +- l = Low +- t = date +- v = Volume + +Az első pár sora pedig: + +{"status":200,"data":[{"t":"2026-07-10","o":387.8,"h":391.91,"l":381.5,"c":385.1,"a":385.1,"v":23974029,"ch":0.19} +``` +### Eredmények + +Összességében mindegyik esetben elmondható, hogy a prompt alapján tökéletes logikát generált a modell. Mindegyik esetben elvétett azonban konverziós hibákat, amelyeket gyorsan és hatékonyan javított. + +Az egyszerűbb Python scriptek elkészítésére a modell kiváló segítséget tudott nyújtani, és jelentősen csökkentette a szükséges fejlesztési időt. Fontos azonban megjegyezni, hogy ezek a feladatok jóval pontosabban voltak definiálva, valamint a megvalósítás komplexitása is lényegesen alacsonyabb volt, mint a korábbi rendszerkonfigurációs feladat esetén. + +Ennek ellenére a hatékonyságbeli különbség jelentős volt: míg a komplex környezet kialakításánál az AI gyakran hátráltatta a folyamatot, addig jól definiált, lokális problémák esetén kifejezetten hatékony segítséget nyújtott. + +## Airflow DAG-ok elkészítése + +Ebben a lépésben a meglévő betöltéseket szeretném ütemezni. Az Apache Airflow DAG (irányított körmentes gráf) formájában ad lehetősget műveletek ütemezésére, ahol egy végrehajtandó feladat a gráf egy pontja, az irányított él pedig a függés irányát jelzi. A feladat meglehetősen egyszerű, így elöljáróban arra számítottam, hogy nem okoz különesebb nehézséget a modellnek. + +Prompt: +```txt +Van három Python script-em Pyspark-ban írva. Ezeket szeretném Airflow-val ütemezni. Az ariflow készen áll, egyedül a DAG-ok megírása hiányzik. +A 3 script ne függjön egymástól. + +Itt egy példa DAG: + +from datetime import datetime +from airflow import DAG +from airflow.providers.apache.spark.operators.spark_submit import SparkSubmitOperator + +with DAG( + dag_id="sample_etl", + start_date=datetime(2025, 1, 1), +... + +A három ütemezni kívánt job a következő fájlokban van definiálva: +- /opt/spark/apps/cryptojob.py +- /opt/spark/apps/metaljob.py +- /opt/spark/apps/stockjob.py + +Az ütemezés legyen minden reggel 6 órára allítva. +``` + +A válaszolt DAG: +```txt +from datetime import datetime + +from airflow import DAG +from airflow.providers.apache.spark.operators.spark_submit import SparkSubmitOperator + +with DAG( + dag_id="daily_spark_etl", + start_date=datetime(2025, 1, 1), + schedule="0 6 * * *", # minden nap 06:00 + catchup=False, + tags=["spark", "etl"], +) as dag: + + crypto_job = SparkSubmitOperator( + task_id="crypto_job", + application="/opt/spark/apps/cryptojob.py", + conn_id="spark_default", + jars="/opt/spark/jars/mssql-jdbc-13.4.0.jre11.jar", + ) + + metal_job = SparkSubmitOperator( + task_id="metal_job", + application="/opt/spark/apps/metaljob.py", + conn_id="spark_default", + jars="/opt/spark/jars/mssql-jdbc-13.4.0.jre11.jar", + ) + + stock_job = SparkSubmitOperator( + task_id="stock_job", + application="/opt/spark/apps/stockjob.py", + conn_id="spark_default", + jars="/opt/spark/jars/mssql-jdbc-13.4.0.jre11.jar", + ) + + crypto_job + metal_job + stock_job +``` +### Eredmények + +A DAG elsőre helyesn lefutott. +![dag](image.png) +Az eredmény nem lepett meg, mivel a feladat meglehetősen egyszerű volt. Alapvetően az Airflow konfgurálás unalmas tud lenni és repetitív jellege miatt könnyen elrontható. Ilyen feladatra, ahogy az megbizonyosodott egy kellően pontosan definiált prompt alapján, rengeteg időt tudunk spórolni DAG-ok generálásával. + + +## Prediktáló modellek kezelése (kiválasztása, tanítása, lecserélése) + +Az utolsó feladatrész a korábbi kettőhöz képest lényegesen összetettebb volt. Ebben az esetben nem csupán egy mélytanuló modell elkészítése volt a cél, hanem a modell karbantartásához szükséges logika implementálása, valamint a meglévő architektúrába történő integráció is a megfelelő konfigurációs állományok módosításával. + +A modellt előzetesen én választottam ki (LSTM, amely idősoros adatok prediktálására előnyös), azonban az implementáció részleteiben teljes szabadságot kapott az LLM. + +Bemeneti prompt: +```txt +Van egy meglévő docker-compose hálózatom egy airflow ütemezővel, spark végrehajtó-motorral. +Az adatbázisban a következő táblákban és oszlopokkal érhető el adat: +- master.dbo.CryptoPrices date, open_price, symbol +- master.dbo.PM_Prices date, bid, metal_id +- master.dbo.StockHistory TradeDate, OpenPrice, Symbol + +A megadott szimbólumokra szeretnék minden nap egy predikciót végezni a következő napra az elmúlt 30 nap adata alapján. + +Minden szimbólumhoz külön modell prediktál. A modelleknek az összes korábbi adaton kell betanulniuk. + +A modellek tanítása hetente egyszer történjen. A folyamat során össze kell hasonlítani a meglévő modellt az újonnan betanított modellel, és amennyiben az új modell eredményesebb, akkor le kell cserélni a napi predikciókhoz használt modellt az adott szimbólum esetén. + +A prediktálás és tanítás Spark job-ok formájában legyen megvalósítva, amelyeket Airflow ütemez. + +A modellek LSTM architektúrát használjanak. + +A jelenlegi compose állomány: +... + +Airflow Dockerfile: +... + +Spark Dockerfile: +... + +Egy példa job: +... + +Egy példa DAG: +... + +``` + +Nem vártam az AI-tól konkrét megoldást, tudtam, hogy ez pár fájl módosításánal komplexebb, illetve megigényli a kész komponensek elemzését, így kíváncsi voltam, hogy milyen válasszal áll elő. +A válasz egy terv volt, hogy miket, hogyan kell módosítani, azonban csupán nagy vonalakban, főleg ábrákkal: +```txt +Airflow +Napi DAG +00:05 + +↓ + +Prediction Spark Job + +↓ + +SQL Write +``` + +Megkértem ezt követően, hogy adja vissza a konkrét módosításokat és generálja le az új szükséges fájlokat, azonban ehelyett azt javasolta, hogy haladjunk lépésről lépésre. Kíváncsiság képpen kipróbáltam a Claude-al is, amely 30 perc gondolkodás után adott hasonló választ. +> Az AI bár képes lenne gyakran megoldani a problémát, ha az rengeteg generálással, kimenettel járna, akkor hajlamos megállni és feltartani a választ egy alapvetőnek tűnő kérdéssel, esetleg kéréssel. +>Például, akárhogy kérjük meg sem hajlandó elszámolni 1-től 1000-ig, hiába képes rá, akárhogyan is próbálkozunk nem lehet rávenni, hogy egyben számoljon el. + +### Eredmények + +A megoldás megvalósítása során több hibával is szembesültem. Amennyiben a hiba javítása nem igényelte a kezdeti kontextus teljes ismeretét, új beszélgetést kezdtem. Ezzel csökkentettem a korábbi, kevésbé releváns információk által elfoglalt kontextusméretet, és pontosabb válaszokat próbáltam elérni. + +A folyamat során felmerült hibák: + +- Inkompatibilis TensorFlow-verzió szerepelt a Dockerfile-ban. +- Hiányoztak bizonyos szükséges könyvtárak telepítései. +- Olyan fájlokra vagy konfigurációkra hivatkozott a modell, amelyek korábban nem kerültek létrehozásra. + +A konfigurációt illető problémák a fentiekhez hasonlóan itt is kifejezetten nehézkesen oldódtak meg. Valamiért ez egy gyenge pontja az LLM-eknek és képtelen a helyes verziók és könyvtárak kombinációjának kitalálására. + +Meglepő volt azonban, hogy a kezdeti konfigurációs nehézségeket követően, az egyes segédfájlok, tanítások, predikciók mind Spark job-jai, mind Airflow DAG-jai, közel egyből jól lettek legenerálva. Megesett, hogy olyan fájlra hivatkozott, amit nem generált le korábban, azonban jelezve ezt pontosan és helyesen tudta javítani hibáját. + +Az eredmények: + +![alt text](image-1.png) + +A modelleket, pedig a következő formátumban egy volume-on keresztül mentette le: + +![alt text](image-2.png) + + +## Tanulságok + +A fejlesztés során az alábbi tanulságok vonhatóak le. + +* Az LLM-ek komplex rendszer tervezésére alkalmas és hatékony, de csak adott logikai szinten belül maradva. Az a kontextus, amely a magas szintű tervre ad választ, az implementációban pontatlan lesz, ellentétben vele, az a modell, amely csak adott problémát old meg, nem látja át a rendszert és képtelen hosszú távon hatékony megoldással szolgálni. +* Konfigurációs állományok előállítására alkalmatlan. Rengeteg hibát vét a különböző verziók közötti inkompatibilitásból kifolyólag, továbbá a változtatásai gyakran már helyes konfigurációs állományokat rontanak el. +* Elég részletes prompt alapján, jól ledefiniált bemenetekkel és kimenetekkel hatékonyan tud hatékony és jól skálázódó Python kódot generálni. Rengeteg felesleges kódolási órát takaríthat itt meg, az adott függvények megfelelő és hatékony alkalmazásában, paraméterezésében kifejezetten ügyes. Ugyanakkor a felülvizsgálat elengedhetetlen, különben nehéz a kód további módosítása/javítása. +* A modern Big Data technológiákban (Spark, Airflow) jártas és nagy segítséget tud nyújtani, főleg paraméterezésekben. \ No newline at end of file From 6634d3ceb445f6d3ec2811497b60a05bb0ba4b21 Mon Sep 17 00:00:00 2001 From: Honved Peter Date: Wed, 22 Jul 2026 19:35:25 +0200 Subject: [PATCH 2/2] minor requested changes --- snippets/1025_BiPlatform/index.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/snippets/1025_BiPlatform/index.md b/snippets/1025_BiPlatform/index.md index 42d5380..8e2a676 100644 --- a/snippets/1025_BiPlatform/index.md +++ b/snippets/1025_BiPlatform/index.md @@ -279,14 +279,14 @@ A felmerülő problémák: - Spark és Airflow-t nem rakta azonos volume-ba így nem láttak rá közösen a töltésre - Spark és Airflow alapból más Python verziókat használ - A Spark más verzióban volt az Airflow esetén beimportálva, mint a worker, illetve master-ben -- Az adatbázis driver-ek nem voltak megfelelően az egyes konténerekbe másolva, illetve azok nem voltak használva az Airflow által +- Az adatbázis driver-ek nem voltak megfelelően az egyes konténerekbe másolva, illetve azokat nem használta az Airflow - A Spark worker és master más Python verziókkal jöttek létre -Összességében ezt a feladatot az AI használata csak nehezítette. A felül felsorolt problémákra, egyenként alsóhangon egy legalább 2-3 iterációból álló beszélegtés szolgált csupán arra, hogy a hiba okát megértse, annak ellenére, hogy a kezdő prompt-ban szerepeltek a Docker, illetve compose és további konfigurációs állományok. Ebből kifolyólag lassan és gyengén tudott előrelépéseket javasolni a megoldás felé, viszont, amely megoldás gyakran, még így is kevésnek bizonyult. A kezdetei konfiguráció bár első megközelítésre hasznosnak tűnhetett, a véget nem érő javítási terációk a kiinduló állapotot teljes mértékben megváltoztatták. +Összességében ezt a feladatot az AI használata csak nehezítette. A felül felsorolt problémáknál egyenként alsóhangon egy legalább 2-3 iterációból álló beszélegtés kellett csupán arra, hogy a hiba okát megértse. Annak ellenére, hogy a kezdő prompt-ban szerepeltek a Docker, illetve compose és további konfigurációs állományok. Ebből kifolyólag lassan és gyengén tudott előrelépéseket javasolni és a javasolt megoldás gyakran még így is kevésnek bizonyult. A kezdetei konfiguráció bár első megközelítésre hasznosnak tűnhetett, a véget nem érő javítási terációk a kiinduló állapotot teljes mértékben megváltoztatták. Az LLM minden egyes komponens esetén képes volt további hibákat tartalmazó konfigurációs állományokat generálni. -A debug-olás során érdekes volt, hogy az LLM gyakran, egy orvos módjára tünetek alapján próbálta diagnosztizálni hibákat. Gyakran önmagából a hibaüzenetből nem tudta kikövetkeztetni a megoldást, így megkért, hogy debug-olásra szolgáló ellenőrző bash parancsokat futtassak. +A debug-olás során érdekes volt, hogy az LLM gyakran egy orvos módjára tünetek alapján próbálta diagnosztizálni hibákat. Gyakran önmagából a hibaüzenetből nem tudta kikövetkeztetni a megoldást, így megkért, hogy debug-olásra szolgáló ellenőrző bash parancsokat futtassak. ```txt Worker konténerben: @@ -317,7 +317,7 @@ szintén: 3.5.2 ``` -Ez lényegében pont egyenértékű azzal, mint, amihhez hasonlót én is kezdtem volna mint laikus, azonban az AI-ra úgy tekintettem, mint, amely nálam jártasabb ezen a területen, így a hibaüzenetek alapján képes diagnosztizálni és megfelelő kódot generálni. +Ez lényegében pont egyenértékű azzal, mint, amihhez hasonlót én is kezdtem volna mint laikus, azonban az AI-ra úgy tekintettem, mint amely nálam jártasabb ezen a területen, így a hibaüzenetek alapján képes diagnosztizálni és megfelelő kódot generálni. A végeláthatatlannak tűnő iterációkat követve, pusztán az hibaüzenetre rákeresve gyakran megoldásokat találtam StackOverflow, amely tovább erősíti az AI-val szemben a kételyt. @@ -568,7 +568,7 @@ SQL Write Megkértem ezt követően, hogy adja vissza a konkrét módosításokat és generálja le az új szükséges fájlokat, azonban ehelyett azt javasolta, hogy haladjunk lépésről lépésre. Kíváncsiság képpen kipróbáltam a Claude-al is, amely 30 perc gondolkodás után adott hasonló választ. > Az AI bár képes lenne gyakran megoldani a problémát, ha az rengeteg generálással, kimenettel járna, akkor hajlamos megállni és feltartani a választ egy alapvetőnek tűnő kérdéssel, esetleg kéréssel. ->Például, akárhogy kérjük meg sem hajlandó elszámolni 1-től 1000-ig, hiába képes rá, akárhogyan is próbálkozunk nem lehet rávenni, hogy egyben számoljon el. +>Például, akárhogy kérjük meg, nem hajlandó elszámolni 1-től 1000-ig, hiába képes rá. Akárhogyan is próbálkozunk nem lehet rávenni, hogy egyben számoljon el. ### Eredmények @@ -595,7 +595,7 @@ A modelleket, pedig a következő formátumban egy volume-on keresztül mentette ## Tanulságok -A fejlesztés során az alábbi tanulságok vonhatóak le. +A fejlesztés során az alábbi tanulságok vonhatóak le: * Az LLM-ek komplex rendszer tervezésére alkalmas és hatékony, de csak adott logikai szinten belül maradva. Az a kontextus, amely a magas szintű tervre ad választ, az implementációban pontatlan lesz, ellentétben vele, az a modell, amely csak adott problémát old meg, nem látja át a rendszert és képtelen hosszú távon hatékony megoldással szolgálni. * Konfigurációs állományok előállítására alkalmatlan. Rengeteg hibát vét a különböző verziók közötti inkompatibilitásból kifolyólag, továbbá a változtatásai gyakran már helyes konfigurációs állományokat rontanak el.