From 841d9966fa9d802adea02ebd7ca14c499139bb14 Mon Sep 17 00:00:00 2001 From: allenhe888 <363857596@qq.com> Date: Mon, 16 May 2022 18:27:11 +0800 Subject: [PATCH 01/25] modify README.md and Project Docs --- README.md | 79 +++++++++++++++++- docs/JaxFeatures.md | 31 +++++++ ...5\201\344\275\234\344\270\232pipeline.png" | Bin 0 -> 48321 bytes ...6\346\213\275\347\274\226\350\276\221.png" | Bin 0 -> 52766 bytes 4 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 docs/JaxFeatures.md create mode 100644 "docs/images/\346\265\201\344\275\234\344\270\232pipeline.png" create mode 100644 "docs/images/\346\265\201\344\275\234\344\270\232\346\213\226\346\213\275\347\274\226\350\276\221.png" diff --git a/README.md b/README.md index a27925d..04ce8dc 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,67 @@ -# Package + +# Introduction 简介 + +Jax 擎创数据团队研发并开源的数据中台项目, 提供可拖拽的流批作业开发, 作业调度和作业监控, 集群配置和集群管理, 算子包管理等功能; + +Jax 项目为搭建数据中台/数据应用开发平台的搭建, 提供了一个轻量级的解决方案; + +# Features 功能 + +### 功能概况 +作业管理 +* 流作业开发和管理 +* 批作业开发和管理 + +算子管理 +* 拓展包管理 +* 算子列表: + +系统管理 +* 集群管理 +* 框架管理 + + +### 功能详细介绍和使用 + +请参照 [Jax功能模块](docs/JaxFeatures.md) 详细了解Jax功能模块。 + + + + +# Compile and Deploy 编译部署 + +### Environment Requriment + +nodejs, npm, yarn, vue-cli +tar dos2unix + +### Jax运行环境 + +### Jax项目编译环境 + +Jax项目手动编译, 可在Window/Linux/Unix 准备好如下命令 +- java +- maven +- nodejs 10.0+ +- yarn/yarnpkg +- vue-cli +- dos2unix +- docker-compose + + + +### Download 预编译版下载 + +### Compile 编译项目 + + +##### Package ```sh $ make package-all ``` -# Docker +##### Docker requirements @@ -27,3 +84,21 @@ With flink 1.12 standalone cluster: $ make image $ FLINK_IMAGE=flink:1.12.3-scala_2.11 docker-compose up ``` + + +### Deploy 项目部署 + + +# Documents + +- 编译部署和环境准备相关问题, 可参见 [** 常见问题列表 **](https://datasalon.yuque.com/staff-dg3tgh/pg6cpg/uem0ig) +- 生产运维中常见问题, 可参考 [** 生产运维常见问题 **](https://datasalon.yuque.com/staff-dg3tgh/pg6cpg/uem0ig) + + +# Contributing + +# Communication + +# License + + diff --git a/docs/JaxFeatures.md b/docs/JaxFeatures.md new file mode 100644 index 0000000..4ee7079 --- /dev/null +++ b/docs/JaxFeatures.md @@ -0,0 +1,31 @@ +# Jax 功能模块介绍 + +## 作业管理 + +#### 流作业开发和管理 + +流作业模块: 提供基于Flink算子的流任务编排和启停管理 +![流pipeline管理](images/流作业pipeline.png) + +用户可在拖拽出3种不同算子(输入/输出/计算),构建自己的flink DAG计算逻辑; + +![流算子编排](images/流作业拖拽编辑.png) + + + +#### 批作业开发和管理 + + + +## 算子管理 + +#### 拓展包管理 +#### 算子列表: + +## 系统管理 + +#### 集群管理 +#### 框架管理 + + + diff --git "a/docs/images/\346\265\201\344\275\234\344\270\232pipeline.png" "b/docs/images/\346\265\201\344\275\234\344\270\232pipeline.png" new file mode 100644 index 0000000000000000000000000000000000000000..15a22ccb049822e7102f6c4e7eeecb405fb8e217 GIT binary patch literal 48321 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 UYVM=&l{A{qXq;EiR5ic*U$ukMLjV8( literal 0 HcmV?d00001 diff --git "a/docs/images/\346\265\201\344\275\234\344\270\232\346\213\226\346\213\275\347\274\226\350\276\221.png" "b/docs/images/\346\265\201\344\275\234\344\270\232\346\213\226\346\213\275\347\274\226\350\276\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..8bb54b53dd2f54a9e7147817ca52bc1a4aaec86c GIT binary patch literal 52766 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

YG(^l6*KBg5!_V^(*4Laj zPXs^iw4KNgu9CbAN82PRqCNN$R|iurA%voKp1cDi5Y~y^e2pbte`}KV4AuMWHsz&4 zPy?v;7OIpqi%pt`yp`}~E}rU|<=*(Z$PpN=)$jJDtas7^=VjP49L(t|$XA*RNV}9Wl$!B*b*=l#L{2;25 z9ks_L812_9_}acF^PUSm z>bqju%lVc+mDr2f%Eagw)pyCIKy)ChGD;Oi0XUd(L!K3!K1j1c5(r=LO1b9sV23p?=H@Ih<4#DO3Mpz5Y%DDtA9XyD{j2kVVyp)AIR<(D9 zQzMvN2tIqC4$MvXJ@|yjP%jlR;HiT(d~c~g3=N~Sx+H-Hta+R4n-=XGGMo4_&t%T6 zyDeOtRQ-G+=>>p+z`^f{N}o<7cQkjJnwJ*a_uL^xss=Vl#{#UU6k^;fafxPECL;9P zaFMez4;vKQ=f|~KKMhp<#^f2X>(8P(ZC?qF@S`vlR3pIs^YefeCXNkwm*Msn_&hjY z_e(%LJzD@dFqOv)*b1qQK$g-Yfj1uFQnl0;V^rThzSQ3nb|vgOIno<9l`?eQ{Lef! zi3Pu$A!cED5gW-T6}9PlA$IfZb&(LmmqCx;O9t9z-3J8xxCL7+>{e_{cmqx+bxi7Y zG7G1jKs@>`Yq6{!)#|#Wu*5+pFO8pD0+WOS^HMAb0gs`I6UYPyY*?n=5<^=1(@9-< zFV$D)iIqY^93WU#e*T8lW*F+A6{CxO#9$me@H>Oc{SZs9O`>rhMa)7sWtIz zV8DPmN8Ki4-lVf`=@dOK(|a9abSuTac7cD{s%?f|KtWk}D41Avrr*{3i9G84nNX(? zqK4u8v7yo_jHWKEGm=o$6WH?g8Jyk`c9}2`4MJ7S-`w{FTtqiZD^?AF@zZoRCXPxd|%l&$AZ{avIq|9mnm)QtTG=6^rnE z6>$H_*jM(ECaaK?Ie?}Z&%ewzM@o3%qLP}3#YEwC(r(a7P9ci{=Gs?mOi28W0R^@d zArgdc>%wW)24<3zpa3zb%3tBSm>#a@h4-efYWGBn2sc;{EuL)i?ijh!_QgsodoFLe zWQiU)$u-h%?CT9aa*O?Oz%U5^FaGysa|xqVZ}fm5uO^(SK4Af35c_`b<{1J zs>;~IO#5f(Px6%65A6Vxt~c2~7LTjX#n#JS_ z2L@yBkvjz}d4{@I2}KiaZ5tc?#Bj{ocY3M;U=2#_81o+)Lo^|6lkRWMrQh<5Y*bIu zG)Kqg)8{T;;Xb&=fuJ#c{*~4zrX``9`qI3v%W$*baKPjJIp zn@+8HYj7s8@ZJGIVhP|Acte>WjcT99r<;lDF-6G4=7`ds@E&+y+Qm}&`7@-!zjM3< z-Ops1CBBaIv?i;(7u(|2GKzKF%(Rs&o43bv=nYK7cR!{p%(DHyMxkC&El_uGVSqF-RPegmBSC9J`slkQl`@J5j z7K&t}PaV7eW9*5qnxP<$1fUn7%83la@IA=DL>DUZ8MjCUE&N@0{_#7%eBy;&%iXWd z)YOvrsHNiGlTx%D>hZCi*sSk@UkB5aA+PWZ!#H4A*+z(TN3r;Q(47Kb(d=6fFBnW( z$lN&4Jke^syWN$S0)B%{H#9iy*UnhuCXb+i(W2GgPr*S_JQhLhLz9)qaJ?TWa@JP% zAN}2mIYHuG+nX6m(@q~w)2#KsiDzdzN0>r-%7)3^7rksNzY&~*20RrpkGl_4$jnXj zy^Gn&oyEH}wYwx4$$;U(WACe-&k9RId#yo{@^yQ~0x7-wB(P_0tvy6rw)25R@b=a? z5n6P-(12Y3V18p*8(-54)m*^)WU0Y*Y-d)(cG@hdAsGLPbo?0zHJin0!&&u~Vnx95 zT6w;Bh$<+QFB-^~7r>yp8m$_n%%EwcdTs)4_#%i;nBpsgbLw|SSdV?9%#xEW9v{SL zwr9_lweA$BtIyxCr~BS(O@W1WubIk4JKvxKKvCq^1~5$p#?W*9L+9GUw$EdtKrQY%2-{laGp$vbt2 zoPKV|CoNtvdj=-ZW}p**D&^bOy~N5Y!Fph~VXM{QMEkHTh@EAUOv<}eXS@{!I0(yU zmlBRj5(vRh+X)S~M=iZx_|$1YNJCWY<658c3!C>?Ag6o#dbYwL3$;C^7>_hx;k-mT z1w6d$19?*0%aoM*+NgtF?59LU$YEoLPr*AT z&jHQjS;V%(jyPRw-&0o6UY*(EcYHWp{8I%ShQDi&<*Rl3CLzaIm;rknW3)6p=a+j} zdF<#KX|GDPDqoYa^QyI!Tcf}75SWc>Yk;qI?`Z)kN7Be@KMj9I{CR^fOoC5cZz8#+ zH|*4PzV8xz0qT6~sXLL~@C4n`YJ0Ks(`pQAP8amkqjYA&-tS~_#PHem2Rvag7M@ru zdu@-GWNxp~s3q7RsF``7nKMt@c9cRrCucLyL>3mVQcmzWzRx=~V>UPTNcnHY%&N)F zzjI%Z&QM3n_tkk5vnG2Jic7Wg>zWf@bCoWm{N~jeVb3vUZVGeF*j$gs&DF z#_FpKrGpk!b6Zn&)D{h86pQTZ%c6mTK}^^>XiCvNNqT>|kHl>7o$x*>9=2?5%J>Py zGD`lQf@FW;BTe1CS_8eUaMm5fv-WQrA0LkLOPi1G84OzQZ`(m?8ZHDEv4-4q>TUj@ zl=&}3P@^h8L{CoCzshGwYwA_h^eh47u9B86fP%GUaL}p@BRcG(UEa~1PZyC#FLH#I zYO2k;FsRLC(XGJa8ea%RHG5z6eKTJ_9-3Wbj~^ob2u}lHhs0V)$Lqlr*HhZp3#0ge z;dSYXRF+Ra92epg13boH{=SKE((Nq6^N{aw{V5h?3y?2UqqeQ*b3kisCp@1ha)0JH zDM@%+X+V!kSvyb}k3HpreAC-L;ECLha@}THh?y}-;yw$Xv<;T%yKtZ~xwQ7AOW>fTZtWtxnhjJRQAjULd!`!8xYi39n;{%P z^}528mz?__asq7y(aqH1r5@32rUVtnnw5Ng&b?y+DT43p#Y~zXsL^SFqT;K8vLLxW zjX4l4_QK+Xgk6y;3~1d>7SD=}J9OY&uU9s{2j{Y_;!#GZr$ z8r$?>;n}|VYk?YX&3l!fS$Vo6lX?=`8LP6zE`UNNT08>ImakGy8p=%k414S9sC7fn za-raS1)mC#PvPF)2}R6F7q$fr(EHC!U+@n_wj-r1_@2{q&^z1X3IjeF*3{J#2;APS z0{^76^+I|_fz@(j_tcRI=ljb&O@@Ekq~s&^jf?y0BOK@l}8>W zmMwePt}hcbrZ?kcS8?K3V9(yKb`Nfchwt0$X)DtMJ5MO}tqS2(OkBb$z1JXx3!LXr zrlZ@zo@e~JsQ05pK{`ZfOqk0ze7$*Eg5hV+LT$gr!nnAWGm@cZZ?FMU+Ynwd^VAg* z+V5&}rl_kiVE@A{gkNy!ix12d{mkVmz5yI6(=xJReI$=WPxT5Ft-P?AU+e}Q8&?{2 zI0?@YIdmqXbYLGv&4mxuA)Re$>Xnr>wtAiIPjuot~!e8BhofUlqz zvhm5HfMsYD-%atBpQPQc`uc1w;LBfm>tBwhEbMI{`c%@|u_~JX4;0y4o$tLQ*zmi? zJGK6B|EVZ?n%S+QMyU2GQ!{X(-3e-I>G~F+;!8r}TzUoX%LLb^^$rv$hNDlZMz~nn zPCRVepg-V{Fi8mLqVS|kX5*<;NO4zhv-DK>@@i=90qUj{)p3nR;hI|`4!CH)F3P+od8S{f_jBFKci^ zA>R$=yvaG`HRoZcr3`{XGwRQ!vLp~)E2VZ!#^8y) zMALqrRKhn(PF^a|Z$B@hW#TSuE%Q>Y=|Ec70k*$T3y+MBsER8mMuaBk1ropL69iJ`w@1IRjBW}@HW zbey^DJ2<}uMN;6;v|cMBInq;?)bOxto#N-WKj{YWZ*;6UeRWd??H*&w&jI2rh%}AA;4}PqN`MlD(YTNLwIia!ZFURDxEer*)h2MEWwazXa zNVO%e6MZAfnK(|_R{p?av#3)XCP@sy48sZlICV$=^Duqp4>a7 zYUerzpTdU>IhH3ifik3W{wnS^*bhnYNt*=;4fjrFf%b0?P$S=W08X^lKC_e656R~> z7g2z`s)_=nJ#CmH*4=Bs$~u$3hCt>u8lfh42qlq*Y*a6Cv~{iK=gk5a)UT=`??r&) zyi~@!b>FSj>?qeRVJ@ul{hYjrhSP-@x!c5Y&0(hxF*c=`&YN>Y5iRsKgU7&)nRI#^ zF(y5@rejQ}<2Xrkm&#OeTZ(5%%~KLKJK0%pn{ww811CLn7Mv%!UP)mt=UH(YdDp%p z3mg0PYW@JrALu^T>!u(RQdj!17eWsE2mKbpJ;fN%B_}&q5ak@_k*>$ZV5~9UevnnIc(Wn@3<5LA@AwtQ>Y1yj@#>Z?ecz(+ zgOG1JRR7pAqY_AL*)~wnFT`>tI_U*!s5jyad;H#zcjsM;W$8&%7h(yxt#~P!9`%J* z(XF+W9Zd}Tw>s9(7(mzKw>AeyZHL}UcC5yq|uBSukp$cp|>exUJ)UE<6;fT+dfOs^bpmC3p(+zUypW4~Tk+6r`9TYWZH92H}s(c$H5Mc#i~ z9Ani~FbhEowM}R9j{3)yms|klXqLnwYy8-M?7~@ni<}}xPuQ40x(u6D{22J!G5Rk& z@O(Fe;EbVZ<(r87F4-hI{SL`IhlK25puK%aIUS~FDCun3iPR-wF2o=toTHd;8y{|O zgHh2xVH2L2x0?9pqeUVo;>Qo4p}Y<8ZZth88@ViPKO9>5>FGH*Vz2Mf5`M?{)vdSS zrR@~pU1V_8n~h`M8k~xRyf*SD@vB4P4cL}F=FGHa6pWLU ze7o7;XvKbKZb14~E7P7ik^SxmE&-?u&(BQvr@q-wN?$UJg?Z5Voaa=?H^rG1{^|hplFB%XH;)1NNN{e%%%f?k8BA#OZ zUzP4}ls`_V$>}mkWyNfXUBCqVqTLRu;7Xg{20Wro*S3=FdNBThMf)d+&7oX+_CHuU z$7U$e>ABCpL(HwuwR!Rws{C@P(*L%7Dhs13zt98ZVKd9)zp6L?#@7$&bIMC?dNW65 zz+X_~&cR_;3N6up&4%$2J>(97zd4e#hl@BYXdtiuSf6XeytN1Ntx&4 zFRlNFDgWPN(&>dXLz!=0qS<%bzWm!F_UMz4Au3O3R3yz&3k4nd!X&|z~3RmQ#yaQh<4 z#G+ZvAG!QjOGa^%Vm*zC;GEB*=hHdS)Lf{jwNpUkxp$_kVbm3SZEp9Q(wcGv{hj>F zhh0EAhT91*6WD9OcpNHZU<+cPH?EGnvc%@rn-V!&s2QED= z?Aq6li8w(AVbcF*L(AWNICuZATW9{iXh!-+w~je;d6Q|?e`;(JG^%1?JMz*ocp*Q~ zX%CO1PyO}9BS(g!qZp4EeGsSrZo{{Z4eKMfChyDqaf|8j;J>BJc_dkm9dso5DE)BX z=AfV9Na-2+D5Xc}2NO=D?;l58H9C$T0oIy$N#cZC*}>hU)c)Y zY<28UnTUm>M~0pr&hXDDfZ4Dc0aruj^D^TN-?x}(uI`-X|MPvqWqJLO?ZvBh`$JiC zH#dR}~(J8pGy!8XM^l(gPQZni`Eq&33f&2GY7 zA0m(Gq3ZpXi~?We+t#iu?Z5LTPPpWfH>MB`2L}sk1I|baG0h+XpEl8@=F-pIPyo#r z9b7XxPnY=>kHdGtJSMJ+n|UR7qD|4oWpC)+VvX1L$tKX+<&81oE9Z{JP!cbfva2Qh zIY21s%w-|BF)zO+c0Oo_Y{(S4oc*~2?)8lcj8MJ($qLN+LD6eX0m|BQdn;p zWaSm2UbPb3*USZcuU&F*@OINtZ8Ldx?lUh7`g2q2&Bv<=^PLl8cV%=Wh5Y9dF94O) zU!7~S9ecBVxA0ZtouL%1+krE|6~WelQ$EiS*8Q_1Q9546I`j?nXCwWW2pS&_n_AR8 zZfkVM!n$es$Nmf{MH=joUQ;8!VHw}2CMjuorp2yvrE^N{_C zYrvm-SxyTz)9a%@e@JJaI34jZ-XR1JwT0j4s8T`HKc!K#%lSTPVXc1xjtg>PM@=cS1aQ~;R zb@iI?8Y_tgJ05`~BJ#Gr%11y>VhcE3LVxkOgk<*9gYZW82p6~hmCz-86Cit1XTvJ) z<;(B0#r8*!yp*H=NXHVbYULSUtk99?&wj5e(do4*{aw{azdOkn6mVZz)k!MbrLaGh z_32fHDZxq!bH#PxJ<3&W-32vLmP=g1riHx53ENi!d5LKa1(p&mQ=K;&93xMwbOoy{ zs98GsWh8#Rvdu!!xT^0tPk#dE7zcW%$L^^ZMad ziq`!=q2XIFnN!5A!NImfl3DeX1nu$Q9fDP*W&2Q=mUe z2Z@JH#5RGy<@oc|*k9WHevXT->Ac}N*_ld+CDY=oH#rm6G(A;T?=FQ+h+0_STXiLY z?`SU|->+u%7~|TiCOx){6JX>Gv8H}WN87S*pKw(giRqvA2VU)qN`&XTArwMqjuMo< zs(GY^aH5%K?NYQ0LgWa(Z6D*^hYHKy2eXA>&cCCVlrFJBS15GXcO==G{+kni{FX;< z9rRGbFPn8Vx(wKIDf_(MORn}E@N10HDU4ICxI$ZVvjDbj-8Z|wzc2v_982VatnekK z_qSD;&`c14!rem8cmPObpyvds4G+7A`=D_NH`p}A@L+Ui>`i+jzU|A;Vq9D%0Dk9T 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 E0NYU)r2qf` literal 0 HcmV?d00001 From 51786b07da99a126a5a8552e088585b5865eae16 Mon Sep 17 00:00:00 2001 From: allenhe888 <363857596@qq.com> Date: Mon, 16 May 2022 22:44:18 +0800 Subject: [PATCH 02/25] modify README.md and Project Docs --- README.md | 80 +++++++++++++++--- docs/JaxFeatures.md | 55 +++++++++--- ...4\344\270\232\347\256\241\347\220\206.png" | Bin 0 -> 27335 bytes ...5\345\214\205\347\256\241\347\220\206.png" | Bin 0 -> 22284 bytes ...6\346\236\266\347\256\241\347\220\206.png" | Bin 0 -> 40894 bytes ...6\346\213\275\347\274\226\350\276\221.png" | Bin 52766 -> 325292 bytes ...7\345\255\220\347\256\241\347\220\206.png" | Bin 0 -> 79646 bytes ...6\347\276\244\347\256\241\347\220\206.png" | Bin 0 -> 26599 bytes 8 files changed, 113 insertions(+), 22 deletions(-) create mode 100644 "docs/images/\346\211\271\344\275\234\344\270\232\347\256\241\347\220\206.png" create mode 100644 "docs/images/\346\213\223\345\261\225\345\214\205\347\256\241\347\220\206.png" create mode 100644 "docs/images/\346\241\206\346\236\266\347\256\241\347\220\206.png" create mode 100644 "docs/images/\347\256\227\345\255\220\347\256\241\347\220\206.png" create mode 100644 "docs/images/\351\233\206\347\276\244\347\256\241\347\220\206.png" diff --git a/README.md b/README.md index 04ce8dc..cba5bbb 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,12 @@ # Introduction 简介 -Jax 擎创数据团队研发并开源的数据中台项目, 提供可拖拽的流批作业开发, 作业调度和作业监控, 集群配置和集群管理, 算子包管理等功能; +JAX项目由**擎创数据团队**研发并开源的数据中台项目, 帮助企业构建数据中台,提供数据集成、数据处理、数据开发、作业管理等数据服务; + +JAX提供可拖拽的流批作业开发,可以轻松实现实时和离线的数据清洗、指标计算、数据探索等功能; + +JAX是一款轻量级的数据平台,JAX本身并不强制与某种数据存储、计算框架绑定,也不与数据仓库、数据湖绑定,JAX更多的是构建一层数据抽象层,将企业中纷繁复杂的大数据基础设施统一起来,用户可以以平滑的方式将既有的数据存储和计算资源与JAX配合工作。JAX也有能力对接多种多样的数据库,例如关系型数据库、数据仓库、时序数据库、文档数据库等。也支持用户可选择不同类型的计算资源, 既可用选Hadoop, 也可以使用Kubernetes提供计算资源。 -Jax 项目为搭建数据中台/数据应用开发平台的搭建, 提供了一个轻量级的解决方案; # Features 功能 @@ -46,38 +49,91 @@ Jax项目手动编译, 可在Window/Linux/Unix 准备好如下命令 - yarn/yarnpkg - vue-cli - dos2unix +- make - docker-compose ### Download 预编译版下载 -### Compile 编译项目 -##### Package +### Compile & Package 编译打包 + + +cd 到jax的根目录, 使用make 命令编译和打包出整个jax-all-1.0.0-xxx.tar.gz安装包(位于其tmp目录下); + +make package-all主要包括: +- mvn clean package -DskipTests 后端编译打包 +- yarn install && yarn build 前端编译打包 +- wget flink-xx.tgz && tar -zxf flink-xx.tgz 下载并解压安装flink/spark + ```sh -$ make package-all +cd jax + +make package-all + +tar -xvf tmp/jax-all-*.tar.gz -C /opt/jax + ``` -##### Docker +编译打包注意点: +- 如果make package-all失败, 可用尝试分别对后端项目(mvn clean package )和 前端项目(cd jax-ui && yarnpkg install & yarnpkg build) 进行编译测试, 确认环境没问题; +- make packag-all中使用 ./mvnw 第一次执行时可能很慢(在下载maven/wrapper包), 需耐心等待,不宜打断; +- 编译中若遇到报错,可参考 [常见问题列表](https://datasalon.yuque.com/staff-dg3tgh/pg6cpg/uem0ig) + + +### Deploy 项目部署 + +项目启动前, 需要确保Hadoop已安装好; + +解压jax-all-xxx.tar.gz 项目后, 直接执行其 start.sh脚本即可启动JAX项目, 如见到打印: Jax Application is Ready, 则一般项目启动成功; +```sh +$ ./start.sh -requirements +# 项目启动成功, 由如下打印 + _ _ |_ _ _|_. ___ _ | _ +| | |\/|_)(_| | |_\ |_)||_|_\ + / | + 3.1.2 +Jax Application is Ready ``` -node/npm/yarn -wget -docker/docker compose + +如果项目启动成功, 默认jax-web访问端口是9999, 访问 http://{hostname}:9999 即可; + +如果没有此打印,或者 9999端口未开,则可能项目启动失败, 具体原因详解 logs/jax-web.error.log 排查; +- 一般启动失败是 jax/application.yml中配置缺失或配错导致; +- 注意其中 jax.home, MySQL的DB和账号密码; + + +##### 开启Debug + +```sh +export JAX_WEB_DEBUG_PORT=45000 ``` +在start.sh 脚本中,若JAX_WEB_DEBUG_PORT存在则会增加jvm debug参数, 方便进行远程Debug和调试; -With flink 1.9 standalone cluster: +### Docker镜像和运行 + +提前确认相关环境命令: +- node/npm/yarn +- mvn/make +- docker/docker-compose + + +默认安装的flink计算引擎是1.9.1版本,并会启1个Flink Standalone模式容器, 命令如下: + +With flink 1.9 standalone cluster: ```sh $ make image $ docker-compose up ``` + + With flink 1.12 standalone cluster: ```sh @@ -86,7 +142,7 @@ $ FLINK_IMAGE=flink:1.12.3-scala_2.11 docker-compose up ``` -### Deploy 项目部署 + # Documents diff --git a/docs/JaxFeatures.md b/docs/JaxFeatures.md index 4ee7079..52f7ba3 100644 --- a/docs/JaxFeatures.md +++ b/docs/JaxFeatures.md @@ -1,8 +1,8 @@ # Jax 功能模块介绍 -## 作业管理 +## 1.作业管理 -#### 流作业开发和管理 +#### 1.1 流作业开发和管理 流作业模块: 提供基于Flink算子的流任务编排和启停管理 ![流pipeline管理](images/流作业pipeline.png) @@ -10,22 +10,57 @@ 用户可在拖拽出3种不同算子(输入/输出/计算),构建自己的flink DAG计算逻辑; ![流算子编排](images/流作业拖拽编辑.png) +JAX的可视化编排能够提供用户直观的操作界面,用户得以轻松编排出作业。同时,可视化还提供强大的作业调试功能,用户可以在发布作业前进行调试,以确保逻辑的正确性。 +JAX的可视化编排与市面上的其他类似产品是有本质的区别。JAX编排形成的是一个单独的实时处理或离线处理作业。而许多其他产品中的DAG是表示一组作业的相互依赖关系,并通过DAG的描述关系,先后执行其中的作业,其中的作业可以是实时处理也可以是离线作业。 +所以JAX的可视化编排更像是给Apache Beam的披上了一层外衣(但JAX底层并不基于Apache Beam),而其他产品更像是Azkaban。可视化作业编排能够同时支持实时(Flink)处理和离线(Spark)处理 -#### 批作业开发和管理 +#### 1.2 批作业开发和管理 +与流作业管理类似, 提供基于Spark的批作业管理 - -## 算子管理 +![批作业管理](images/批作业管理.png) -#### 拓展包管理 -#### 算子列表: -## 系统管理 -#### 集群管理 -#### 框架管理 + +## 2. 算子管理 + +#### 2.1 拓展包管理 +![拓展包管理](images/拓展包管理.png) + +扩展包用于扩展可视化作业编排、SQL作业、机器学习工作台中的算子。可使用编译自带的 + +用户可以通过编写Java或Python代码,实现自定义的算子。JAX能通过扩展包管理功能识别这些算子,从而在上述功能中直接使用。 + +有了扩展包的支持,可以说JAX平台的能力得以无限扩展。用户只需要编写算子的核心的处理代码,无需开发前端的表单,JAX能够自动识别参数,并转化为表单。 + + +#### 2.2 算子列表: + +![算子管理](images/算子管理.png) +算子管理模块主要展示[拓展包管理]中加载的各算子详情; + + + +## 3. 系统管理 + +#### 3.1 框架管理 + +![框架管理](images/框架管理.png) +关键管理用于定义Flink或Spark计算框架的基础配置和环境变量; +框架管理提供类似模块的功能, 将自带的flink/spark安装包结合默认参数提供给用户开箱即用; +用户可根据自身需要参考框架模板,配置自定义的 flink/spark计算引擎和相关参数; + + +#### 3.2 集群管理 +![集群管理](images/集群管理.png) +集群是JAX运行作业的基础设施。集群管理是JAX对接企业中已有的数据平台的基本方法。借此,JAX得以将作业运行在企业已有的数据平台上。 + +集群管理支持对接常见的大数据平台(Hadoop、CDH、TDH、Fusioninsight、Kubernetes等)。作为轻量级平台,JAX不对集群本身做复杂的管理,仅提供基本的信息展示 + + diff --git "a/docs/images/\346\211\271\344\275\234\344\270\232\347\256\241\347\220\206.png" "b/docs/images/\346\211\271\344\275\234\344\270\232\347\256\241\347\220\206.png" new file mode 100644 index 0000000000000000000000000000000000000000..fc6f0f276affb34258155b043218007544276507 GIT binary patch literal 27335 zcmdqJcT|&EzdwpE?}$p%u>eAdz7}Q%0YwEQKrA!H2IycxX)-hw2%(0SM28X;Aqpd? zl&C03M_K}b1QP`TDT35ALW>acgdRfL?{U;~?m6$df82G~z3cvN7B0x%``ORl-~Fwh z?{|CWtOG)G-PUy~Dk_>MPyG73ii#RqMP=2*n$=*-RmXq2fWKCS{*E}RQrclK34Zyf z-x2#GDk`rD>N3wC!0&5OCoYGosQeiA<=-lfFEmm`<%a9YUyq!RbQiMK2fV{E!%=?3 z!FFFibi_zN>fp}(-Y0GcHw^~wt`v;@X`BK(p4{~D@IS*=#ce%5a`PV_e@nZ4&*s{R zq%}Qu|9qqVFO!gs4{loM=pCjU)2^!O(HsgRvD?|mt)C~BxGTidy@&EU3Yab;X84pm zHiuv2Msiy0`3g~O@G6-Y08Vx!Ev)SodDI6;{7XHabY=|=9-cH`F6g?>?Kc3gn9IG zt2n(ZjTwBwYId_ovw!-%1AoLkh4PC{R`wa;ntlVZh@KC8aBvu$?}Vqxlp9@4H9Y6{ zZMT^joRKX#h677I7+acrdPdeUPp3k$J8dEbG;Q7+nifw1Ul#+2WHBBjAF#!5`iI^41nsjZwM0U}p)(6aCn zaxGlxC{hoS<}NqpXm{F4UHvfO*umt2B}w7A26tiT!v?D3baB}-_lQ#TdXkAN6Q|U1 zjee`nxP&zdd!aPZSi$tvwtH+Lwyh}p@_cA^`7QphX1L4~G(SNOqa!rJCpINBM?{ap zw7E=ieR`^uecYM;@tOW;#NxrTm0A@3qDc{o(j77xKQ9)z70^3YUNz_RdyNCOw#);gWK-jFs$#OG7zdQQ%E)*30=pb4mP zN4#5xtc=%k8f$GMUM5tWKE6K|?>6ty;EnfXJ8;OyDuRBhAj8y7!{TsZVQaLDH9F9jUB}- zmhe}kkJI@%r`0Nyi$DXfU)eh`ld232UFJ>XGY)cNZDPl&@Tt#)uSJ6!`nZ*ruGn6n zd?X7&kJE-ju>1=y3^VzZHUnCJ(5{@%n9m+RW6f$O=6Wvn9bt#2mMO)Fj&8N4u4yJD zfL3yS=*zJsa*f!xoZ8n{ETNA!cX2HxqU7Sbeo@tQKffxdT;~Fg^hqgp#+vAqI$d@o z)>T$$ZB3*!`1qI%i7Fzw-b zx4EIPUAT_v%kuQGYaF%?b(@WHTqm9%!Od_pe-i5##O-Lk^$vmyhpFrj#(USW=2F^t zFnyz5re5s1HDcP1c)Ybz+1TnpED^m?r&qctoFbQNxI$Mky(3MT(h&&H*fUzoCpsvI zaz7cc3?DM zJ=FzTXtapAQ8AyLk?;_WH7Tx_&dmthx$UNFJ-LaF3HhRx$`{LgR*wsH3*8pCC1<4! zYHu2Y<$4Y7YCDbgL&<(>QsZpR;l}>4#>MgTCME3(Uls^m!$aTn+d@%H{Vn zV>M>G+SYW!GZk=YLinKFdOPc|gR6`S$;(=@)50N7*o+op9d`v9eMLqmOftCX8FWYiH z;{*YA;~Q;f&#ZBbxT~a@VKaQDKH6@#Asd@04w0lS3-$Plwj3eb`*M^W^A<()O#kS> z+_RZ95pJ7Jgm|s$3W4`}(J0YPUva<&+j+;cGp~mcDvj9P=3L{Hr|0Qbg9@Q0v8(m%fJMrF@thTGqNsNCGLm-WSrf}d-v z{@-f6r4vvmrfxf#y7Sx56QTQzli9N0k<=lUnUZdNpt-js^m})@S0W|#iU<4f*?A|n zb;h@6t{?Ix8y770YX0*e{C}UpH6C~hf;RmdPexK)S*|5wgN5U%2Tp~n9%*+B7r1^S z$cym-tR6s}R4y-;^USaZZDuDuP7Yxw$`T3n6a6>Jj88HO_1E0M7P|1ilhC9&J&Y`E zjlo{S&DGs5eJsp}8An_e&c_XA0? zU?m@8S!K1WRcBB~pLRdBP)LF}ma?BXGHK-K+}$>ASvD#ra*rN2!X_fd>SdVZ5+iYF zUT5GhwWem=L^_HSGi8?4FbU`CS-3?x2z_!FDhL?kVp`M%tLGCHO$y>eUR^jk(G21g zI(SqnRA(fkxq2P2;^;vHBLg7scb%zO=3C;O%-o=*Fu_b~c+=-c#*CqZmlDx^ZWc(j ztgX~AK@(~;-=UP|%AQ*N=M&;oU+s6^YiyPL@yYej2p$2P%I2Q>N~9L1IaPx{UCuFnE-WH)@*BC+l6A} zwpWq@WcKNAOj2c#Ifb&s%0dk2eVTqr?*y9&Z`99xYOm9_5Qf-f>cs8g zWAy8nA^<@f)Fi9FR(TMlOPXN=>>&?0$GcaSAIIKIv+O{{N-kQi|0Fw4>hLRC$X(Ir zB2sZ#`zPR^A6HF7|Iyo^z0*hJM74OT`I4z_FPIC>R>zk$Pgm<%Gk>nm$ZvbRlAnCy zD-o_#fv#AIe$z#l3(JucI*Lzlb*NJAp{{I(pK@%T9~}=TB?%R6s`L~m1(rObt@ND4 z>U{bXQ72A(+mh0q2q~EK*~sGlnZmL^tyWKp?{Oc}2MjTaYzzW#C@X-a=DKQ|vTCl> zV}uVXM=zpZ1RC5&vUD#tl!YjMh5YDH7v|-R8^6qJobm~B-;88N`jLm*$LF;b0}nlW z@s2-bTZX6`0)`J`4}{HM6%UNv<}mG)A7{F$ZRtVbs&9T1npno$69TmTY2i`J@BO>y z?V_4TJw>GmdR`{=$COv@xU2aIr-9EhQu(tU%Z|-TJ^5ni2XRap>5K=!zw1 zwtgF-EBl(!)TTsAaF-;H3;RV9Dt^z-$XcKB6J}bpmiMPifD9hbZ`i^2#cUOM;^ePE4o1#$L5ko20>zYZOh+(%74)ED5Io*Y+P);Ykk{Us}6 z{OKFy(5>dubtE=B>dd8_{SCR9F7E8ZsC}@JDPaqau-(QGDX)y=NIZo()5VJ(lN7~p zwCYg#l%MAUM$<1-Tyo)Cr=**XMJOWT=hJ+{t8ZPzkwyik+GMZLKO z_nY@h`>MPSTu-tCb?;EFI`^Tp2{$X?^`%Y0>m&;0LJ`l_Oyp(>oV_UXwjpK7Z{o4r!4 zp`N?ksLa?i^CrA|baR~;GA!G{-fl!vqs)RNWX5XGG@*Lcv|CcNOtB&qrxoQUL|FMH z&&z4a4~cCrR2{VVZnS*?S9+oV#BvH-mGHTEqbdgpa{4<#JW7~84X3DCD>2RU9j?$N zU%$XQ*@u-}*EEN5s`df!++zuRlrh*zX|P>jq>pVVN?s9Ch#RC zpUT%nt0U-r4VK;+MyhqwV(F%oVSBFQFKw;LRZg*c2BnUR@=~euyuiXPU6Fez2JR=H zT(Ip#kqX8nQ@T<5JEQDkm>LoxB8_8;%MKuK3A}?D(H{DvN?lV1D<4|p>P$q!{KX)x%tAy?pFwi8%n!M?$ZiSX zgzx@r52aYRiXV@N*-Mrmo8d-;YOxz#GV0*qf%A;K!23LQCy^4D@&OVthBQB4s)6>1 zy6C(a+F6nyvNaqMFa!=%b5@OKsIzkMXDmGUbdmlV(<|BBRg#b8+E~Gdjwn1nsn5?( zqxz7m959Rb@3;LiqJ(B6)g3>Fr}!nFM#`C}mg`3Gaa_!?fmHjn(Q!3mwq}MHsg+SL zjh|`G$8L8G1{J>Xp-_*3g?IA|67)6>aP?svkiDRmmea_h{9x%g1Y7z(3ULdOp=vtjr~N zVlgZl3Obd4OG)>FO9c;U^Dh!GcO$05Zm$h$sx$r|Zb6*Nv};5$qec_kc}@F!2pPydhfa|yiaygmAZ)fEV=ssvzNE)a#Wo$l$pO3BnwWC56FP zB44%hDBM=5nlLT0q6yHMDLp$(Ug(UY$WX7V%>Xp$6QX{bu#Q8uk@P|ll$Hv zOJ|76fPq*R*M2oQ=^!inyilu)tQx@(^8T87u%5R313vY8X#F+5=n}^C_ln^=#u9EY;gzLQPY?j>tiMQpw75EfQN78EHt4r zV%mAU#u4*h#<_3w)#}4D%vEf(7XPQyc0}vBp-v%YK=(pJkuY$1XnvDfW%) zvSQh*y(-ggCUR?I+10!ks#+%#Z~MjC8tUoepU=)6qu&)IpT-k> za*nDQ#&|l<=A6snN@D0u`i_;9IM zn`q!embzr%7bRlWZYbZC+`faEmPgry&6~tLA_jx~jpq6u!C%T!a4Xl*)p!FGSBWz8XpJ1`j7B zjfY%(Kl@-SRUs{NvJE5~e~oEPE=n;VOMA#%xic0QEm;j>GI5=evd=6X2pwCeI&kt6 zaK=9UPR+STAFXY&q9<3%Cjl5e!)_V4g~&ci0IeXq1+MJa|J7oI{DH6+BmEFv( zWfzJs;Cs~d0C#8x11B0Mc$jLSiGv2Fcc8Cbb%DeN zDV<~c<0X!UrPj*RM2AC|8u>wb6vy=$MEb9?mho^|E->%5RqO#?;rKc#Te=-W7Hb z5mOW85$qLIplp87Z;1*cy_l~YW4Li^VZXohp#)&1$oMY?wI8BjC}Uo1JML!<~;mMACR zwGcfp!*ESBO(3#g%BHZpA@>&5(@bj(9MgJx3Ol)|WT`@Qc_1T-f z8UAN2cCYj26l2CmHuLQpKWi1cMSuOYXE&}tcG5#F{bEKl53?O+d%m-@+)WT=tG(dn zGSLU7DIIHzkiZ^e$+gMYL&`k{O37mOc#sAOGoOxPw+k36;rfgfis(b)Gj(0Sw5i$L zG8 zurSz)-7mG4EH;g#YH@F#IhmXgkRtCux zQWkS6GMfiDk25I2=hZODK1$u|^#Vs6*`)+Gkgqtdi;BQY<*I{u%w3%rG+Wc-5~vbO zEM&po!p_H^T+8hRcqs4?gR1 zO*rL3PtInRC|6ohsG4F`F720MYbCvWZX}dTsLN)vwGB{Zc=9 z5O0b55N6P=wG}W#MMkpq3G2*Ca)QW|r=Th75vlX~!Y$*y>f$;B$S(B`o@Ayhn{wH& zR6AyLGjUL7NlO=KBA^{?P%+o7vd-ItkVIZjjmO33bb-9ySU&RQRI_=%o8LY#j;#C? z8Q1ZKmM?vBjSTx2gZ-N^h6ue><8~H(0PX4a5MRyczp$eH@wn%AC0YG!mp;&>5P3)z zQSC9>zqq+W0FJa-iCG?_DG_XDz0wl*I@DbhgZA2}iIzsBYe|>ihar5)1!~dR!|}eIt?4+Lq;BJzd3U=)S4fpC7?z0>4H=Y@MN%=c4;^g zAYc^LsSa*`x9YmVap=X+%O3WGpj)av%euQIx`Id;gMH_VTBI=;Z)m*|CCF=X1i)Eu zYAuYXFFLLz+DKWbw?Uf94tAV!m^Cxm9a!0<2TTOk+Qz=9%2MzEgu*vQVj;Oo&JDwI zE4Jjc7|~l5zEcTRExBxqD6RyE}&^W718yee)bTD9i`})*78EQ91nL} zwCsLBIaa8JMqt~eYAWB{*iSCqJS4|O*`7ql$!E%TXQ1&E(K3wJ4PWNg^@CvjO7Bbq zT4wh08InV0uz_>N3E7$NAZhQipWE{{6B&lRFB_iWcndmSq4IU9VPyL4dR~ zb7s-xt3AFxogP4rS!i?LlrnX`9?Tp_brK*@MJ;OdoYH?enW*dqBp!#R{TK}(L964~ z16B-nSibN4xw?0rNaO&jhEiD_lpheSC}(OzfC+?Nzv1;XVL;j7_AKR|ICQDukDLW+ z65|5e8+s_Vxth0(bD_#UJF++QH9zCME_1}!Z`6!zh61~x`k47b)UP)3RuC48Y?(M&naKVFSQ5@-F!$qNUKtR~^O0E{#Kjj5` z&eFKG-|!o#G2F>WohAo{$M55k9CP73n#8J#)Eu08bRNwz4V*#f0@ebMhHT?=RI zWM=0YJ_dsss0s!dtF4G$*sGrg=PpSq>22;aD=3)+y*rM5!H5q{ial?&*lji3upb0r zpXUDI0d>EiTW%=l1tnBxkC#R}vcsjYnE?<7)h)NWDZ-Qc(I= z(1BKpAE25ZbzUH5hZe~e1$}rXH7d|*G&y)MkurZC#ECv$=|TggYq*?l_=4~*mj)ZI zuLtgvV{im~HGfNDX*Fh7al4`G%D}~V7wAdHj777eV6r}J3X(t!3I_4}%E70r`r{d8 z({kT2<`?*-38M#CJPcC%B+sn?B?N`Np81>?o=Ov02B5>rJSr7NP{2azRiW4&i}?n& zZKZ%YH|6MdvvshJVkn>(&%~94DPD@Kell2~>lkG~mc<^MkajE3Pg)_T8|G>1M5&x; z%;wLuBDNnJVEsC`*v5MlE!Xd#D`t4;CQ=e|!*rg;91z{#kx(=~*Bo(DmathEy)&S0 zF>z)x&0$SG*LnnD&aXr0o4JPzVkd4GP{)(4Wrg*Azm3)hjT5}Q860$Xvu)kGNT~nm zgG?2SAa^qD*C!yG>FMrdq*X+Z|`qD3Hn`HrM zX?3jxB@W_bV4IQEr@3>4DYe>%)R<|mwi%Xp1S8J(1o7ULxs~#z2^Y{8U-~#xnDNQY z$TnoD21ecNAZ^IY4b@&7v@-9{C?xO^3pEX4WEg<{hj!o*h8qHK0JAY)*b61DLY8NMQv8WC;qZO_seLe~s*Rwx4%`0u%B~kLY0YE{FvSvuuVfjd+xa76rpMbHo)M zQ!dm4m*h(YysG`3Cul*=UY9J_yH+_YA0_|MtC?-8olkoiGU(Ewsk1ACz1|LUbiCr- zs~Frt!ppLa^hq5Po>%4{|0SRGToXM%0$MVqksg3u)K-$H<0pTwuDkVg0zr7yp zc=4ogzPC;gxsBJ*~;k zTsO`{swKvBIRqp%Ki`Ed!GLA zKR*BeY~xjMC1O``Eox8j0_Z2}&xq#^C%0 zn33+44P2O!!Ac4`+}hYxc_PBMrH8lF+0+KZOs|xiz`pPN8WzMT72Aq!rjvQQ%tQ+r zq?gC~)o2@1lJa5M_0g$3paV5{a?spy<#^<)+4|LvrE7`rp*^1Y@jc3DA1g}NJ9M~V zkGzQfV9+b}-5tM&rf}(93LThnCM!M!EW1qIL&?L9dwd98MnJ3K#;^43IyJwaC4a-G z7gZjam?Xiov#N!6#lDR89{M7|$S?Ui2+$LL`m-koLHHvqzh-g9uwJHO%Hxd@|{XNezYY7Xp`ro9bu|6}2hZK!waCK9p zO&uMF5^^K7VaCNae7C`I(K;g8)1EAk=>^s?mo{h2^HA-MBdG`oumuni%GNNg`NfoF zH=bsY2^Il-|e7F651*Sn>s00kn{PgLATiNyWk1?z+jHbq)!f> zqrA3av14LHuh_~+h8OQyP*$oNN4h+I1zu|>Yo3lkxWBFrZTf=7i{(wyq`vG7H^1%K zm$Ke}3A?v)*5lsjN%^&xecEUdr5ODQIZX~?Z8AMWrPTDez;%Eq z3otDzY2KW{WY#*|a3m|tDwu{_f?#0yHX+5r>KJTs$vW|QAP6N+NaAL&EkKtN!w2j= zUC?BTc`>NvhArvAEt9dg-S)5l_O>epYzDhIXq}NCqpd!23;=rb6S$F*2fU5AOe{Ar zi0pDna*e}5FB)!jP;&ZsU<7&iAbg1Q`87)Zco4CN(DS(8PrP|EQ1+>{ycEWgqsV)) z^$VK(_+x23l4i%UDZ@Jf|4BN42UPlZ?{M}Vbs^Te^;{8o+%v~H5whh18#|>@|7a6yzy=@>kE852>u{390K&$h+LK`Xp zcj6rxea#A}3kri{t@MD4_Y|)`6vWi2GLJEW#^N}2JirqXLGu^)@)r|ZY!d|OR5;09 z9Gsp=seM9l=0rGINy|nN2mDH`cE#8r5=Sp?>JWv=Yo;x}iu+;X>R7Tqy-qN)t;%xQ zz=l;~@RI4>1ByS$I#zRD{P;BP15;82S(;KwZ=HA0ph@P$iAnzW{2r?iOG~<#zl7nN zew}Nt*%dg;KG~Wjgg-wRG3z#op5G#5>nKTkv%n1Y1ph*cO!%{_nBXX&aGOfW#?u|? zT~7O1kWsJ4f}HP4&o+G!MWRl;;e$MOe4`c`wy2#I10O|{I&U-t@TuUJ)tWjoP*m^r36+)UmD9wD{u z2Gzyt(2sgwmwm0s$ASf!ajRmBirlWflm4WEzQj6jSknj6&ep|2%#VCA8QiOZQqx4k zgn_cEiq*2O0G0T7Z81($s7!chBs@|TNxu!_{2-~{3_IvWnaA1Fv>bW zf9_mQcsQ--+cvL37;M%kIw8rQDvgkpt`Qh^rXNZs_-Hxe12aK8a>4GR!E9eR19i_^aYBaI6nN6_c3lJ$(OHL zanO~hdB=?E?-*hDbqznSW)oBtOYfe_T}Z`-pXUDrTuw#Qf6 zm0k~@o82Bex3GQ*XwUgZCTANkz6|IuU9T9wwOy8mds-mg-vEcs(ASqP-&lI_bz_Yq zds*3+X0LVQ!q0l@7W^hE%J6oy`?};aL>^#sH;#>)ZCg}*Ke8eJ%Hi-%FMhoyxAWq+ zRiDWKhggf8u=lFkZNWcBRRl}3M##sQut2VBQ z@5c%sjE!~lGEe0*I@IWQW*6>4Jl&!llG(f|^}GEojzMerob0T9&k^+67R(}&1o%%* z0;7Y_@9gIMFCi2twKX!Be^$g;n)V)ig6i1U93R@}YlI)b_TuUL_@yll;YbXy?`2Q! zU6QoxLIdKw8}K~yB@ZdKX3~3MN%?A;@q+KHT3%m`B~vicC#Xey%Gzcyuk=cvxI3=b z%WhL?DN(T{z%ji?|DVloW_}_G{K(86NTd7A;S;_TFs1d-jr84Tyg6P1VxGIZ-%R66 z>#Ps`E`D^bP|Jnn0kJ!;yFULI?+J6WzwST{j?9#P9vf*4XP5Jk<{BL-UCDJBeAU5# z+VHl*2O57;;y7Stu0_5X!2SFm3;cD$o9tpFKQVC*UpRg%pgz#zGi3R7=Q$+;4q|J& zowj*R`Dn@nk%uA@|Q_`Fs8k z-%DJt-l+ni#)Xe9;c@J#W>cM){hewR!MaRHhZY3zWiaXCiJIuqaYlOWwj^6tyEQso z^qvJo4GvdFenLiLEwTc)ZtDL@I|#3djzQ=X$<`24v$fw9Yx)Tap28&I4+f*I=zhpU zyi3OyxoILk>}K@KEFKd441LHhZon`PseC|nA`LLuvD;kqhPU7g-{nSl@v$Yc2kpH_ zf=MG{;e?oIa0lj1W};t+e%$x1JQrNM>^=L8LE~=K!G+JPZt+OpMT402Z{ zPQC3H5Jh(3{Odm{^r0DrKJ(7g-|lvamN(`2p%BYoGy*g6l=1B|&mS+LEF<2idb*8* zjs^@V!ftbIs00f;J38-K-xIn8HG?@XrO)Z6ZN3$R}D?rK>BzH1nMVZFCV-?&^ARF_(B6 zI$3}IKV>3xAIm;5pS>!;8Z2MD5;cP&`GM{T$NULcawhu?e!~(J!Qe51k2{F`mrbE3 zeA{$+;EvG>Q@#H9_!?|HEFWo_ZE%K-CQ7s?Wg#r z_%F3q*X-5a3^xCAX?0B+ShFi^h4$MV_tHv6)PU#+u(#SNBn%0j=fd32m_4Cb?#2sp z4(B)TZ;n>ukJsf7C_U!wJJ4dv584JX#|Al155Pid%7B>Kl^PhL;;*?%?B0S$6<7G~iiqI%6Z13c)-i(*&4?IKZ8ya3wT@cwTFemhTI zxtC)jxYu3$uO%5=X~Y}sueX_&&%^C~b)GaV<;aY9wcM!dYiKg<(*h)yNqFVf8I=N_ zY07T5@Ama7E?UfNtGtVo7*BqzuVQ$X8JE!_qg5E}DDPo%m`(rJ-7CW8X2&nT%k)Td zJ8UeI5F`3rcsrhqmSg{I;KCh30tZz-ube#~+&59&fJjoEqqje1k2nuGIx5+??ktg&DNOIrx8T9Wqe|W?cldr_H>vu>1vsK{Y{ClZCw}te)b#O z(-zM|QuMxuz2;y>7WrM@l%M%Zov)AW*$6&XV*uJDL(Fd17;(0hYCqPXKZ1}Ua&^lxW6J@FO53^b?^zw+1Vl96WarITirhX4s zLNLa`dKk0(k?kp1!qan%a@KW%*B>KHRrV&0#DvForij?Hwgz9``kTRoK?J8}CfnXI z-j7&W_QZE~af64^?4tSXO_HaTZiX1zF}T&8GNLGcvg*Z_*9%bu!PVh9Hzb1{`NGd& zO`oQEZ^y{WJwdqZ>?<}u%z$q1UbB%0kAknN<${U8<+{fw7^uC6 z{^&o8UR?*jtdpD$?f|md`VVwYYd@bn(rn$7i&MF|bVtOSZTNe6M`W+u5Yy%<%h7kr zGVdJFQ0pQ5VZmZ6!~5Pm4X1#le$v^rnMUe7M^Wi=n6jqi?jXdXdr4Q?BJivkBqjy&l6+3_`!VmysDUWXrz;P5`eiiMZ#m`^AB0d zY?n$WdxDW2a0DK-61uCC*T~O9HP}s#>igTObop6>6;Sb^F#R?ocj;O3^z$%=q)Qzg zUqq8$8%TxLN=FflaLWK~Bdm3UEY8wq%aS(FB+*`slhV(GpZ=LX0s<&UEX<&y4kq_h>E&qYJ~BFWNifF$v?l zNg{=T(BD<+L(bH;QCDrc(z2mc93NAemaCmm)Gf^ffoYqR*)k9KeTdJ~$F^{`&!(KX z*Lwm$6x??5Y%TVwtKN_=JXDA|Xrnliv1`P>%6Kn})V*>m-9Ko>rP7&IVG)W3w zteF{7H(Ud&>^ZaBu5;rc==Nn=mo;=?rUzG?<>SVN>Vl=j@^NW+#s&S^x)zKbq_oX} zNL#F3zht+$!_3|9L`$F{yT=y8&W*z+PWHV=q1V}isx3BZda~UAEf2|FFXk8tKrfU@ zn6vVw1e>&@NY=#xugu>YYi~!mG(A1yJzMbrPkDGGFf<%dy2K5d{fRYHc&u-1<>9K& zH+}xX<&Dhjmxr?Ecl- z=-kNcer#Yorgz7qiHhglGl%T_jB65#{7^sI&I)|N{L|##h|a$JqjR^R?f94Pwg>V$ z2e*;0wTXM$^usd-i)`P9&0}xtV!FFa%ATC%@XEK~MY8oJT9=Q7{2Isr^V-an+`zW}60NI(()l3~93l#P zTKA@m2i&gqCA;kRW|IVy+ZpV9Mrk(!s;#eRIt~j#7pHn6sUOI)>3!$z3Ztr);(L{W zj_s1(;|(0|WdENDEPFh1@z@6{7;T=}qqQ!EG4zbVPMMp#D<=M8wxgjwXjqaxZ9V(? zlSbsc;5_~gc-d-kb@j_;XM;Z`j*Zuigj$D@GmGFA2cu$piPgSQsy+-((_)ucH%U-l zZ+Xv~Ux9q*j#9wxKcxd*(cOF|{LcNypG2|+S!VuuK_MQ?a+56AW$yr>Jdt{p9p$vJ2!>-zj8_p9Ly8?(H0^(kgP#g)2zw<)9A~4l*JDY9BF&4dg3yZRq!7Oqw|yYd%T+*wsXlimGOT?G^+5t- zBw7s%wa`6pfPKd3_;ATEdS~#fLsR0;JO*=Qea%kj6Ana)>uR)uzSshY0V}dF8-M~$ z0&)6fyQ5b6zv!ryJ{;H72hvk4N?A3cFt*&j1@vTI>H@yUKAC7LL$*QggW>W#FQC(z zTdS|eh#{WFlV^iBseNb}Ej&kd2-dZ^Ms~4nMGqY`XJsF4DL()m*+Te~JkH?o86E8j z%mbR|5cl^`Vx$W{F+YO5aBQN(E2^BghJ7-H)h-Q^(vNk90n%qijE9maL5>C-jF_5r z(B=C2{m-?~m7dHeF~=bv-fj0aIMKv&RVWAN)~(9sy(V_2iRw-ogU`d)@A9 z1i?s`=NTjStHu1WxsJJ1Wtm>z(&}gEMA0TSmKS(i$S1567i9jI&{h$4!sU?L6(k#F zX}aGoeW5}W))yE84evY+TAjib-IY)B;+ChDIJ+seE|s>HKe=rryGF}L z#(SBUK=bx2#QLgz`U6)E{EVro7pMhf&fW8K(jxigQ*DoOmJJ-ee@>)a9^c_s#6PHs z2ICWM7~9$A$x>}OAe}_jiq^0}&Tm?W5LtkQ^v!4GgL#)hzvG8KNW}z$xdLX$!m0xX zuIS405Mx_tr%55%k;G2BjewBiUN&}O5NO`3GsTLyWJ9}tn{uCroCX>^{p^O@)hLvu z#Gp@Z=+zLXZ( z<ce&x$M4JBn_Q*mW)C0U?bg?he^x)fWw)w2SOD5g&p@ZeN>s5IqO_T*>9VOf)0=<02a%TF3sB*dTMcgNuB8{n&_^SG0x(k-m%HYm*rV>rr)ETQ7LdnFw za3Xik=MI&4kU|6kTL~XgI?gFuWbO(U!}B-4V-nC_^|^wCTPnL1msQZR8mvByP}4NQ ze?l)HYl>S{$WcGpuzAQ3$}OmB1IPv|{E6KA`Nnp%jf0?~9}#~7CEobhCn~|t)Pq#> z0|a{${#FaOK92(Ty%6qjUh)D*YW+f;#)zCEWF8Jxisb%R;9dv z)4bp8$mo?q&{Wr-S$#X}vHJSG$dYE$@zrRmlf^JziAKftK4@xT|?ws(IpTKW8jVRzoCxSrIo z&rG;(3G~qxwK_Ry9#v|}r>Ua1LQ4sXghe$tgK^q4o`;kvOM&v5D9|bQ97QiRF^w2~ zo`ynAPc?0{;FESNXsv3Mbv>nD%*~ChK+`-iHZSUtz8TbMHaA`HC55|BM@frlq&z|Z zKz>uTHv)(lSFNj>Smj^OIZ9x)o6LeLzB0eflp9pvIZ|=Mv6;We)C>-{BY+o3^p&(a z)9$v_c6fI4ZF@zN3p6a}*41mOy7N7Hj?9gviAmKw5W|=+~Jl9#EnZDLX8* z8SGy}+{aI_HzelUBgQToyP3g8ENH|LG|&VW8+xSk0PGh_@&VXeYEGWM0q(X4MSHm; z)Tw3utZPKiHqui4Na%ona3W=}B^AsS)OL5C6+g1r)piP(IJcPEd`WDe(seLfJeNHC&uK8pQpV+1%uj{YJV@PvMkffUS%KbWA8B;(Ke@Q7_~M*SAz+Ms2}eFQUIYwc z;NCrr=7(q#q7N-95r3`nv&a%c3NkevFY%8tohARPoof$EGTrvIJ84syGrOrYQ=6>R z%u8BY;w7gUttl>?>pc58&vW)U&+zcq2Ym0xde^(&wSMdOds~>wp$M+1r%~8jGyt<6Gt*{hs0duY-^Mv3fFbSzGv@Ubg1DfGp&KxEWPM4_2=j> z)*p3W&Cxa9)TH+#WfzkYe9YPD;k(h3fWEK&MVYuj54qbn+Pyk*zNrkPf-S(lZyo}^ zU%ubAvdu&joby4{pL8Z7Wz7*98A;bTscxikmdgb8`)!*9+c}SYxLtcKT-B@X8J&By z->gp{_we=ph<7P*vtwajHw~S2 z7g;6QvP{<)ZwOoAwdwtg9=$kwTa_JN;@W7~CTAux?*U*Pt&0>gl#qNO`J zZeYWrF+EbvIjs=jj#_MBhbaa6VS)b%VgYcs|3v`iUqpV`gcz60N*TB8#FG6PZ>5v7 z;7>O5AKa|I@ra^&7Yq99-PDl_(mMoIF3jTPOe(G;63U#q&?kO-f?>SmiR&=(a@+!} zbR}l8`Y80f4hOFPR_6^6^C`GhGJtS}#NhlQ(VYA4hy6lyS9=pEz_}EBHnM($NrO`b zvC?5AR+lcYKZ+@0>PJnREh#?|C%pF+V5?I%i{Bg= z#egcRn+ivlnr$>C3<>Zq+25tHNhE(k+V!bq1Rre=u+ z^S|JWjSHye0>T*R&s_mlyNyelwY~in3N#ZsW|r;IHrpr?BvHBcudiR_MOSGca`vwH z-6ghHV|CB#;n>Ve#Tj>8=HDj4f9Eg}!X*6Rlw567l1H;N+~wl}!k9E{VW@Xo+wnXB zHE94n1lFH|TTc1gY_!<)JH_?hpv2a9&bA{aPLS}LIlA{tZ|_P_==-6~R*QYJC8^&v zu%oTMehBP#0J8j<5M#MyapWgOZg#J2`tHsP>KMz*>$}jNU^EPQG1|#~@oCN#NXZ1dO?HzZ zw50)d&uma{alvJm-wH}xZcGlNeZlAj%>4{+5xm~-!zLI{JMjW6rxYZ(3hJP|Iiy|N4=5kV#Lt(8r?=ORIY0 z=>@?#0J>gOAnu@?9=x!KkuNdzU%XW(faU{>d*Nl;IS0@J)%8;WKIrFn?qjI;*qKTq zLg=t~Y3rf%SE87)a;UZpXs;c)bbUh;`gDuzGc1sYLp$~ zcIR6Xt?AD)yNll6vRFfZXyrbpo%xm?d*_%#N9Ou(X|Ucm{!JfgCuK-50wh}aaHJ7S zp2J_e4yKdlP6+>}H4_)C;*|>ELYZvkpkT5^5MsDvz}hS)g0aZXl~hRbC$HMn{8TeE z?{U)4g@$(YBi2jYJsdo{KuNU zq>7nKkVpKd{o>N*F2e606m!t~!`AL1t&jJUx4y#mKus=5L*MeROn2O6Zj4zQPCvIk zKRkPlF-NUXz?;Z|6jmR>RpgnXNzFymH8V4?HT@gB^aw>15=;@-pnNhEip)>A(D04SggI3CYtE7fMU%i1}A zl+pq_VbAU^wn?g)h@!330a<%)JCvT0kKVTvR?y9P?oIk#VckQEU#GfeJFzC~!_+!u zombnvKL)Jbhhp&_0DT(r2+Ih)i9QF`%3sY2E>S(pyKBROdUuTD1A@Ny@Ow`04}XYD z_#vCzPcG|L)NZM&5hJe8N-Wu&4yo*n5P zmES%+mlq!b4wF~y%5D&lTAc{I!h$$I>($^pxP)P4yNNnUZA2pGH95XW8d`>xgjN;= zNaoo#qzH_n-9*LSgKi7KF%^3pjL2cRx4+I3pygHm++l4=rD5+T{iLck2kKk*``PVi zhR0Du*xzpk<)yuV{q0>)9z;}&t!CftJzjekJD>*TUgGHd8hPNwWfBl(dScNfM>t#> z4ajVTW9ZOArnM2vjH%ahl*`-!95?a=UtCztzdaEHl%trH=&n8QA8mbgcioI*w*c9K zh@!)?Px2ygHLBcjojPTrS0RkJD;1}rqDs@}-58Q;0zX3YIWBoXS^Tkr=9fk9R~C)Q z0AXDP?)o&o0^RYl7KIyDc9G_>jdQ710}dVi^zu}wj2DnX&KZ*{#Pl<<)#7wr%ft6~ zdwmXChT&sCHG^?d-m#Hy%T%1vpINn!Y{wjIL6^`q5n_#dmkgej4;_zReUmrCK@63i z0XWAoZf(xA`x-`vQg(-pf=->mN@qUS+A+TCVh6uuFn-{Hvm(x(MEIXPiclR-7w)FO zApN(kYXnhe9zpL72fb^yWNrtRA{>sm2FZe%_?{xeo_V$*QKZa)pjy73YDG9cKf-4F zsJ!ksX5#!Zd?n13z1@`_MzZ%DP~-bL%FEM+<1ZKSJ4D=Ek556#7wRY-<_~=_ld9WEFHjZhW5OQGS>=1uqb$&&r<&_w>iKbz?WceC!-a z>zf~MJDC3RbM#+p?bE<+eNryIBWh!NmK;Gm(Xp+wUL^qC5eUP6_oR;(d}xe}L}-^dUUZAqhvN)! z74z;eNAAH} zcc?O9zx;S~1J1+G`S^GmI?|wuq|kVInJvgT9*|?q@fQd#1NspwKM`txVLdMQ5SIwr z^T(h!1=c@@fc#x&xN+*vC@(v|8ZZL%qS)%AhEQmSsc*k82x8!mR70)KRc7!jjiCmk zpo`%d2UEIRcQBV7YMj^ZiPyVH5yfw-70U@B)l9=ZY4(@6dxq}N*&FnDS<(l^Q`LaM z*s_D;vFUD&{HE!e^g2i>$po0^sEHjBE@RBw@yl!gYaLS!R-kprLp3$w_78hQ#^+oc z*b2#sO)WEOq3=X<0)nESS42BM9xow3ugEkZfkpA-c}@{Cu_jo0m0w(~SzzksP{rqc z-L0=s13`#GK*cT_l0>Vjh*N#?4M8&JK!i)ML%6ALY8oWuVJx92{Fq@9t~m0fB1Y8g z!Tu94P?=WB94e-V!|l10eA4rZ z8VW@79q*NJ59{-qBXoLQ%PsjDd97Kl-ks(j;&O65NI!HDb}{|jVn!@q6_Agz6Vfho;? zXy2s7UX5p3F2kd@9-@BiCZKcVdf>j`cQa3?)l9tDViTs#ltKzw*BjoZW-4>|<0^9> zqm#c%jd;f|^83?d{(5={YyD2mzTu#8$tvdUN8;ABG{^>E*C|uP=#* z#xXG$LU=vmZKjK1r?+(|0@A3_J%IUnB$?={V~v$l9L*v-+uKAszeS_-l74%ye;^v$ z+F>=V0iRP;Vo1mKy{?7O>*=? zlAe2z*nLHjSKq4fl8vlO0GhG%M92G@CR}cmTRql4Ev+Q{X(W2gR}I!iNLW%&{IOv9i2?lS~YTmo=o)k>oR)JTq?EwAP*d{(Uz$dTGMMjwPD z%DX>){PQIFY~T%BrY&NOxfM%=-oubvQUxaL%0T>5BlL(1?K~kJP{o-72C*vTP>b26H>yUp%m%W=&(8D!Mu70+Q7vu9J45Z zf}k-aGob+TjU*V)>*fk0*FkJ#@C?Y|9{MXd&Ql2g0TSYhdsol1M(ReRHC=ZD*-_|X zcC+g-!7DFBJ?ihq`oR8|2TyqE?)!!-V_3dlr3_hmjpi=inzL{?64>R`oxP^$Q3UD z;r$9Eyx-Bl{@Wr5;(z+Dp%zb+{_hyjg4+wxJ?%S8lumun zCoi}Nv;sdlhd)qw<}@0dTRXaR;-xbnJvczWT&qCQA$|^}1dEe`-YQh7f-3Vsq@Gav|+X(uI2s^f9NfeDr=FBQp?c>&1ZmEJur(lJ~#^ zPiuW~&7I473=j{5G(J{Oa*I``pX{6JD@`l_Nqshvf?fFQ)mrA4oz~sLUmWvI z+{U=KVKJM%bp>mH2(dqMMFt0EnOOviolPug2x8Yov6~NYxq140mJN$9zZD9MH}-h( z$Ceg%ul`v{dAUiKbz;+>Gx{-1ot-ZTx^}tk8z>63$Slr7R($G0Smni^teQ*C|30{%miwzKEPSEk0HsJi9r4f>u z+B!kdluAxAC)luD^^i3+p|`>oX3RqR&1jq3?&a#9kU;97!dq;B!}2C$fq^qQqZhVsVaZ>K0q9DfB7p@brEUUfjO~A;kU914@}FIXi`z)b*3jn* z83}c6aTj2$3m^Y=5%B203<4Md=q3E+4F6A^Ax8rty`j>Vmu%G@vcJ5*pjmS0 MSGQkY|LlM5AKTI!1ONa4 literal 0 HcmV?d00001 diff --git "a/docs/images/\346\213\223\345\261\225\345\214\205\347\256\241\347\220\206.png" "b/docs/images/\346\213\223\345\261\225\345\214\205\347\256\241\347\220\206.png" new file mode 100644 index 0000000000000000000000000000000000000000..f28af3ece24564f723ea67b4d19cfb8c8340ce8b GIT binary patch literal 22284 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 B?HvFB literal 0 HcmV?d00001 diff --git "a/docs/images/\346\265\201\344\275\234\344\270\232\346\213\226\346\213\275\347\274\226\350\276\221.png" "b/docs/images/\346\265\201\344\275\234\344\270\232\346\213\226\346\213\275\347\274\226\350\276\221.png" index 8bb54b53dd2f54a9e7147817ca52bc1a4aaec86c..25db071af35dac9bdc5d1bad850d3f064ec2e411 100644 GIT binary patch literal 325292 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

    <|PJC9wLOwdKL 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

    gO0X^OCLg9-eBk3=?Er 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 literal 52766 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

    YG(^l6*KBg5!_V^(*4Laj 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%0Dk9T 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 E0NYU)r2qf` diff --git "a/docs/images/\347\256\227\345\255\220\347\256\241\347\220\206.png" "b/docs/images/\347\256\227\345\255\220\347\256\241\347\220\206.png" new file mode 100644 index 0000000000000000000000000000000000000000..91627a0750730ebfe5b46a41565dd1b64aa9db14 GIT binary patch literal 79646 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 =H2cp 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
    1. xiTKHpGFEb%g$%Dxc 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

      hB?^4_KU^gEgS?FB3GaS~k$t3JqLE?HPPL8Zw}A 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 P?D&vfVLNMf#IpVe#QT?% literal 0 HcmV?d00001 diff --git "a/docs/images/\351\233\206\347\276\244\347\256\241\347\220\206.png" "b/docs/images/\351\233\206\347\276\244\347\256\241\347\220\206.png" new file mode 100644 index 0000000000000000000000000000000000000000..1fa839565c9a56dba301fcb6a5eb7491a58f7bcd GIT binary patch literal 26599 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 w5r*x*&~HO2WUM{`GqE- Date: Wed, 18 May 2022 15:20:15 +0800 Subject: [PATCH 03/25] [quickstart] add built-in 4 demo-pipelines and add zk/kafka at docker-compose - modify README.md and Project Docs - add network:jax for zk/kafka at docker-compose.yml - add tutorial project for prepare JAX demo pipeline - add demo cluster/jar/job/pipeline as build-in - modify stage-libs and jar_path @ table: tb_jar - enable set $JAX_HOME at Table: tb_jar - modify for checkstyle --- Makefile | 10 +- README.md | 22 +++- docker-compose.yml | 34 ++++++ jax-web/pom.xml | 47 -------- .../com/eoi/jax/web/common/util/Common.java | 11 ++ .../com/eoi/jax/web/dao/entity/TbJar.java | 9 ++ .../jax/web/model/manager/PipelineJar.java | 2 +- .../db/migration/mysql/V1.0.0__Baseline.sql | 109 +++++++++++++++++- pom.xml | 46 ++++++++ 9 files changed, 235 insertions(+), 55 deletions(-) diff --git a/Makefile b/Makefile index 499442f..33cd60c 100644 --- a/Makefile +++ b/Makefile @@ -45,8 +45,16 @@ unpack-flink: mkdir -p tmp && rm -f tmp/flink-1.12.3-bin-scala_2.11.tgz && wget -P tmp/ https://mirrors.huaweicloud.com/apache/flink/flink-1.12.3/flink-1.12.3-bin-scala_2.11.tgz rm -rf tmp/jax/flink-1.12.3 && tar -zxf tmp/flink-1.12.3-bin-scala_2.11.tgz -C tmp/jax && rm -f tmp/flink-1.12.3-bin-scala_2.11.tgz + +.PHONY: unpack-builtin-stages +unpack-builtin-stages: + mkdir -p /tmp/jax/builtin-stages && rm -rf /tmp/jax/builtin-stages + cp jax-flink-job-1_9/target/jax-flink-job-1_9-${JAX_VERSION}.jar tmp/jax/jax/jar_dir/ && mv tmp/jax/jax/jar_dir/jax-flink-job-1_9-${JAX_VERSION}.jar tmp/jax/jax/jar_dir/jax-flink-job-1_9_jars.jar + cp jax-flink-job/target/jax-flink-job-${JAX_VERSION}.jar tmp/jax/jax/jar_dir/ && mv tmp/jax/jax/jar_dir/jax-flink-job-${JAX_VERSION}.jar tmp/jax/jax/jar_dir/jax-flink-job_jars.jar + + .PHONY: package-all -package-all: unpack-jax unpack-flink +package-all: unpack-jax unpack-flink unpack-builtin-stages cd tmp && tar -zcf jax-all-${JAX_VERSION}-${DATE}-${COMMIT_ID}.tar.gz jax/ .PHONY: image diff --git a/README.md b/README.md index cba5bbb..38b5ff1 100644 --- a/README.md +++ b/README.md @@ -124,15 +124,27 @@ export JAX_WEB_DEBUG_PORT=45000 - docker/docker-compose -默认安装的flink计算引擎是1.9.1版本,并会启1个Flink Standalone模式容器, 命令如下: - -With flink 1.9 standalone cluster: +首先需要生成 jax docker镜像 ```sh -$ make image -$ docker-compose up +make image ``` +默认安装的flink计算引擎是1.9.1版本,并会启1个Flink Standalone模式容器, +本测试Docker Demo中会启1个Zookeeper/Kafka服务, 需要指定一个用于外网可访问的Kafka广播IP环境变量: $KAFKA_AD_IP +可先通过如下命令生成 KAFKA_AD_IP=宿主机IP变量, 再 docker-compose up 构建和启动 mysql,redis,kafka,jax等服务; + +```sh +export KAFKA_AD_IP=$(ip addr|grep "global ens"| tail -n1|awk '{print $2}'|awk -F"/" '{print $1}') +# 或者在命令行直接赋值环境变量: KAFKA_AD_IP +# export KAFKA_AD_IP=192.168.51.124 +echo $KAFKA_AD_IP +``` + +With flink 1.9 standalone cluster: +```sh +docker-compose up +``` With flink 1.12 standalone cluster: diff --git a/docker-compose.yml b/docker-compose.yml index afbdf04..e17f60a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -43,10 +43,44 @@ services: environment: MYSQL_ROOT_PASSWORD: my-secret-pw MYSQL_DATABASE: jax_db + ports: + - "23306:3306" networks: - jax volumes: - db-data:/var/lib/mysql + zookeeper: + image: wurstmeister/zookeeper + ports: + - "2181:2181" + networks: + - jax + kafka: + image: wurstmeister/kafka + depends_on: + - zookeeper + ports: + - "9092:9092" + environment: + KAFKA_ADVERTISED_HOST_NAME: ${KAFKA_AD_IP:-192.168.51.124} + KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092 + KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 + KAFKA_BROKER_ID: 1 + KAFKA_CREATE_TOPICS: sourceTopic:2:1,sinkTopic:2:1 + networks: + - jax + kafka-manager: + image: sheepkiller/kafka-manager + command: -Dpidfile.path=/dev/null + depends_on: + - zookeeper + - kafka + ports: + - "9000:9000" + environment: + ZK_HOSTS: zookeeper:2181 + networks: + - jax networks: jax: diff --git a/jax-web/pom.xml b/jax-web/pom.xml index daace4a..9c74a41 100644 --- a/jax-web/pom.xml +++ b/jax-web/pom.xml @@ -213,51 +213,4 @@ - - - - dev_skip - - - dev_skip - - false - - - - - - com.mycila - license-maven-plugin - - true - - - - org.apache.maven.plugins - maven-checkstyle-plugin - - true - - - - org.apache.maven.plugins - maven-enforcer-plugin - - true - - - - org.apache.maven.plugins - maven-javadoc-plugin - - true - - - - - - - - \ No newline at end of file diff --git a/jax-web/src/main/java/com/eoi/jax/web/common/util/Common.java b/jax-web/src/main/java/com/eoi/jax/web/common/util/Common.java index 8043bed..29564d2 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/common/util/Common.java +++ b/jax-web/src/main/java/com/eoi/jax/web/common/util/Common.java @@ -17,6 +17,7 @@ import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.resource.ClassPathResource; import cn.hutool.core.util.StrUtil; +import com.eoi.jax.web.common.config.ConfigLoader; import java.io.File; import java.nio.file.Path; @@ -29,6 +30,8 @@ import java.util.function.Predicate; public class Common { + public static final String VAR_JAX_HOME = "${JAX_HOME}"; + private Common() { // forbid init instance } @@ -114,4 +117,12 @@ public static byte[] readClassPathResource(String path, ClassLoader loader) { ClassPathResource resource = new ClassPathResource(path, loader); return resource.readBytes(); } + + public static String replaceJaxHomeAsPath(String var) { + var = StrUtil.replace(var, + VAR_JAX_HOME, + ConfigLoader.load().jax.getHome()); + return Paths.get(var).toString(); + } + } diff --git a/jax-web/src/main/java/com/eoi/jax/web/dao/entity/TbJar.java b/jax-web/src/main/java/com/eoi/jax/web/dao/entity/TbJar.java index ecaacb1..3ca1281 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/dao/entity/TbJar.java +++ b/jax-web/src/main/java/com/eoi/jax/web/dao/entity/TbJar.java @@ -17,6 +17,8 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.eoi.jax.web.common.util.Common; +import org.springframework.beans.BeanUtils; @TableName("tb_jar") public class TbJar { @@ -163,4 +165,11 @@ public String getJobType() { public void setJobType(String jobType) { this.jobType = jobType; } + + public TbJar cloneFromDB() { + TbJar clone = new TbJar(); + BeanUtils.copyProperties(this,clone); + clone.setJarPath(Common.replaceJaxHomeAsPath(getJarPath())); + return clone; + } } diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/manager/PipelineJar.java b/jax-web/src/main/java/com/eoi/jax/web/model/manager/PipelineJar.java index 364ada1..749d15d 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/manager/PipelineJar.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/manager/PipelineJar.java @@ -22,7 +22,7 @@ public class PipelineJar { private TbCluster cluster; public PipelineJar(TbJar jar, TbCluster cluster) { - this.jar = jar; + this.jar = jar.cloneFromDB(); this.cluster = cluster; } diff --git a/jax-web/src/main/resources/db/migration/mysql/V1.0.0__Baseline.sql b/jax-web/src/main/resources/db/migration/mysql/V1.0.0__Baseline.sql index 3d53695..79414c5 100644 --- a/jax-web/src/main/resources/db/migration/mysql/V1.0.0__Baseline.sql +++ b/jax-web/src/main/resources/db/migration/mysql/V1.0.0__Baseline.sql @@ -397,6 +397,10 @@ CREATE TABLE `tb_user` ( PRIMARY KEY (`user_account`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- ---------------------------- +-- Insert Flink and Spark Base Framework +-- ---------------------------- BEGIN; INSERT INTO `tb_opts_flink`(flink_opts_name, opts_description, entry_jar, entry_class, job_lib, home, version, yarn_queue, parallelism, time_characteristic, backend, rocks_db_path, savepoint_uri, checkpoint_uri, checkpoint_interval, min_idle_state_retention_time, max_idle_state_retention_time, yarn_task_manager_num, yarn_slots, yarn_job_manager_memory, yarn_task_manager_memory, disable_operator_chaining, other_start_args, create_time, create_by, update_time, update_by) VALUES ('flink_standalone_opts', null, '\$\{JAX_HOME\}/jax/jar_lib/jax-flink-entry.jar', 'com.eoi.jax.flink_entry.FlinkMainEntry', '\$\{JAX_HOME\}/jax/jar_lib/flink', '\$\{JAX_HOME\}/flink', '1.9.1', null, '1', 'processing', 'rocksdb', 'file://\$\{JAX_HOME\}/flink/rocksdb', 'file://\$\{JAX_HOME\}/flink/savepoint', 'file://\$\{JAX_HOME\}/flink/checkpoint', '300000', '12', '24', '1', '1', '4096', '2048', b'0', '[]', '1605916800000', null, '1605916800000', null), @@ -406,4 +410,107 @@ INSERT INTO `tb_opts_flink`(flink_opts_name, opts_description, entry_jar, entry_ INSERT INTO `tb_opts_spark`(spark_opts_name, opts_description, entry_jar, entry_class, job_lib, home, version, yarn_queue, driver_memory, executor_memory, driver_cores, executor_cores, num_executors, conf_list, other_start_args, create_time, create_by, update_time, update_by) VALUES ('spark_standalone_opts', null, '\$\{JAX_HOME\}/jax/jar_lib/jax-spark-entry.jar', 'com.eoi.jax.spark_entry.SparkMainEntry', '\$\{JAX_HOME\}/jax/jar_lib/spark', '\$\{JAX_HOME\}/spark', '2.4.1', null, '2048M', '2048M', '1', '1', '2', '[]', '[]', '1605916800000', null, '1605916800000', null), ('spark_yarn_opts', null, '\$\{JAX_HOME\}/jax/jar_lib/jax-spark-entry.jar', 'com.eoi.jax.spark_entry.SparkMainEntry', '\$\{JAX_HOME\}/jax/jar_lib/spark', '\$\{JAX_HOME\}/spark', '2.4.1', null, '2048M', '2048M', '1', '1', '2', '[\"spark.yarn.submit.waitAppCompletion=false\",\"spark.yarn.dist.archives=file:\$\{JAX_HOME\}/python/jax-algorithm.tar.gz#jax-algorithm\",\"spark.yarn.appMasterEnv.PYSPARK_PYTHON=\$\{PYTHON_ENV\}/bin/python\",\"spark.yarn.appMasterEnv.PYTHONPATH=jax-algorithm\",\"spark.executorEnv.PYTHONPATH=jax-algorithm\",\"spark.executorEnv.MKL_NUM_THREADS=1\",\"spark.executorEnv.OPENBLAS_NUM_THREADS=1\",\"spark.yarn.appMasterEnv.LANG=en_US.UTF-8\",\"spark.executorEnv.LANG=en_US.UTF-8\"]', '[]', '1605916800000', null, '1605916800000', null); -COMMIT; \ No newline at end of file +COMMIT; + + +-- ---------------------------- +-- Prepare 4 Tutorial pipeline base Flink-Standalone Cluster +-- ---------------------------- +BEGIN; +INSERT INTO `tb_opts_flink`(flink_opts_name, opts_description, entry_jar, entry_class, job_lib, home, version, yarn_queue, parallelism, time_characteristic, backend, rocks_db_path, savepoint_uri, checkpoint_uri, checkpoint_interval, min_idle_state_retention_time, max_idle_state_retention_time, yarn_task_manager_num, yarn_slots, yarn_job_manager_memory, yarn_task_manager_memory, disable_operator_chaining, other_start_args, create_time, create_by, update_time, update_by) VALUES +('flink_19_standalone', null, '\$\{JAX_HOME\}/jax/jar_lib/jax-flink-entry.jar', 'com.eoi.jax.flink_entry.FlinkMainEntry', '\$\{JAX_HOME\}/jax/jar_lib/flink', '\$\{JAX_HOME\}/flink', '1.9.1', null, '1', 'processing', 'rocksdb', 'file:///tmp/flink/rocksdb', 'file:///tmp/flink/savepoint', 'file:///tmp/flink/checkpoint', '300000', '12', '24', '1', '1', '4096', '2048', b'0', '[]', '1605916800000', null, '1605916800000', null); + +INSERT INTO `tb_cluster` (cluster_name,cluster_type,cluster_description,hadoop_home,hdfs_server,yarn_web_url,flink_server,flink_web_url,spark_server,spark_web_url,spark_history_server,python_env,principal,keytab,timeout_ms,default_flink_cluster,default_spark_cluster,flink_opts_name,spark_opts_name,create_time,create_by,update_time,update_by) VALUES + ('flink_19_standalone_cluster','flink_standalone','','','','','jobmanager:8081','http://jobmanager:8081','','',NULL,'/home/python_venv','','',100000,1,0,'flink_19_standalone','',1652881476250,NULL,1652881476250,NULL); + +-- ---------------------------- +-- Jar and Stages (Job) +-- ---------------------------- +INSERT INTO `tb_jar` VALUES ('flink-job_jars', '', 'jar', '${JAX_HOME}/jax/jar_dir/jax-flink-job_jars.jar', '', '1.0.0', 'jax-flink-job-1.0.0', '[[\"*\"]]', '1653021763360', null, '1653021763360', null); +INSERT INTO `tb_jar` VALUES ('flink-job-1_9_jars', '', 'jar', '${JAX_HOME}/jax/jar_dir/jax-flink-job-1_9_jars.jar', '', '1.0.0', 'jax-flink-job-1_9-1.0.0', '[[\"~> 1.9\"]]', '1653021733765', null, '1653021733765', null); + +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.AddFieldsJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.AddFieldsJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"AddFieldsJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"字段处理\",\"display\":\"列操作新增\",\"description\":\"根据aviator表达式计算新增列\",\"doc\":\"AddFieldsJob.md\",\"icon\":\"AddFieldsJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"fields\",\"label\":\"新增字段\",\"type\":[\"LIST\"],\"description\":\"新增字段操作定义列表,按顺序执行\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":{\"apiVersion\":0,\"name\":null,\"label\":null,\"type\":[\"OBJECT\"],\"description\":null,\"optional\":false,\"defaultValue\":null,\"placeholder\":null,\"candidates\":null,\"inputType\":null,\"range\":null,\"regex\":null,\"order\":0,\"requireCondition\":null,\"availableCondition\":null,\"listParameter\":null,\"objectParameters\":[{\"apiVersion\":2,\"name\":\"key\",\"label\":\"输出字段\",\"type\":[\"STRING\"],\"description\":\"指定输出字段\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"keyIsExp\",\"label\":\"是否用表达式计算输出字段\",\"type\":[\"BOOL\"],\"description\":\"如果为true,则key作为aviator表达式进行计算得出输出字段名\",\"optional\":true,\"defaultValue\":\"false\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"expression\",\"label\":\"aviator表达式\",\"type\":[\"STRING\"],\"description\":\"aviator表达式\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"AVIATOR_SCRIPT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"fallback\",\"label\":\"出错填充\",\"type\":[\"STRING\"],\"description\":\"如果执行表达式错误,用该值代替\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"isReplace\",\"label\":\"是否覆盖\",\"type\":[\"BOOL\"],\"description\":\"如果添加的字段已存在,是否覆盖原先的值\",\"optional\":true,\"defaultValue\":\"false\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]},\"objectParameters\":null}]}}', 'process', '', 0x2320E58897E6938DE4BD9CE6B7BBE58AA00A0AE58F82E695B0E8AFB4E6988E0A0A2D206669656C6473EFBC9A20E58897E6938DE4BD9CE5AE9AE4B989E58897E8A1A80A0A232320E6B7BBE58AA0E68896E69BBFE68DA2E58897E6938DE4BD9C0A0AE58F82E695B0E5A682E4B88BEFBC9A0A0A6060600A7B0A2020226669656C647322203A205B207B0A20202020226B657922203A20226E6577436F6C31222C0A202020202265787072657373696F6E22203A202276616C7565202A2032220A20207D2C207B0A20202020226B657922203A20226E6577436F6C32222C0A202020202265787072657373696F6E22203A2022312F30222C0A202020202266616C6C6261636B22203A202264656661756C742076616C7565220A20207D2C207B0A20202020226B657922203A20226E6577436F6C31222C0A202020202265787072657373696F6E22203A20222374696D65220A20207D2C207B0A20202020226B657922203A202276616C7565222C0A202020202265787072657373696F6E22203A202276616C7565202B20313030222C0A202020202269735265706C61636522203A20747275650A20207D2C207B0A20202020226B657922203A20222027762D27202B2076616C7565222C0A20202020226B6579497345787022203A20747275652C0A202020202265787072657373696F6E22203A202276616C7565202B20313030222C0A202020202269735265706C61636522203A20747275650A20207D205D0A7D0A6060600A0AE8BE93E585A5E5A682E4B88BEFBC9A0A0A6060600A7B0A202022686F737422203A202261222C0A20202274696D6522203A2022323032302D31312D32322031323A30303A3030222C0A20202276616C756522203A20310A7D0A7B0A202022686F737422203A202262222C0A20202274696D6522203A2022323032302D31312D32322031323A30303A3031222C0A20202276616C756522203A20320A7D0A6060600A0AE8BE93E587BAE79A84E695B0E68DAEE5A682E4B88BEFBC9A0A0A6060600A7B226E6577436F6C32223A2264656661756C742076616C7565222C226E6577436F6C31223A322C22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A3130312C22762D313031223A3230317D0A7B226E6577436F6C32223A2264656661756C742076616C7565222C226E6577436F6C31223A342C22686F7374223A2262222C22762D313032223A3230322C2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A3130327D0A6060600A0A232320E9809AE8BF87E58685E7BDAEE587BDE695B0E8AEA1E7AE97E696B0E5A29EE79A84E58897E580BC0A0AE59CA861766961746F72E8A1A8E8BEBEE5BC8FE9878CEFBC8CE58685E7BDAEE4BA86656F69E6A8A1E59D97EFBC8CE585B6E4B8ADE69C896D6178EFBC8C6D696EEFBC8C617667EFBC8C73756DE696B9E6B395E58FAFE4BE9BE8B083E794A8EFBC8CE58F82E695B0E983BDE698AFE4B88DE5AE9AE58F82E695B0E58897E8A1A8E380820A0AE58F82E695B0E5A682E4B88BEFBC9A0A0A6060600A7B0A2020226669656C647322203A205B207B0A20202020226B657922203A20226D6178222C0A202020202265787072657373696F6E22203A2022656F692E6D61782876616C7565312C76616C7565322C76616C75653329220A20207D2C207B0A20202020226B657922203A20226D696E222C0A202020202265787072657373696F6E22203A2022656F692E6D696E2876616C7565312C76616C7565322C76616C75653329220A20207D2C207B0A20202020226B657922203A2022617667222C0A202020202265787072657373696F6E22203A2022656F692E6176672876616C7565312C76616C7565322C76616C75653329220A20207D2C207B0A20202020226B657922203A202273756D222C0A202020202265787072657373696F6E22203A2022656F692E73756D2876616C7565312C76616C7565322C76616C75653329220A20207D205D0A7D0A6060600A0AE8BE93E585A5E5A682E4B88BEFBC9A0A0A6060600A7B0A20202276616C756531223A20312C0A20202276616C756532222C2031302E392C0A20202276616C756533222C20382E392C0A202022686F7374222C20226831220A7D0A6060600A0AE8BE93E587BAE79A84E695B0E68DAEE5A682E4B88BEFBC9A0A0A6060600A7B226D696E223A312C22617667223A362E3933333333333333333333333333342C2276616C756532223A31302E392C2276616C756531223A312C226D6178223A31302E392C2276616C756533223A382E392C22686F7374223A226831222C2273756D223A32302E387D0A606060, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313630393330353230343936352220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22313938322220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3436392E3333333333332038352E333333333333433531362E3236363636372038352E333333333333203535342E363636363637203132332E373333333333203535342E363636363637203137302E3636363636374C3535342E363636363637203835332E333333333333433535342E363636363637203930302E323636363637203531362E323636363637203933382E363636363637203436392E333333333333203933382E3636363636374C38352E333333333333203933382E3636363636372038352E3333333333332038352E333333333333203436392E3333333333332038352E3333333333334D3137302E363636363637203432362E363636363637203137302E363636363637203539372E333333333333203436392E333333333333203539372E333333333333203436392E333333333333203432362E363636363637203137302E363636363637203432362E3636363636374D3137302E363636363637203638322E363636363637203137302E363636363637203835332E333333333333203436392E333333333333203835332E333333333333203436392E333333333333203638322E363636363637203137302E363636363637203638322E3636363636374D3137302E363636363637203137302E363636363637203137302E363636363637203334312E333333333333203436392E333333333333203334312E333333333333203436392E333333333333203137302E363636363637203137302E363636363637203137302E3636363636374D363430203436392E33333333333320373638203436392E33333333333320373638203334312E333333333333203835332E333333333333203334312E333333333333203835332E333333333333203436392E333333333333203938312E333333333333203436392E333333333333203938312E333333333333203535342E363636363637203835332E333333333333203535342E363636363637203835332E333333333333203638322E36363636363720373638203638322E36363636363720373638203535342E36363636363720363430203535342E36363636363720363430203436392E3333333333335A2220702D69643D2231393833223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.AviatorProcessJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.AviatorProcessJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]},{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"AviatorProcessJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"脚本处理\",\"display\":\"Aviator脚本处理\",\"description\":\"根据aviator表达式处理数据\",\"doc\":\"AviatorProcessJob.md\",\"icon\":\"AviatorProcessJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"script\",\"label\":\"aviator脚本\",\"type\":[\"STRING\"],\"description\":\"aviator脚本代码处理数据。可在脚本中直接引用Map的Key作为变量,脚本的最后一行为结果返回给引擎(不要分号,也可以通过return语法返回)。\\n如果最后以分号结束 或 最后一行为nil 表示返回null,视为丢弃这条记录(相当于过滤的功能);\\n可以用seq.map返回单个对象;或用数组seq.list返回多个对象;如果返回的不是Map类型结果,则统一使用 __result__ 字段来存储返回值;\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"AVIATOR_SCRIPT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"topLevel\",\"label\":\"使用顶层doc字段\",\"type\":[\"BOOL\"],\"description\":\"把数据Map放在doc字段下,表达式里需要通过 doc.{columnName} 来引用\",\"optional\":true,\"defaultValue\":\"false\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'process', '', 0x2320E6A0B9E68DAE61766961746F72E8A1A8E8BEBEE5BC8FE5A484E79086E695B0E68DAE0A0A2D2061766961746F72E8849AE69CACE4BBA3E7A081E5A484E79086E695B0E68DAEE38082E58FAFE59CA8E8849AE69CACE4B8ADE79BB4E68EA5E5BC95E794A84D6170E79A844B6579E4BD9CE4B8BAE58F98E9878FEFBC8CE5BC95E794A8E696B9E6B395E8AFB7E58F82E88083EFBC9A68747470733A2F2F7777772E79757175652E636F6D2F626F79616E2D6176666D6A2F61766961746F727363726970742F7567626D716D2368316A664E0A2D20E8849AE69CACE79A84E69C80E5908EE4B880E8A18CE4B8BAE7BB93E69E9CE8BF94E59B9EE7BB99E5BC95E6938EEFBC88E4B88DE99C80E8A681E58886E58FB7EFBC8CE4B99FE58FAFE4BBA5E9809AE8BF8772657475726EE8AFADE6B395E8BF94E59B9EEFBC8CE58F82E88083EFBC9A68747470733A2F2F7777772E79757175652E636F6D2F626F79616E2D6176666D6A2F61766961746F727363726970742F736764666B77EFBC89E380820A2D20E5A682E69E9CE69C80E5908EE4BBA5E58886E58FB7E7BB93E69D9F20E6889620E69C80E5908EE4B880E8A18CE4B8BA6E696C20E8A1A8E7A4BAE8BF94E59B9E6E756C6CEFBC8CE8A786E4B8BAE4B8A2E5BC83E8BF99E69DA1E8AEB0E5BD95EFBC88E79BB8E5BD93E4BA8EE8BF87E6BBA4E79A84E58A9FE883BDEFBC893B0A2D20E58FAFE4BBA5E794A87365712E6D6170E8BF94E59B9EE58D95E4B8AAE5AFB9E8B1A1EFBC9BE68896E794A8E695B0E7BB847365712E6C697374E8BF94E59B9EE5A49AE4B8AAE5AFB9E8B1A13B20E99B86E59088E7B1BBE59E8BE8AFADE6B395EFBC9A68747470733A2F2F7777772E79757175652E636F6D2F626F79616E2D6176666D6A2F61766961746F727363726970742F62616E33326D0A2D20E5A682E69E9CE8BF94E59B9EE79A84E4B88DE698AF4D6170E7B1BBE59E8BEFBC8CE58899E7BB9FE4B880E4BDBFE794A820605F5F726573756C745F5F6020E5AD97E6AEB5E69DA5E5AD98E582A8E8BF94E59B9EE580BCEFBC9B0A0A0A2D20E8BE93E587BAE68890E58A9FE5A484E79086E79A84E695B0E68DAEE588B020736C6F7420300A2D20E8BE93E587BAE5A484E79086E5BC82E5B8B8E79A84E695B0E68DAEE588B020736C6F742031EFBC8CE5B9B6E6B7BBE58AA06572726F725F6D7367E5AD97E6AEB5E8AFB4E6988EE5BC82E5B8B8E58E9FE59BA00A0A232320E4BDBFE794A8E6A0B7E4BE8B0A0AE58F82E695B0E8AFB4E6988E0A0A2D20736372697074EFBC9A2041766961746F72E8A1A8E8BEBEE5BC8F0A2D20746F704C6576656CEFBC9AE8AEBEE7BDAE74727565E697B6EFBC8CE68A8AE695B0E68DAE4D6170E694BEE59CA8646F63E5AD97E6AEB5E4B88BEFBC8CE8A1A8E8BEBEE5BC8FE9878CE99C80E8A681E9809AE8BF8720646F632E636F6C756D6E4E616D6520E69DA5E5BC95E794A80A0AE8BE93E585A5E695B0E68DAEEFBC9A0A0A6060600A20207B0A202020202276616C756532223A2031302E392C0A202020202276616C756531223A20312C0A202020202276616C756573223A205B0A202020202020322E342C0A202020202020332E362C0A202020202020342E380A202020205D2C0A202020202276616C756533223A20382E390A20207D0A20207B0A202020202276616C756532223A2031302E392C0A202020202276616C756531223A20312C0A202020202276616C756573223A205B0A202020202020322E340A202020205D2C0A202020202276616C756533223A20382E390A20207D0A6060600A0A23232320E6A0B7E4BE8B310AE8BF94E59B9E6D6170EFBC8CE5BC82E5B8B8E5A484E79086E8BF94E59B9EE588B0736C6F7420310A0A41766961746F72E8A1A8E8BEBEE5BC8F0A0A6060600A6C657420726573756C74203D2076616C7565735B315D202B2076616C756531202B2076616C7565322A76616C7565333B0A7365712E6D6170285C22726573756C745C222C20726573756C742C205C2276616C7565735C222C76616C7565732C5C2276616C7565315C222C76616C7565312C5C2276616C7565325C222C76616C7565322C5C2276616C7565335C222C76616C756533290A6060600A0AE8BE93E587BAEFBC88736C6F742030EFBC89EFBC9A0A0A6060600A7B22726573756C74223A3130312E36312C2276616C756532223A31302E392C2276616C756531223A312C2276616C756573223A5B322E342C332E362C342E385D2C2276616C756533223A382E397D0A6060600A0AE8BE93E587BAE5BC82E5B8B8EFBC88736C6F742031EFBC89EFBC9A0A0A6060600A7B226572726F725F6D7367223A22496E6465783A20312C2053697A653A2031222C2276616C756532223A31302E392C2276616C756531223A312C2276616C756573223A5B322E345D2C2276616C756533223A382E397D0A6060600A0A23232320E6A0B7E4BE8B320AE8BF94E59B9E4C6973743C4D61703E0A0A41766961746F72E8A1A8E8BEBEE5BC8F0A0A6060600A6C6574206C697374203D207365712E6C69737428293B0A666F72206920696E2076616C756573207B0A202020207365712E616464286C6973742C207365712E6D6170285C226974656D5C222C206929293B0A7D0A6C6973740A6060600A0AE8BE93E587BAEFBC88736C6F742030EFBC89EFBC9A0A0A6060600A7B226974656D223A322E347D0A7B226974656D223A332E367D0A7B226974656D223A342E387D0A7B226974656D223A322E347D0A6060600A0A23232320E6A0B7E4BE8B330A736372697074E7BC96E8AF91E99499E8AFAF0A0A41766961746F72E8A1A8E8BEBEE5BC8F0A0A6060600A6572726F72207363726970740A6060600A0AE4BBBBE58AA1E590AFE58AA8E5A4B1E8B4A5E380820A0A23232320E6A0B7E4BE8B340AE8BF94E59B9E76616C756573E5AD97E6AEB5E4B8BA4C6973743C446F75626C653EEFBC8CE6AF8FE4B8AA6974656DE698AF646F75626C65E695B0E580BCEFBC8CE9BB98E8AEA4E4BDBFE794A8605F5F726573756C745F5F60E5AD97E6AEB5E69DA5E5AD98E582A8E8BF94E59B9EE580BCEFBC9B0A0A41766961746F72E8A1A8E8BEBEE5BC8F0A0A6060600A76616C7565730A6060600A0AE8BE93E587BAEFBC88736C6F742030EFBC89EFBC9A0A0A6060600A7B225F5F726573756C745F5F223A322E347D0A7B225F5F726573756C745F5F223A332E367D0A7B225F5F726573756C745F5F223A342E387D0A7B225F5F726573756C745F5F223A322E347D0A6060600A0A23232320E6A0B7E4BE8B350AE8BF94E59B9E76616C756531E5AD97E6AEB5E4B8BA696E74E7B1BBE59E8BEFBC8CE9BB98E8AEA4E4BDBFE794A8605F5F726573756C745F5F60E5AD97E6AEB5E69DA5E5AD98E582A8E8BF94E59B9EE580BCEFBC9B0A0A41766961746F72E8A1A8E8BEBEE5BC8F0A0A6060600A76616C7565310A6060600A0AE8BE93E587BAEFBC88736C6F742030EFBC89EFBC9A0A0A6060600A7B225F5F726573756C745F5F223A317D0A7B225F5F726573756C745F5F223A317D0A6060600A0A23232320E6A0B7E4BE8B360AE8BF94E59B9E4D6170EFBC8CE4BDBFE794A8E58685E7BDAEE6A8A1E59D9760637573746F6D5F666E2E617660E79A84606D696E60E587BDE695B0E5A484E79086E695B0E68DAE0A0AE79BAEE5898DE69C8934E4B8AAE58685E7BDAEE587BDE695B0EFBC8CE58F82E695B0E4B8BAE695B0E580BCE7B1BBE59E8BEFBC8CE4B8AAE695B0E4B88DE5AE9AEFBC9A0A2D206D61780A2D206D696E0A2D206176670A2D2073756D0A0A41766961746F72E8A1A8E8BEBEE5BC8F0A0A6060600A6C657420656F69203D20726571756972652827637573746F6D5F666E2E617627293B0A7365712E6D6170285C226D696E5C222C20656F692E6D696E2876616C7565312C76616C7565322C76616C75653329290A6060600A0AE8BE93E587BAEFBC88736C6F742030EFBC89EFBC9A0A0A6060600A7B226D696E223A317D0A7B226D696E223A317D0A6060600A0A23232320E6A0B7E4BE8B370AE8BF94E59B9E6E696C20E6889620E69C80E5908EE4B880E58FA5E4BBA5E58886E58FB7E7BB93E5B0BEEFBC8CE8A1A8E7A4BAE6B2A1E69C89E8BE93E587BAE580BC0A0A41766961746F72E8A1A8E8BEBEE5BC8F0A0A6060600A6C657420656F69203D20726571756972652827637573746F6D5F666E2E617627293B0A7365712E6D6170285C226D696E5C222C20656F692E6D696E2876616C7565312C76616C7565322C76616C75653329293B202320E4BBA5E58886E58FB7E7BB93E5B0BEE8A1A8E7A4BAE8BF94E59B9E6E696C0A0AE688960A0A6E696C0A6060600A0AE8BE93E587BAEFBC88736C6F742030EFBC89EFBC9A0A0A6060600AE697A00A6060600A0A23232320E6A0B7E4BE8B38200AE8BF99E9878CE9809AE8BF87646F63E5AFB9E8B1A1E88EB7E58F96E68980E69C89E79A846B657973EFBC9BE4BE8BE5A682EFBC9AE58FAFE9809AE8BF87646F632E76616C756531E88EB7E58F9676616C756531E5AD97E6AEB5E79A84E580BCEFBC9B0A0A0AE58F82E695B00A6060600A7B0A20202273637269707422203A20227365712E6B65797328646F6329222C0A202022746F704C6576656C22203A2074727565202F2F20E68A8AE695B0E68DAE4D6170E694BEE59CA8646F63E5AD97E6AEB5E4B88BEFBC8CE8A1A8E8BEBEE5BC8FE9878CE99C80E8A681E9809AE8BF8720646F632E7B636F6C756D6E4E616D657D20E69DA5E5BC95E794A8EFBC9B0A7D0A6060600A0AE8BE93E587BAEFBC88736C6F742030EFBC89EFBC9A0A0A6060600A7B225F5F726573756C745F5F223A2276616C756532227D0A7B225F5F726573756C745F5F223A2276616C756531227D0A7B225F5F726573756C745F5F223A2276616C756573227D0A7B225F5F726573756C745F5F223A2276616C756533227D0A7B225F5F726573756C745F5F223A2276616C756532227D0A7B225F5F726573756C745F5F223A2276616C756531227D0A7B225F5F726573756C745F5F223A2276616C756573227D0A7B225F5F726573756C745F5F223A2276616C756533227D0A6060600A0A23232320E6A0B7E4BE8B39200AE8BF99E9878CE59CA8646F63E5AFB9E8B1A1E696B0E5A29E76616C756538E5AD97E6AEB5E7AD89E4BA8E76616C7565312B76616C756532EFBC8CE784B6E5908EE8BF94E59B9E646F630A0AE58F82E695B00A6060600A7B0A20202273637269707422203A2022646F632E76616C756538203D20646F632E76616C756531202B20646F632E76616C7565323B646F63222C0A202022746F704C6576656C22203A20747275650A7D0A6060600A0AE8BE93E587BAEFBC88736C6F742030EFBC89EFBC9A0A0A6060600A7B2276616C756532223A31302E392C2276616C756531223A312C2276616C756573223A5B322E342C332E362C342E385D2C2276616C756533223A382E392C2276616C756538223A31312E397D0A7B2276616C756532223A31302E392C2276616C756531223A312C2276616C756573223A5B322E345D2C2276616C756533223A382E392C2276616C756538223A31312E397D0A6060600A, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313631373837313432393839332220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22333239352220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D353132203531326D2D3338352E373332323636363636363636372030613338352E37333232363636363636363637203338352E37333232363636363636363637203020312030203737312E343634353333333333333333342030203338352E37333232363636363636363637203338352E373332323636363636363636372030203120302D3737312E3436343533333333333333333420305A222066696C6C3D22233735374630392220702D69643D2233323936223E3C2F706174683E3C7061746820643D224D3638302E3231373620343634632D31382E3136373436363636363636363636362032342E3636313333333333333333333333352D34352E31313537333333333333333333332034382E393938342D37352E343934342034352E3031333333333333333333333333352D382E3230393036363636363636363636372031312E343638382D31372E3339303933333333333333333333332032372E3436383739393939393939393939382D32372E3537313139393939393939393939372034362E303534346C2D32332E35353220372E3338313333333333333333333333336331392E3932353333333333333333333333342D33382E3831383133333333333333333333362034362E35353738363636363636363636372D38312E37353738363636363636363636362037352E30393333333333333333333333332D3131342E333830382D31322E33353632363636363636363636363720382E3034363933333333333333333333332D33322E36383236363636363636363636372032352E3333353436363636363636363636352D35302E33343636363636363636363636372034332E35363236363636363636363636372D31352E393438382D33332E32343538363636363636363636363420302E383730342D36342E30343236363636363636363636362032352E3231362D38372E35353139393939393939393939392D302E363939373333333333333333333333332031312E30373632363636363636363636363720342E323332353333333333333333333333352032312E3137313220372E3932373436363636363636363636372032362E3337363533333333333333333333342D302E363331343636363636363636363636362D392E3236373220302E343433373333333333333333333333332D32352E38313333333333333333333333333320372E3231303636363636363636363636372D34302E31353738363636363636363636372031332E3536382D31312E3432363133333333333333333333332032352E35393134363636363636363636372D31392E3635323236363636363636363636362033392E32383734363636363636363636372D32362E3834353836363636363636363636362D322E3233353733333333333333333333333620382E3039383133333333333333333333332D302E333332382031372E38303930363636363636363636363620322E323738342032332E38363737333333333333333333333420312E313836313333333333333333333333352D382E33383832363636363636363636363720362E313836363636363636363636363636352D32342E3236303236363636363636363636362031312E3937323236363636363636363636362D33302E3832323430303030303030303030322031372E30383337333333333333333333332D31312E3032353036363636363636363636372034322E3431303636363636363636363636342D31392E38342036392E343237322D31392E3337393139393939393939393939372D322E393631303636363636363636363636352031362E363134342D31312E3730373733333333333333333333342034332E3630353333333333333333333333342D32332E35303933333333333333333333332036302E33353632363636363636363636372D392E35343032363636363636363636363820362E3131383339393939393939393939392D32322E31353235333333333333333333333420392E373032342D33322E313739322031312E3431373620382E33313134363636363636363636363620322E333239362031372E36323133333333333333333333333220332E303132323636363636363636363636362032352E37333635333333333333333333333420322E343134393333333333333333333333613330372E3531353733333333333333333334203330372E35313537333333333333333333342030203020312D32302E3930363636363636363636363636362033372E35353532632D31322E34373537333333333333333333333220362E3935343636363636363636363636362D32382E3432343533333333333333333333332031302E3031383133333333333333333333332D33392E333231362031302E35383938363636363636363636363720372E36323032363636363636363636363720342E3030323133333333333333333333332032312E343935343636363636363636363720362E333233322032382E37333137333333333333333333333420342E3534383236363636363636363636377A206D2D33392E3530393333333333333333333333203135302E38333532632D302E3735303933333333333333333333333220302E3531322D3137312E3333323236363636363636363637203130382E313334342D3137312E3333323236363636363636363637203130382E313334346C2D302E3031373036363636363636363636363636372D302E303334313333333333333333333333333335632D32362E3537323739393939393939393939372031352E383436342D35382E323232393333333333333333333420392E3531343636363636363636363636372D37372E37323136303030303030303030312D392E3938342D32382E3138353539393939393939393939372D32382E3138353539393939393939393939372D32332E3236313836363636363636363636362D37352E39363337333333333333333333322031302E3732363339393939393939393939382D39372E39373937333333333333333333336C31392E34393836363636363636363636372032352E3031393733333333333333333333632D32392E3536373939393939393939393939382031352E3735323533333333333333333333342D31382E3130373733333333333333333333322036302E33383138363636363636363636362031352E3031383636363636363636363636362036302E33383138363636363636363636362032362E3334323420302034312E34353439333333333333333333332D33302E3139393436363636363636363636362032352E3632353630303030303030303030322D35312E323531323030303030303030303034203020302D3130362E30343337333333333333333333322D3133352E363238382D3133322E34383835333333333333333333322D3136382E38373436363636363636363636362D32372E3535343133333333333333333333332D33342E3634353333333333333333333332362D31372E35393537333333333333333333332D38312E30393232363636363636363636362032302E333030382D39392E323531326C3134392E36323334363636363636363636342D37362E35303938363636363636363636356136302E33353632363636363636363636372036302E33353632363636363636363636372030203020312036302E32363234203130332E37363533333333333333333333336C2D3134372E383635362038332E35343938363636363636363636372D31392E3532343236363636363636363636362D32352E313634386332392E353432342D31352E3738363636363636363636363636372031382E303232342D36302E33343737333333333333333333332D31352E3036313333333333333333333333322D36302E33343737333333333333333333332D32322E343334313333333333333333333320302D34342E3435383636363636363636363636362032372E3034323133333333333333333333322D32322E3935343636363636363636363636352035342E3534353036363636363636363637433338302E3539353230303030303030303033203439332E3832333939393939393939393936203438352E35303430303030303030303031203632372E34313333333333333333333334203438352E35303430303030303030303031203632372E343133333333333333333333346136332E31343636363636363636363636372036332E31343636363636363636363636372030203020312031342E3838323133333333333333333333342033382E3734393836363636363636363637733130342E37363337333333333333333333322D36362E3031333836363636363636363636203132302E39303032363636363636363636352D37362E333634386331362E3634383533333333333333333333332D31302E3638333733333333333333333333332031392E373337362D33302E38383231333333333333333333333620372E3439323236363636363636363636372D34352E3133323739393939393939393939366C2D372E3830382D392E366331302E383238382D312E333134313333333333333333333333342032312E3531323533333333333333333333342D342E3838313036363636363636363636362033312E393734342D31302E3631353436363636363636363636362032362E38383835333333333333333333332033322E3931333036363636363636363636362031342E3437323533333333333333333333332037322E38363631333333333333333333322D31322E3233363739393939393939393939392039302E33383530363636363636363636377A4D3431312E39383933333333333333333334203338342E38303231333333333333333333366136332E34343533333333333333333333332036332E34343533333333333333333333332030203020312032392E3237373836363636363636363636382035352E303931326C39372E34323530363636363636363636372D35352E3139333539393939393939393939366331352E323537362D382E373239362031372E3733323236363636363636363636342D32362E30313831333333333333333333332031312E3131383933333333333333333333332D33382E36363435333333333333333333332D372E3636323933333333333333333333332D31342E3638353836363636363636363636382D32342E363738342D31382E3535313436363636363636363636362D33372E3532393539393939393939393939352D31322E3536313036363636363636363636376C2D3130302E32393232363636363636363636362035312E3332373939393939393939393939367A206D3130382E30303634203138372E383138363636363636363636363763342E363834382D392E3233333036363636363636363636382031322E3736353836363636363636363636362D32352E3330313333333333333333333333322032302E3539303933333333333333333333322D34302E32353137333333333333333333336C2D36352E31363930363636363636363636372033382E31383636363636363636363636362031342E3430343236363636363636363636372031392E3736333139393939393939393939382033302E3137333836363636363636363636352D31372E36393831333333333333333333337A206D2D37342E373236342D34312E38333839333333333333333333336C31342E343132382031392E3736333139393939393939393939382039352E313239362D35352E3734383236363636363636363636362D31352E303031362D31392E33393632363636363636363636372D39342E353430382035352E33383133333333333333333333347A222066696C6C3D22233335333533352220702D69643D2233323937223E3C2F706174683E3C7061746820643D224D3638302E32313736203435352E3034383533333333333333333335632D31382E3136373436363636363636363636362032342E3636313333333333333333333333352D34352E31313537333333333333333333332034392E3030363933333333333333333333362D37352E343934342034352E30323138363636363636363636372D382E3230393036363636363636363636372031312E343638382D31372E3339303933333333333333333333332032372E3436303236363636363636363636362D32372E3537313139393939393939393939372034362E30363239333333333333333333336C2D32332E35353220372E333634323636363636363636363636356331392E3932353333333333333333333333342D33382E383039362034362E35353738363636363636363636372D38312E37343933333333333333333333342037352E30393333333333333333333333332D3131342E33373232363636363636363636382D31322E33353632363636363636363636363720382E303338342D33322E36383236363636363636363636372032352E3332363933333333333333333333332D35302E33343636363636363636363636372034332E35353431333333333333333333332D31352E393438382D33332E32343538363636363636363636363420302E383730342D36342E30343236363636363636363636362032352E3231362D38372E35353139393939393939393939392D302E363939373333333333333333333333332031312E30373632363636363636363636363720342E323332353333333333333333333333352032312E3137313220372E3932373436363636363636363636372032362E3337363533333333333333333333342D302E363331343636363636363636363636362D392E3236373220302E343433373333333333333333333333332D32352E38313333333333333333333333333320372E3231303636363636363636363636372D34302E31353738363636363636363636372031332E3536382D31312E3432363133333333333333333333332032352E35393134363636363636363636372D31392E3635323236363636363636363636362033392E32383734363636363636363636372D32362E3834353836363636363636363636362D322E3233353733333333333333333333333620382E3039383133333333333333333333332D302E333332382031372E38303930363636363636363636363620322E323738342032332E38363737333333333333333333333420312E313836313333333333333333333333352D382E33393637393939393939393939393920362E313836363636363636363636363636352D32342E3236303236363636363636363636362031312E3937323236363636363636363636362D33302E3833303933333333333333333333342031372E30383337333333333333333333332D31312E3032353036363636363636363636372034322E3431303636363636363636363636342D31392E3833313436363636363636363636342036392E343237322D31392E3337303636363636363636363636352D322E393631303636363636363636363636352031362E363134342D31312E3730373733333333333333333333342034332E3630353333333333333333333333342D32332E35303933333333333333333333332036302E33343737333333333333333333332D392E35343032363636363636363636363820362E3132363933333333333333333333332D32322E31353235333333333333333333333420392E373032342D33322E313739322031312E3432363133333333333333333333336137372E363730342037372E363730342030203020302032352E37333635333333333333333333333420322E343134393333333333333333333333203330372E3531353733333333333333333334203330372E35313537333333333333333333342030203020312D32302E3930363636363636363636363636362033372E35353532632D31322E34373537333333333333333333333220362E3934363133333333333333333333332D32382E3432343533333333333333333333332031302E303039362D33392E333231362031302E35383938363636363636363636363720372E36323032363636363636363636363720342E3030323133333333333333333333332032312E343935343636363636363636363720362E3333313733333333333333333333332032382E37333137333333333333333333333420342E3534383236363636363636363636377A206D2D33392E3530393333333333333333333333203135302E38333532632D302E3735303933333333333333333333333220302E353230353333333333333333333333332D3137312E3333323236363636363636363637203130382E31353134363636363636363636362D3137312E3333323236363636363636363637203130382E31353134363636363636363636366C2D302E3031373036363636363636363636363636372D302E303334313333333333333333333333333335632D32362E3537323739393939393939393939372031352E3832393333333333333333333333332D35382E323232393333333333333333333420392E343937362D37372E37323136303030303030303030312D392E3938342D32382E3138353539393939393939393939372D32382E32303236363636363636363636372D32332E3236313836363636363636363636362D37352E39363337333333333333333333322031302E3732363339393939393939393939382D39372E393936386C31392E34393836363636363636363636372032352E3031393733333333333333333333632D32392E3536373939393939393939393939382031352E3735323533333333333333333333342D31382E3130373733333333333333333333322036302E33393839333333333333333333332031352E3031383636363636363636363636362036302E33393839333333333333333333332032362E3334323420302034312E34353439333333333333333333332D33302E3139393436363636363636363636362032352E3632353630303030303030303030322D35312E3236383236363636363636363637203020302D3130362E30343337333333333333333333322D3133352E363238382D3133322E34383835333333333333333333322D3136382E38363631333333333333333333352D32372E3535343133333333333333333333332D33342E3634353333333333333333333332362D31372E35393537333333333333333333332D38312E30393232363636363636363636362032302E333030382D39392E323531326C3134392E36323334363636363636363636342D37362E35303938363636363636363636356136302E33353632363636363636363636372036302E33353632363636363636363636372030203020312036302E32363234203130332E37363533333333333333333333336C2D3134372E383635362038332E35343938363636363636363636372D31392E3532343236363636363636363636362D32352E313634386332392E353432342D31352E3737383133333333333333333333332031382E303232342D36302E33343737333333333333333333332D31352E3036313333333333333333333333322D36302E33343737333333333333333333332D32322E343334313333333333333333333320302D34342E3435383636363636363636363636362032372E303333362D32322E3935343636363636363636363636352035342E35333635333333333333333333332032352E383034382033332E3030363933333333333333333333203133302E3731333539393939393939393939203136362E3538373733333333333333333332203133302E3731333539393939393939393939203136362E35383737333333333333333333326136332E313830382036332E313830382030203020312031342E3838323133333333333333333333342033382E3734393836363636363636363637733130342E37363337333333333333333333322D36352E39393638203132302E39303032363636363636363636352D37362E33343737333333333333333333326331362E3634383533333333333333333333332D31302E373030382031392E373337362D33302E38383231333333333333333333333620372E3439323236363636363636363636372D34352E31343938363636363636363636372D302E3034323636363636363636363636363636352D302E3033343133333333333333333333333333352D332E303230382D332E363836342D372E3830382D392E3538323933333333333333333333332031302E383238382D312E333331322032312E3531323533333333333333333333342D342E3839383133333333333333333333332033312E393734342D31302E3633323533333333333333333333332032362E38382033322E3931333036363636363636363636362031342E3436342037322E38373436363636363636363636362D31322E3234353333333333333333333333332039302E33373635333333333333333333337A4D3431312E39383933333333333333333334203337352E383539326136332E343336382036332E343336382030203020312032392E3237373836363636363636363636382035352E303931326C39372E34323530363636363636363636372D35352E3139333539393939393939393939366331352E323537362D382E373239362031372E3733323236363636363636363636342D32362E3032363636363636363636363636342031312E3131383933333333333333333333332D33382E3637333036363636363636363636342D372E3636323933333333333333333333332D31342E3638353836363636363636363636382D32342E363738342D31382E3535313436363636363636363636362D33372E3532393539393939393939393939352D31322E3536313036363636363636363636376C2D3130302E32393232363636363636363636362035312E3333363533333333333333333333357A206D3130382E30303634203138372E383130313333333333333333333463342E363834382D392E3233333036363636363636363636382031322E3736353836363636363636363636362D32352E3330313333333333333333333333322032302E3539303933333333333333333333322D34302E323638386C2D36352E31363930363636363636363636372033382E32303337333333333333333333332031342E3430343236363636363636363636372031392E3736333139393939393939393939382033302E3137333836363636363636363636352D31372E36393831333333333333333333337A206D2D37342E373236342D34312E3832313836363636363636363636356C31342E343132382031392E3734363133333333333333333333332039352E313239362D35352E3733393733333333333333333333342D31352E303031362D31392E33393632363636363636363636372D39342E353430382035352E33383938363636363636363636367A222066696C6C3D22234646464646462220702D69643D2233323938223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.AvroDecoderJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.AvroDecoderJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]},{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"AvroDecoderJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"文本解析\",\"display\":\"解码器(Avro)_1.9\",\"description\":\"根据指定的avro schema(json格式定义),把byte数组按avro格式decode,输出slot 0 为decode成功数据,输出slot 1 为decode失败数据(错误原因添加在error_msg字段) \",\"doc\":\"AvroDecoderJob.md\",\"icon\":\"AvroDecoderJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"byteArrayFieldName\",\"label\":\"输入字段\",\"type\":[\"STRING\"],\"description\":\"从上游的Map中指定目标字段名,字段值需要是二进制数组(byte[])类型\",\"optional\":true,\"defaultValue\":\"bytes\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"outputFieldName\",\"label\":\"输出字段\",\"type\":[\"STRING\"],\"description\":\"如果指定Decoder后内容输出到指定的字段名,如果不指定则输出为整个顶层Map\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"removeByteArrayField\",\"label\":\"移除输入字段\",\"type\":[\"BOOL\"],\"description\":\"是否移除目标字段\",\"optional\":true,\"defaultValue\":\"true\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"reserveOriginColumns\",\"label\":\"是否保留原有字段\",\"type\":[\"BOOL\"],\"description\":\"当未指定输出字段时,输出为整个顶层Map,是否同时保留原有字段\",\"optional\":true,\"defaultValue\":\"false\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"avroSchema\",\"label\":\"avro schema定义\",\"type\":[\"STRING\"],\"description\":\"avro schema定义,json格式表示\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"JSON\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'process', '', 0x2320E8A7A3E7A08162797465E695B0E7BB84E4B8BA4176726FE6A0BCE5BC8F0A0AE6A0B9E68DAEE68C87E5AE9AE79A846176726F20736368656D61EFBC886A736F6EE6A0BCE5BC8FE5AE9AE4B989EFBC89EFBC8CE68A8A62797465E695B0E7BB84E68C896176726FE6A0BCE5BC8F6465636F64650A2D20E8BE93E587BA736C6F742030EFBC8C20E7B1BBE59E8BE4B8BA604D61703C537472696E672C204F626A6563743E60EFBC8C6465636F6465E68890E58A9FE695B0E68DAE0A2D20E8BE93E587BA736C6F742031EFBC8C20E7B1BBE59E8BE4B8BA604D61703C537472696E672C204F626A6563743E60EFBC8C6465636F6465E5A4B1E8B4A5E695B0E68DAEEFBC88E99499E8AFAFE58E9FE59BA0E6B7BBE58AA0E59CA86572726F725F6D7367E5AD97E6AEB5EFBC890A0AE4BE8BE5A682E8BE93E585A5E79A84E6B688E681AFE5A682E4B88BEFBC9A0A0A6060600A7B0A2020202022627974657322203A20226A4A6954383173455957454141414141414141414245413D222C0A20202020226D6574614461746122203A207B0A20202020202022746F70696322203A206E756C6C2C0A20202020202022706172746974696F6E22203A20302C0A202020202020226F666673657422203A20302C0A2020202020202274696D657374616D7022203A20313630373539363833313337310A202020207D0A7D0A7B0A2020202022627974657322203A20226F4A695438317345596D4943222C0A20202020226D6574614461746122203A207B0A20202020202022746F70696322203A206E756C6C2C0A20202020202022706172746974696F6E22203A20302C0A202020202020226F666673657422203A20302C0A2020202020202274696D657374616D7022203A20313630373539363833313337310A202020207D0A7D0A7B0A202022627974657322203A20225957453D222C0A2020226D6574614461746122203A207B0A2020202022746F70696322203A206E756C6C2C0A2020202022706172746974696F6E22203A20302C0A20202020226F666673657422203A20302C0A202020202274696D657374616D7022203A20313630373539363833313337310A20207D0A7D0A6060600A0AE58F82E695B0E8AFB4E6988E0A0A2D206176726F536368656D61EFBC9A206176726F20736368656D61E5AE9AE4B9892C6A736F6EE6A0BCE5BC8FE8A1A8E7A4BA0A2D206279746541727261794669656C644E616D65EFBC9AE8BE93E585A5E695B0E68DAEE9878C62797465E695B0E7BB84E68980E59CA8E5AD97E6AEB5E5908D0A2D206F75747075744669656C644E616D65EFBC9AE58F8DE5BA8FE58897E58C96E5908EE58685E5AEB9E8BE93E587BAE588B0E68C87E5AE9AE79A84E5AD97E6AEB5E5908DEFBC8CE5A682E69E9CE4B88DE68C87E5AE9AE58899E8BE93E587BAE4B8BAE695B4E4B8AAE9A1B6E5B1824D61700A0AE58F82E695B0E5A682E4B88BEFBC9A0A0A6060600A7B0A2020226279746541727261794669656C644E616D6522203A20226279746573222C0A2020226F75747075744669656C644E616D6522203A20226F7574707574222C0A2020226176726F536368656D6122203A20227B20205C22747970655C223A205C227265636F72645C222C20205C226E616D655C223A205C22746573745C222C20205C226669656C64735C223A205B202020207B2020202020205C226E616D655C223A205C22615C222C2020202020205C22747970655C223A205C226C6F6E675C22202020207D2C20207B2020202020205C226E616D655C223A205C22625C222C2020202020205C22747970655C223A205C22737472696E675C22202020207D2C7B2020202020205C226E616D655C223A205C22635C222C2020202020205C22747970655C223A205B5C22646F75626C655C222C5C226E756C6C5C225D2020207D20205D7D220A7D0A6060600A0A0AE8BE93E587BAE79A84E695B0E68DAEE5A682E4B88BEFBC88736C6F742030EFBC89EFBC9A0A0A6060600A7B226F7574707574223A7B2261223A31323333343535363637382C2262223A226161222C2263223A322E357D2C226D65746144617461223A7B22746F706963223A6E756C6C2C22706172746974696F6E223A302C226F6666736574223A302C2274696D657374616D70223A313630373539363833313337317D7D0A7B226F7574707574223A7B2261223A31323333343535363638382C2262223A226262222C2263223A6E756C6C7D2C226D65746144617461223A7B22746F706963223A6E756C6C2C22706172746974696F6E223A302C226F6666736574223A302C2274696D657374616D70223A313630373539363833313337317D7D0A0A6060600A0AE8BE93E587BAE79A84E99499E8AFAFE695B0E68DAEEFBC88736C6F742031EFBC89EFBC9A0A0A6060600A7B226D65746144617461223A7B22746F706963223A6E756C6C2C22706172746974696F6E223A302C226F6666736574223A302C2274696D657374616D70223A313630373539363833313337317D2C226572726F725F6D7367223A224D616C666F726D656420646174612E204C656E677468206973206E656761746976653A202D3439222C226279746573223A225957453D227D0A606060, 0x3C73766720786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F737667222076696577426F783D222D332E3720322E3932203634203634222077696474683D22363422206865696768743D223634223E3C7061746820643D224D35352E33362034342E373848312E323836632D2E31382D2E3734342E34332D2E3939332E38382D312E3330386C372E3839362D352E333436632D2E3930322D2E3036382D312E3738322E3034352D322E3631372D2E3234382D2E3430362D2E3133352D2E3831322D2E3239332D312E31352D2E3536342D322E3933332D322E332D352E3530342D352E3030382D372E37362D372E3938362D2E3232362D2E3239332D2E34332D2E3538372D2E372D2E3831322D2E38382D2E3732322D312E33332D312E36372D312E3533342D322E3735325632352E31632E372D2E31353820312E32342E32303320312E37362E353420322E353520312E37313420352E33393220322E30303820382E33343720312E38373220322E3836352D2E31333520352E3730372D2E35363420382E3539352D2E37363720332E3135382D2E32323620362E32352E30323320392E32323720312E3130352E362E32323620312E3130352D2E30323320312E3630322D2E33333820322E35352D312E37313420322E33372D312E37313420342E3931382030202E3633322E343320312E3231382E353220312E3931382E32343820332E3633322D312E33353420372E342D312E32342031312E3136372D2E38313220322E342E323720342E3738332E3620372E3139362E36353420322E3636322E30343520352E332D2E333620372E3630322D322E3030382E3437342D2E33333820312E3031352D2E36373720312E36372D2E343936762E363534632D2E32303320312E3038332D2E3820312E3931382D312E3520322E3737356C2D332E33383420342E303338632D312E30333820312E3238362D322E3220322E34362D332E35343220332E34332D2E3331362E3232362D2E3635342E34352D2E3932352E3734342D2E3833352E39372D312E393420312E33332D332E313820312E3337362D2E3338342E3032332D2E382D2E3032332D312E3139362E30343520322E363420312E37383220352E33323420332E34373420372E38373320352E3334362E3439362E32393320312E3132382E35322E39323520312E3236337A222066696C6C3D2223303034306665222F3E3C7061746820643D224D35332E3438372034342E333348332E31386C322E3138382D312E3533344C32372E362032372E383632632E34352D2E3331362E382D2E34373420312E33332D2E316C32342E3039332031362E323432632E312E3032332E3230332E3131332E34352E3331367A222066696C6C3D2223666266626665222F3E3C7061746820643D224D32342E3032352032392E33356C2D342E31323820322E373735632D2E3234382E3135382D2E34352E3333382D2E3734342E3034352D312E3738322D312E3634372D342E30362D312E3639322D362E32372D312E3830352D322E3937382D2E3135382D352E3937382D2E3133352D382E3838382D2E3932356131362E31362031362E31362030203020312D322E3231312D2E373963342E3936332E36373720392E382D2E3538372031342E3730382D2E37323220322E322D2E30363820342E3337362E31313320362E3439372E3833352E3333382E3131332E3734342E313820312E3033382E3538377A6D382E3530352D2E3163312E3839352D2E39343720332E3831322D312E31393620352E3735332D312E33303820322E3638352D2E31353820352E3332342E32323620372E3936332E34393620322E38322E32393320352E3636322E35363420382E3530352E31382D312E3830352E3930322D332E37323220312E3238362D352E36383520312E3434346C2D372E3031362E3433632D312E3632342E3131332D332E3232362E34332D342E3520312E3630322D2E32372E3234382D2E3437342E3234382D2E3734342E3036386C2D342E3238362D322E397A222066696C6C3D2223666566656665222F3E3C7061746820643D224D382E3039382033322E353363312E3337362D2E30323320322E3735322E30323320342E3130362D2E3239332E35322D2E3131332E382E3230332E3934372E382D312E37362E312D332E3435322E3338342D352E3035332D2E3439367A222066696C6C3D2223663466366665222F3E3C7061746820643D224D362E3239342033302E373563312E3733372E33383420332E353837203020352E32382E3633322D312E38352E3536342D332E3633322E34332D352E32382D2E3633327A6D33382E382E36373663312E36372D2E3720332E34332D2E32393320352E31322D2E362D312E36303220312E30362D332E333420312E30362D352E31322E367A222066696C6C3D2223656165666665222F3E3C7061746820643D224D34332E3531362033322E393832632E31382D2E3633322E35322D2E38353720312E30362D2E37323220312E32342E323720322E34382E323720332E382E31382D2E372E3734342D322E3237382E3932352D342E38352E35347A222066696C6C3D2223663466366665222F3E3C7061746820643D224D34362E3936382033352E303133632D2E3835372E39372D312E3931382E3734342D322E3838382E362D2E35342D2E3036382D312E3632342E3036382D312E3535372D2E3437342E3133352D2E37363720312E3031352D2E31313320312E3535372D2E31333568322E3838387A6D2D33372E332E3232356C332E3930332D2E333834632E3232362D2E3034352E3536342D2E3131332E362E3234382E3036382E3338342D2E32372E3333382D2E3439362E3338342D312E3335342E3135382D322E3730372E35342D342E3031362D2E3234387A222066696C6C3D2223656165666665222F3E3C7061746820643D224D34382E3530322033332E363832632D312E38303520312E32342D332E3732322E35322D352E3539352E3239332E3930322D2E333620312E3832372D2E30363820322E3735322D2E3034352E39372E30323320312E3839352D2E32303320322E3834322D2E3234387A222066696C6C3D2223643865326665222F3E3C7061746820643D224D382E3134332033332E35393263312E38352E35383720332E3732322E313820352E3735332E31382D312E33332E38382D342E3731352E382D352E3735332D2E31387A222066696C6C3D2223643865316665222F3E3C7061746820643D224D35332E34322033312E38632D312E3335342E3732322D322E36363220312E3038332D332E38313220312E30362E33362D2E36373720312E30362D2E36333220312E3630322D2E3831322E3536342D2E32303320312E3137332D2E33313620312E37362D2E3437342E3234382D2E3131332E34352D2E31382E34352E3232367A4D332E372033312E35383463312E3038332E33333820322E3233332E34373420332E313820312E3139362D312E3330382E3034352D322E3530342D2E33362D332E3633322D2E39372D2E3032332D2E3430362E3230332D2E3333382E34352D2E3232367A222066696C6C3D2223663166346665222F3E3C7061746820643D224D372E3531322033342E323436632D312E31373320302D322E3235362D2E3331362D332E3239342D2E38333520312E3137332E30323320322E3332342E31333520332E3239342E3833357A6D34342E3830322D2E383536632D2E3939332E3637372D322E3037352E382D332E313820312E3031352E3338342D2E36333220312E3936332D312E31323820332E31382D312E3031357A222066696C6C3D2223653465626665222F3E3C7061746820643D224D312E34322032392E353363312E31352E35363420322E3530342E36333220332E35343220312E3434342D312E33332D2E3131332D322E34382D2E372D332E3534322D312E3434347A222066696C6C3D2223666166626665222F3E3C7061746820643D224D35342E3334342033302E303935632D2E3833352E35342D312E3830352E3734342D322E39333320312E3132382E3732322D312E313520312E3738322D312E30333820322E3636322D312E3335342E3131332E3036382E3234382E312E32372E3232367A222066696C6C3D2223656366316665222F3E3C7061746820643D224D352E3433362033342E3736356C332E3633322E37632D312E33332E33362D322E3433362E3135382D332E3633322D2E377A4D35302E373820333561332E373320332E37332030203020312D322E392E3631632E3930322D2E353220312E3931382D2E34373420322E392D2E367A222066696C6C3D2223653665636665222F3E3C7061746820643D224D31302E39342033362E3534376C322E3138382D2E3138632D2E3637372E3939332D312E31303520312E3031352D322E3138382E31387A6D33322E3438362D2E3230336C322E332E3138632D312E3038332E3835372D312E3434342E3833352D322E332D2E31387A222066696C6C3D2223643264646665222F3E3C7061746820643D224D382E3030382033362E3735632D2E3232362E3034352D2E3430362D2E3032332D2E362D2E3331362E35342D2E31333520312E3031352D2E30343520312E352E312D2E3232362E3331362D2E362E3032332D2E38382E3232367A222066696C6C3D2223396662376665222F3E3C7061746820643D224D382E3030382033362E37356C2E38382D2E323236632E3331362E3034352E372D2E31313320312E3130352E31382D2E3732322E32372D312E3335342E3131332D312E3938352E3034357A6D34302E36332030632D2E3633322E3036382D312E32342E31382D312E39342030202E3333382D2E3430362E3732322D2E31333520312E30362D2E3232362E3331362D2E3032332E3732322D2E3331362E38382E3232367A222066696C6C3D2223666366646665222F3E3C7061746820643D224D35332E34322033312E3861342E303320342E30332030203020312D2E34352D2E323236632E3338342D2E3230332E3734342D2E353220312E3330382D2E34332D2E3135382E34352D2E3439362E3536342D2E3835372E3635347A222066696C6C3D2223643564666665222F3E3C7061746820643D224D34382E3633372033362E37356C2D2E38382D2E32323620312E3033382D2E313538632E3135382D2E3032332E32372E3036382E3230332E3234382D2E3034352E31382D2E3230332E3135382D2E33362E3133357A222066696C6C3D2223396662376665222F3E3C7061746820643D224D332E372033312E353834632D2E3135382E3036382D2E3239332E3135382D2E34352E3232362D2E3239332D2E312D2E362D2E3131332D2E3637372D2E3536342E34332D2E3036382E382E31333520312E3132382E3333387A222066696C6C3D2223643164636665222F3E3C7061746820643D224D35342E3334342033302E30393561322E333920322E33392030203020312D2E3237312D2E3232366C312E3139362D2E343734632D2E32372E3536342D2E362E3635342D2E3932352E377A222066696C6C3D2223666166626665222F3E3C7061746820643D224D35312E30352034332E36303848352E383432632E32372D2E34352E372D2E36353420312E30362D2E3930324C32372E352032382E383534632E362D2E343320312E3033382D2E343520312E3639322D2E3032336C32302E3530362031332E38303620312E3335342E39377A222066696C6C3D2223303034306665222F3E3C7061746820643D224D33372E3432352034322E363135682D322E373037612E36382E36382030203020312D2E3633322D2E3331366C2D322E37332D342E303136632D2E3234382D2E33362D2E3232362D2E3437342E3232362D2E36353420322E3235362D2E39323520322E3638352D322E31383820312E3436362D342E332D2E3133352D2E3232362D2E34332D2E3430362D2E32372D2E3932356C352E30303820332E3336632D322E38383820312E35382D332E31333620342E3738332D2E333620362E3835387A222066696C6C3D2223666566656665222F3E3C7061746820643D224D32382E3036332032392E377631322E3237326330202E34352D2E3133352E3637372D2E362E363332682D2E313133632D322E3838382E3135382D322E392E3133352D322E322D322E36346C322E3332342D392E343037632E3036382D2E3239332E3034352D2E3635342E362D2E3835377A222066696C6C3D2223666266636665222F3E3C7061746820643D224D32322E38332034322E3532356C2D2E31382E303638632D322E37332E3230332D322E37332E3230332D332E3437342D322E3433366C2D2E38382D322E393738632D2E3234382D2E3637372D2E3131332D312E3031352E3437342D312E3420312E3738322D312E313520312E37362D312E31373320322E3334362E386C312E37313420352E3935367A222066696C6C3D2223666466656665222F3E3C7061746820643D224D34372E3634342034322E363135682D372E383563312E352D312E30383320322E30332D322E343620312E3731342D342E3335346C362E32303420342E31356330202E3036382D2E3034352E3133352D2E3036382E3230337A4D382E392034322E3433356C372E32322D342E38352D312E32363320342E363932632D2E3131332E34352D2E3437342E33362D2E382E33364839632D2E3032332D2E312D2E3034352D2E3133352D2E312D2E3230337A222066696C6C3D2223666466646665222F3E3C7061746820643D224D32352E3639342033312E3135354C32332E372033392E3233612E36362E36362030203020312D2E3230332E3034356C2D312E3533342D352E33632D2E3036382D2E3234382E312D2E3430362E32372D2E35326C332E3435322D322E337A222066696C6C3D2223666366646665222F3E3C7061746820643D224D34302E3036342033392E323534633020312E3132382D2E3720322E3030382D312E35353720312E3938352D2E382D2E3032332D312E352D2E3930322D312E352D312E39342D2E3032332D312E30362E372D322E303320312E352D322E3035332E383537203020312E3535372E39303220312E35353720322E3030387A6D2D31302E3436372D372E35353763312E30383320312E30313520312E39363320312E38393520322E34333620332E3036382E3230332E35322E3133352E3932352D2E33383420312E3137332D2E362E32372D312E3236332E35322D312E39342E3331362D2E3036382D2E3032332D2E312D2E3234382D2E312D2E3338346C2D2E3032332D342E3137337A222066696C6C3D2223666366636665222F3E3C7061746820643D224D32392E3832332033382E37386C322E36313720332E383538682D322E343336632D2E313820302D2E3338342D2E3034352D2E3338342D2E3237762D332E353634632E3036382D2E3032332E3133352D2E3032332E3230332D2E3032337A222066696C6C3D2223666366646665222F3E3C7061746820643D224D31362E352034322E343537632E35342D2E32393320312E3038332D2E32393320312E363234203061322E323420322E32342030203020312D312E36323420307A222066696C6C3D2223666566656665222F3E3C7061746820643D224D31372E3330322033392E363832632E3135382E3331362E3437342E362E31382E39372D2E3034352E3036382D2E3333382E3036382D2E34303620302D2E32372D2E3333382E3034352D2E3633322E3232362D2E39377A222066696C6C3D2223646165336665222F3E3C2F7376673E, 'flink-job-1_9_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.DissectJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.DissectJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]},{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"DissectJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"文本解析\",\"display\":\"文本解构\",\"description\":\"用于对指定的字段进行模式匹配和内容提取,能快速对文本进行结构化提取,比正则解析易于理解,且高效\",\"doc\":\"DissectJob.md\",\"icon\":\"DissectJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"sourceField\",\"label\":\"输入字段\",\"type\":[\"STRING\"],\"description\":\"解构源字段中的文本\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"dissectPattern\",\"label\":\"解构模式匹配\",\"type\":[\"STRING\"],\"description\":\"用于匹配源字段文本内容的模式表达式\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"removeSourceField\",\"label\":\"是否删除源字段\",\"type\":[\"BOOL\"],\"description\":\"是否顺便删除源字段\",\"optional\":true,\"defaultValue\":\"false\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"outputField\",\"label\":\"输出字段\",\"type\":[\"STRING\"],\"description\":\"解构的结果输出到哪个字段。如果设置一个输出字段名的话,解构的结果将作为这个字段的子对象存在。如果不设置解构的结果将放置在最外层\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"appendSeparator\",\"label\":\"拼接操作连接符\",\"type\":[\"STRING\"],\"description\":\"对于使用+做拼接提取的时候,多个匹配的值通过什么字符进行连接,默认通过空格符连接\",\"optional\":true,\"defaultValue\":\" \",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'process', '', 0x2320E69687E69CACE8A7A3E69E840A0AE69687E69CACE8A7A3E69E84E79A84E79BAEE6A087E698AFE5B086E99D9EE7BB93E69E84E58C96E79A84E69687E69CACEFBC8CE59FBAE4BA8EE69F90E7A78DE8A784E58899E6A8A1E5BC8FEFBC8CE68F90E58F96E7BB93E69E84E58C96E79A84E4BFA1E681AFE38082E4B88EE6ADA3E58899E68F90E58F96E79BB8E6AF94EFBC8CE69687E69CACE8A7A3E69E84E585B7E69C89E5A682E4B88BE4BC98E782B9EFBC9A0A0A312E20E69BB4E5AEB9E69893E7BC96E58699E8A784E58899E5928CE6A8A1E5BC8FEFBC8CE4B88DE99C80E8A681E5ADA6E4B9A0E5A48DE69D82E79A84E6ADA3E58899E8A1A8E8BEBEE5BC8F0A322E20E8A7A3E69E90E9809FE5BAA6E6AF94E6ADA3E58899E5BFABEFBC8CE59BA0E4B8BAE69687E69CACE8A7A3E69E84E587A0E4B98EE4B88DE4BC9AE59B9EE6BAAFEFBC8CE68980E4BBA5E680A7E883BDE4B88AE6ADA3E58899E8A681E5A5BDE5BE88E5A49A0A0AE8AFA6E7BB86E79A84E8A784E58899E5928CE6A8A1E5BC8FE8A781EFBC9A5B446973736563742070726F636573736F725D2868747470733A2F2F7777772E656C61737469632E636F2F67756964652F656E2F656C61737469637365617263682F7265666572656E63652F63757272656E742F646973736563742D70726F636573736F722E68746D6C290A0AE4B88BE99DA2E698AFE4B880E4B8AAE7AE80E58D95E79A84E69687E69CACE8A7A3E69E84E79A84E4BE8BE5AD90EFBC8CE79BAEE6A087E698AFE68F90E58F96776562E8AFB7E6B182E697A5E5BF97E4B8ADE79A84E59084E7A78DE5AD97E6AEB5EFBC9A0A0A6060606A736F6E0A7B226D657373616765223A202231302E302E302E32202D202D205B33302F4170722F313939383A32323A30303A3532202B303030305D205C22474554202F656E676C6973682F76656E7565732F6369746965732F696D616765732F6D6F6E7470656C6C6965722F31382E67696620485454502F312E305C2220323030203331373122207D0A7B226D657373616765223A202231302E302E302E31202D202D205B33302F4170722F313939383A32323A30313A3532202B303030305D205C22474554202F656E676C6973682F76656E7565732F6369746965732F696D616765732F6D6F6E7470656C6C6965722F31392E67696620485454502F312E305C2220323030203331373222207D0A6060600A0AE9858DE7BDAEE5A682E4B88BEFBC9A0A0A6060606A736F6E0A7B0A2020202022736F757263654669656C64223A20226D657373616765222C0A2020202022646973736563745061747465726E223A2022257B636C69656E7469707D20257B6964656E747D20257B617574687D205B257B74696D657374616D707D5D205C22257B766572627D20257B726571756573747D20485454502F257B6874747076657273696F6E7D5C2220257B7374617475737D20257B73697A657D220A7D0A6060600A0AE8BE93E587BAE7BB93E69E9CE5A682E4B88BEFBC8CE68F90E58F96E79A84E7BB93E69E9CE5908CE6848FE4BD9CE4B8BAE5AD97E7ACA6E4B8B2E5A484E79086EFBC9A0A0A6060606A736F6E0A7B0A20202020226D657373616765223A2231302E302E302E32202D202D205B33302F4170722F313939383A32323A30303A3532202B303030305D205C22474554202F656E676C6973682F76656E7565732F6369746965732F696D616765732F6D6F6E7470656C6C6965722F31382E67696620485454502F312E305C22203230302033313731222C0A202020202272657175657374223A222F656E676C6973682F76656E7565732F6369746965732F696D616765732F6D6F6E7470656C6C6965722F31382E676966222C0A202020202273697A65223A2233313731222C0A202020202261757468223A222D222C0A20202020226964656E74223A222D222C0A2020202022636C69656E746970223A2231302E302E302E32222C0A202020202276657262223A22474554222C0A20202020226874747076657273696F6E223A22312E30222C0A202020202274696D657374616D70223A2233302F4170722F313939383A32323A30303A3532202B30303030222C0A2020202022737461747573223A22323030220A7D0A0A7B0A20202020226D657373616765223A2231302E302E302E31202D202D205B33302F4170722F313939383A32323A30313A3532202B303030305D205C22474554202F656E676C6973682F76656E7565732F6369746965732F696D616765732F6D6F6E7470656C6C6965722F31392E67696620485454502F312E305C22203230302033313732222C0A202020202272657175657374223A222F656E676C6973682F76656E7565732F6369746965732F696D616765732F6D6F6E7470656C6C6965722F31392E676966222C0A202020202273697A65223A2233313732222C0A202020202261757468223A222D222C0A20202020226964656E74223A222D222C0A2020202022636C69656E746970223A2231302E302E302E31222C0A202020202276657262223A22474554222C0A20202020226874747076657273696F6E223A22312E30222C0A202020202274696D657374616D70223A2233302F4170722F313939383A32323A30313A3532202B30303030222C0A2020202022737461747573223A22323030220A7D0A6060600A0A2A2AE58FB3E8A1A5E6938DE4BD9C28602D3E60292A2A0A0AE8A7A3E69E84E7AE97E6B395E9BB98E8AEA4E698AFE4B8A5E6A0BCE68C89E785A7E6A8A1E5BC8FE5AD97E7ACA6E4B8B2E8BF9BE8A18CE68F90E58F96E79A84E38082E4BE8BE5A682E5AFB9E4BA8EE6A8A1E5BC8F60257B666F6F6B65797D20257B6261726B65797D6028E4B8ADE997B4E4B880E4B8AAE7A9BAE6A0BC29EFBC8CE58FAAE883BDE58CB9E9858D22666F6F206261722228E4B8ADE997B4E4B880E4B8AAE7A9BAE6A0BC29EFBC8CE697A0E6B395E58CB9E9858D22666F6F20206261722228E4B8ADE997B46CE4B8A4E4B8AAE7A9BAE6A0BC29E380820AE58FB3E8A1A5E6938DE4BD9CE58FAFE4BBA5E5A484E79086E8BF99E7A78DE99C80E6B182E38082E5AFB9E4BA8EE8BF99E4B8AAE99C80E6B182E6A8A1E5BC8F60257B666F6F6B65792D3E7D20257B6261726B65797D60EFBC8CE697A2E58FAFE4BBA5E58CB9E9858D31E4B8AAE7A9BAE6A0BCEFBC8CE4B99FE58FAFE4BBA5E58CB9E9858D32E4B8AAE68896E69BB4E5A49AE4B8AAE7A9BAE6A0BCE380820A0AE58FB3E8A1A5E6938DE4BD9CE8BF98E58FAFE4BBA5E794A8E4BA8EE8B7B3E8BF87E4B88DE99C80E8A681E58CB9E9858DE79A84E983A8E58886E38082E4BE8BE5A682EFBC8CE7BB99E5AE9AE6A8A1E5BC8F605B257B74737D5D257B2D3E7D5B257B6C6576656C7D5D60EFBC8CE58CB9E9858DE69687E69CAC605B313939382D30382D31305431373A31353A34322C3436365D2020202020202020202020205B5741524E5D600AE79A84E7BB93E69E9CE698AF0A0A6060600A7473203D20313939382D30382D31305431373A31353A34322C3436360A6C6576656C203D205741524E0A6060600A0AE4B8ADE997B4E79A84E7A9BAE6A0BCE8A2ABE8B7B3E8BF87E4BA860A0A2A2AE68BBCE68EA5E6938DE4BD9C28602B60292A2A0A0AE694AFE68C81E5B086E5A49AE4B8AAE7BB93E69E9CE68BBCE68EA5E68890E4B880E4B8AAE7BB93E69E9CEFBC8CE9809AE8BF87E7A9BAE6A0BCE58886E99A94E38082E4BE8BE5A682EFBC9A60257B2B6E616D657D20257B2B6E616D657D20257B2B6E616D657D20257B2B6E616D657D60E58CB9E9858D606A6F686E206A61636F62206A696E676C656865696D6572207363686D69647460E79A84E7BB93E69E9CE4B8BAEFBC9A0A0A6060600A6E616D65203D206A6F686E206A61636F62206A696E676C656865696D6572207363686D6964740A6060600A0AE58FAFE4BBA5E7BB93E59088602B60E5928C605C6E60E694B9E58F98E68BBCE68EA5E79A84E9A1BAE5BA8FE38082E4BE8BE5A682EFBC9A60257B2B6E616D652F327D20257B2B6E616D652F347D20257B2B6E616D652F337D20257B2B6E616D652F317D60E58CB9E9858D60090A6A6F686E206A61636F62206A696E676C656865696D6572207363686D69647460E79A84E7BB93E69E9CE4B8BA28E9858DE7BDAEE68BBCE68EA5E5AD97E7ACA6E4B8BAE98097E58FB7E697B629EFBC9A0A0A6060600A6E616D65203D207363686D6964742C6A6F686E2C6A696E676C656865696D65722C6A61636F620A6060600A0A2A2AE5BC95E794A8E6938DE4BD9C28602AE5928C2660292A2A0A0AE5BC95E794A8E6938DE4BD9CE7B1BBE4BCBCE4BA8E606B65792D76616C756560E68F90E58F96EFBC8CE4BE8BE5A682605B257B74737D5D205B257B6C6576656C7D5D20257B2A70317D3A257B2670317D20257B2A70327D3A257B2670327D600AE58CB9E9858D605B323031382D30382D31305431373A31353A34322C3436365D205B4552525D2069703A312E322E332E34206572726F723A5245465553454460E79A84E7BB93E69E9CE4B8BAEFBC9A0A0A6060600A7473203D20313939382D30382D31305431373A31353A34322C3436360A6C6576656C203D204552520A6970203D20312E322E332E340A6572726F72203D20524546555345440A6060600A0AE9809AE8BF87E5BC95E794A8E69687E69CACE4B8ADE5B7B2E69C89E79A84E580BCE4BD9CE4B8BAE68F90E58F96E79A846B6579E5A484E790860A, 0x3C73766720743D22313630383837303331303631352220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D2232333534222077696474683D2232303022206865696768743D22323030223E3C7061746820643D224D3939382E34203331332E366C2D3436302E382D323838632D362E342D362E342D31392E322D362E342D32352E362D362E34732D31392E3220302D32352E3620362E346C2D3436302E3820323838632D31322E3820362E342D31322E382032352E3620302033326C3436302E382032383863362E3420362E342031392E3220362E342032352E3620362E347331392E3220302032352E362D362E346C3436302E382D3238386331322E382D362E342031322E382D31392E3220302D33327A206D2D3438362E34203236322E346C2D3339302E342D3234332E32203339302E342D3234332E32203339302E34203234332E322D3339302E34203234332E327A2220702D69643D2232333535223E3C2F706174683E3C7061746820643D224D3835312E32203438362E346C2D35312E322033322035372E362033322D3334352E36203231312E322D3334352E362D3231312E322035372E362D33322D35312E322D33322D38332E322035312E32632D31322E3820362E342D31322E382032352E3620302033326C3339362E38203234392E366331392E322031322E382033382E342031322E382035312E3220306C3339362E382D3234392E366331322E382D362E342031322E382D32352E3620302D33326C2D38332E322D35312E327A2220702D69643D2232333536223E3C2F706174683E3C7061746820643D224D3734382E38203734322E346C33382E342032352E362D3237352E32203137322E382D3237352E322D3137322E382033382E342D32352E362D35372E362D33382E342D3130322E34203634203337312E32203233302E346331392E322031322E382033382E342031322E382035312E3220306C3337312E322D3233302E342D3130322E342D36342D35372E362033382E347A2220702D69643D2232333537223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.EnrichByAsyncIOJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.EnrichByAsyncIOJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"EnrichByAsyncIOJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"字段处理\",\"display\":\"字段丰富(异步查询)\",\"description\":\"通过jdbc异步查询从指定表获取数据来丰富字段;\\n使用flink async io的方式提高查询效率,但不保证输出数据的原始顺序。\",\"doc\":\"EnrichByAsyncIOJob.md\",\"icon\":\"EnrichByAsyncIOJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"timeout\",\"label\":\"异步请求超时时间\",\"type\":[\"INT\"],\"description\":\"单位:毫秒\",\"optional\":true,\"defaultValue\":\"3000\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"capacity\",\"label\":\"异步请求队列的最大长度\",\"type\":[\"INT\"],\"description\":\"超过最大长度则会触发反压\",\"optional\":true,\"defaultValue\":\"100\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"jdbcDriver\",\"label\":\"jdbc Driver\",\"type\":[\"STRING\"],\"description\":\"jdbc驱动的class name;需要确保对应的驱动jar包已放在 flink/lib 下\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"dataSourceUrl\",\"label\":\"数据库连接字符串\",\"type\":[\"STRING\"],\"description\":\"数据库连接字符串\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"userName\",\"label\":\"用户名\",\"type\":[\"STRING\"],\"description\":\"数据库连接用户\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"maximumPoolSize\",\"label\":\"最大连接数\",\"type\":[\"INT\"],\"description\":\"连接池最大连接数\",\"optional\":true,\"defaultValue\":\"5\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"password\",\"label\":\"密码\",\"type\":[\"STRING\"],\"description\":\"数据库连接密码\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"PASSWORD\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"tableName\",\"label\":\"表名\",\"type\":[\"STRING\"],\"description\":\"查询表名\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"foreignKeys\",\"label\":\"关联列定义\",\"type\":[\"LIST\"],\"description\":\"关联列定义\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":{\"apiVersion\":0,\"name\":null,\"label\":null,\"type\":[\"OBJECT\"],\"description\":null,\"optional\":false,\"defaultValue\":null,\"placeholder\":null,\"candidates\":null,\"inputType\":null,\"range\":null,\"regex\":null,\"order\":0,\"requireCondition\":null,\"availableCondition\":null,\"listParameter\":null,\"objectParameters\":[{\"apiVersion\":2,\"name\":\"foreignKey\",\"label\":\"关联列名\",\"type\":[\"STRING\"],\"description\":\"关联列名\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"type\",\"label\":\"关联列类型\",\"type\":[\"STRING\"],\"description\":\"关联列类型\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[\"string\",\"int\",\"double\",\"float\",\"decimal\",\"boolean\",\"short\",\"long\",\"timestamp\",\"time\",\"date\"],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]},\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"whereClause\",\"label\":\"过滤条件\",\"type\":[\"STRING\"],\"description\":\"自定义关联where语句,如果不填则按foreignKeys定义自动拼接;如果填了需要确保参数个数和顺序与foreignKeys定义保持一致\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'process', '', 0x2320E5AD97E6AEB5E4B8B0E5AF8CEFBC88E5BC82E6ADA5E69FA5E8AFA2EFBC890A0AE9809AE8BF876A646263E5BC82E6ADA5E69FA5E8AFA2E4BB8EE68C87E5AE9AE8A1A8E88EB7E58F96E695B0E68DAEE69DA5E4B8B0E5AF8CE5AD97E6AEB5E380820A0AE98082E794A8E59CBAE699AFEFBC9AE98082E794A8E4BA8EE5AD98E9878FE695B0E68DAEE6AF94E8BE83E5A4A7E79A84E8A1A8E68896E697B6E69588E8A681E6B182E8BE83E9AB98E79A84E59CBAE699AFEFBC8CE6AF8FE4B880E69DA1E695B0E68DAEE983BDE5819AE5BC82E6ADA5E585B3E88194E69FA5E8AFA2E380820A0AE4BDBFE794A8666C696E6B206173796E6320696FE79A84E696B9E5BC8FE68F90E9AB98E69FA5E8AFA2E69588E78E87EFBC8CE4BD86E4B88DE4BF9DE8AF81E8BE93E587BAE695B0E68DAEE79A84E58E9FE5A78BE9A1BAE5BA8FEFBC9A68747470733A2F2F63692E6170616368652E6F72672F70726F6A656374732F666C696E6B2F666C696E6B2D646F63732D72656C656173652D312E392F6465762F73747265616D2F6F70657261746F72732F6173796E63696F2E68746D6C0A0A0AE6A0B9E68DAEE69FA5E8AFA2E7BB93E69E9CE8BE93E587BAE5888633E7A78DE68385E586B5EFBC9A0A0A2D20E6A0B9E68DAEE68C87E5AE9AE79A846B6579E585B3E88194EFBC8CE69FA5E8AFA2E588B0E7BB93E69E9CEFBC88E9BB98E8AEA4E58F96E7ACACE4B880E69DA1EFBC89EFBC8CE68A8AE8A1A8E9878CE79A84E585B6E4BB96E5AD97E6AEB5E4B8B0E5AF8CE588B0E695B0E68DAEE9878CE380820A2D20E6B2A1E69C89E69FA5E8AFA2E588B0E7BB93E69E9CEFBC8CE58899E8BF94E59B9EE58E9FE5A78BE695B0E68DAE0A2D20E69FA5E8AFA2E58F91E7949FE5BC82E5B8B8EFBC88E58C85E68BACE695B0E68DAEE5BA93EFBC8C73716CE5BC82E5B8B8E68896E8B685E697B6E5BC82E5B8B8E7AD89EFBC89EFBC8CE58899E8BF94E59B9EE58E9FE5A78BE695B0E68DAE20E58AA0E4B88A20605F5F6572726F725F6D73675F5F6020E5AD97E6AEB5E8AFB4E6988EE99499E8AFAFE58E9FE59BA0E380820A0A232320E6A0B9E68DAE666F726569676E4B657973E5AE9AE4B989E887AAE58AA8E68BBCE68EA5E585B3E88194E69DA1E4BBB6E79A84E6A0B7E4BE8B0A0AE58F82E695B0E5A682E4B88BEFBC9A0A0AE585B6E4B8AD666F726569676E4B657973E5AE9AE4B989E4BA86E58E9FE5A78BE695B0E68DAEE4B88EE695B0E68DAEE5BA93E8A1A8E4B98BE5898DE79A84E585B3E88194E5A496E994AEE79A84E5AD97E6AEB5E5908DE5928CE7B1BBE59E8BE38082E68980E69C89E585B3E88194E5A496E994AEE4B98BE997B4E4B8BA20414E4420E79A84E585B3E7B3BBE380820A0A6060600A7B0A20202274696D656F757422203A20333030302C0A202022636170616369747922203A203130302C0A2020226A64626344726976657222203A2022636F6D2E6D7973716C2E6A6462632E447269766572222C0A20202264617461536F7572636555726C22203A20226A6462633A6D7973716C3A2F2F3139322E3136382E33312E34363A333330362F696E737065725F6465763F636861726163746572456E636F64696E673D757466382675736553534C3D66616C736526616C6C6F774D756C7469517565726965733D74727565222C0A202022757365724E616D6522203A2022726F6F74222C0A2020226D6178696D756D506F6F6C53697A6522203A20322C0A20202270617373776F726422203A20225573657240313233222C0A2020227461626C654E616D6522203A202274625F636F6E6669675F74656D706C617465222C0A202022666F726569676E4B65797322203A205B207B0A2020202022666F726569676E4B657922203A2022636F6E664964222C0A20202020227479706522203A20226C6F6E67220A20207D2C207B0A2020202022666F726569676E4B657922203A2022636F6E664E616D65222C0A20202020227479706522203A2022737472696E67220A20207D2C207B0A2020202022666F726569676E4B657922203A20226372656174654279222C0A20202020227479706522203A20226C6F6E67220A20207D2C207B0A2020202022666F726569676E4B657922203A2022626C61636B456E61626C65222C0A20202020227479706522203A2022626F6F6C65616E220A20207D205D0A7D0A6060600A0AE4BBA5E4B88AE9858DE7BDAEE58AA8E68081E7949FE68890E79A8473716CE8AFADE58FA5E4B8BAEFBC9A0A0A6060600A73656C656374202A2066726F6D2074625F636F6E6669675F74656D706C617465200A776865726520636F6E664964203D203F2020616E6420636F6E664E616D65203D203F2020616E6420637265617465427920696E2028312C20322C2033292020616E6420626C61636B456E61626C65206973206E756C6C200A6060600A0AE8BE93E585A5E58E9FE5A78BE695B0E68DAEEFBC9A0A0A6060600A7B0A202022636F6E66496422203A203933303534393736303236333136382C0A202022636F6E664E616D6522203A20224669726577616C6CE697A5E5BF97E8819AE7B1BBE6A8A1E78988222C0A202022637265617465427922203A205B20312C20322C2033205D2C0A2020226F726967696E436F6C22203A2022393330353439373630323633313638220A7D0A6060600A0A0AE6ADA3E5B8B8E69FA5E8AFA2E588B0E695B0E68DAEE79A84E8BE93E587BAEFBC9A0A0A6060600A7B0A202022636F6E664964223A203933303534393736303236333136382C0A202022636F6E664465736372697074696F6E223A2022E6A0B7E4BE8BE697A5E5BF97EFBC9A4175672020312030303A34363A3431203138322E3234312E3133322E323320736E6D70645B31373637375D3A207472756E636174696E6720696E74656765722076616C7565203E2033322062697473222C0A202022636C7A436F6E666967223A20227B5C226669656C644E616D655C223A5C225C222C5C2273696D696C61726974795C223A302E367D222C0A2020227768697465456E61626C65223A206E756C6C2C0A20202264654D616E456E61626C65223A206E756C6C2C0A2020226F726967696E436F6C223A2022393330353439373630323633313638222C0A2020226465416C67436F6E666967223A206E756C6C2C0A20202275706461746554696D65223A20313537373433353934383130362C0A202022636F6E664E616D65223A20224669726577616C6CE697A5E5BF97E8819AE7B1BBE6A8A1E78988222C0A2020226372656174654279223A20312C0A20202264654D616E436F6E666967223A206E756C6C2C0A2020226465416C67456E61626C65223A206E756C6C2C0A20202263726561746554696D65223A20313537373433343932353030362C0A2020227570646174654279223A20312C0A202022626C61636B456E61626C65223A206E756C6C0A7D0A6060600A0AE69CAAE69FA5E8AFA2E588B0E585B3E88194E695B0E68DAEE79A84E8BE93E587BAE5908CE58E9FE5A78BE695B0E68DAEE380820A0AE58F91E7949FE69FA5E8AFA2E5BC82E5B8B8E8BE93E587BA605F5F6572726F725F6D73675F5F60E5AD97E6AEB5EFBC9A0A0A6060600A7B0A202022636F6E664964223A203933303534393736303236333136382C0A202022636F6E664E616D65223A20224669726577616C6CE697A5E5BF97E8819AE7B1BBE6A8A1E78988222C0A2020226372656174654279223A205B312C322C335D2C0A2020226F726967696E436F6C223A2022393330353439373630323633313638222C0A2020225F5F6572726F725F6D73675F5F223A2022636F6D2E6D7973716C2E6A6462632E657863657074696F6E732E6A646263342E4D7953514C53796E7461784572726F72457863657074696F6E3A205461626C652027696E737065725F6465762E74625F636F6E6669675F74656D706C617465312720646F65736E2774206578697374220A7D0A6060600A0A232320E6A0B9E68DAE7768657265436C61757365E887AAE5AE9AE4B989E68BBCE68EA5E585B3E88194E69DA1E4BBB6E79A84E6A0B7E4BE8B0A0AE8BE93E585A5E58E9FE5A78BE695B0E68DAEEFBC9A0A0A6060600A7B0A202022636F6E66496422203A203933303534393736303236333136382C0A202022636F6E664E616D6522203A2022222C0A202022637265617465427922203A20312C0A2020226F726967696E436F6C22203A2022393330353439373630323633313638220A7D0A6060600A0AE9858DE7BDAEE4B8ADE68C87E5AE9A7768657265436C61757365E58F82E695B0EFBC8CE99C80E8A681E7A1AEE4BF9DE58F82E695B0E4B8AAE695B0E5928CE9A1BAE5BA8FE4B88E666F726569676E4B657973E5AE9AE4B989E4BF9DE68C81E4B880E887B40A0A6060600A7B0A20202274696D656F757422203A20333030302C0A202022636170616369747922203A203130302C0A2020226A64626344726976657222203A2022636F6D2E6D7973716C2E6A6462632E447269766572222C0A20202264617461536F7572636555726C22203A20226A6462633A6D7973716C3A2F2F3139322E3136382E33312E34363A333330362F696E737065725F6465763F636861726163746572456E636F64696E673D757466382675736553534C3D66616C736526616C6C6F774D756C7469517565726965733D74727565222C0A202022757365724E616D6522203A2022726F6F74222C0A2020226D6178696D756D506F6F6C53697A6522203A20322C0A20202270617373776F726422203A20225573657240313233222C0A2020227461626C654E616D6522203A202274625F636F6E6669675F74656D706C617465222C0A202022666F726569676E4B65797322203A205B207B0A2020202022666F726569676E4B657922203A2022636F6E664964222C0A20202020227479706522203A20226C6F6E67220A20207D2C207B0A2020202022666F726569676E4B657922203A2022636F6E664E616D65222C0A20202020227479706522203A2022737472696E67220A20207D2C207B0A2020202022666F726569676E4B657922203A20226372656174654279222C0A20202020227479706522203A20226C6F6E67220A20207D205D2C0A2020227768657265436C6175736522203A202228636F6E664964203D203F204F5220636F6E664E616D65203D203F202920616E64206372656174654279203D203F220A7D0A6060600A0AE585B6E4B8AD7768657265436C61757365E9878CE69C8933E4B8AAE997AEE58FB7EFBC8CE4BBA3E8A1A833E4B8AAE58F82E695B0EFBC8CE4B88E666F726569676E4B657973E5AE9AE4B989E9878CE4BF9DE68C81E9A1BAE5BA8FE4B880E887B4E380820A0AE68BBCE68EA5E79A8473716CE8AFADE58FA50A0A6060600A73656C656374202A2066726F6D2074625F636F6E6669675F74656D706C617465200A77686572652028636F6E664964203D20393330353439373630323633313638204F5220636F6E664E616D65203D202727202920616E64206372656174654279203D20310A6060600A0AE6ADA3E5B8B8E69FA5E8AFA2E588B0E695B0E68DAEE79A84E8BE93E587BAEFBC9A0A0A6060600A7B0A202022636F6E664964223A203933303534393736303236333136382C0A202022636F6E664465736372697074696F6E223A2022E6A0B7E4BE8BE697A5E5BF97EFBC9A4175672020312030303A34363A3431203138322E3234312E3133322E323320736E6D70645B31373637375D3A207472756E636174696E6720696E74656765722076616C7565203E2033322062697473222C0A202022636C7A436F6E666967223A20227B5C226669656C644E616D655C223A5C225C222C5C2273696D696C61726974795C223A302E367D222C0A2020227768697465456E61626C65223A206E756C6C2C0A20202264654D616E456E61626C65223A206E756C6C2C0A2020226F726967696E436F6C223A2022393330353439373630323633313638222C0A2020226465416C67436F6E666967223A206E756C6C2C0A20202275706461746554696D65223A20313537373433353934383130362C0A202022636F6E664E616D65223A20224669726577616C6CE697A5E5BF97E8819AE7B1BBE6A8A1E78988222C0A2020226372656174654279223A20312C0A20202264654D616E436F6E666967223A206E756C6C2C0A2020226465416C67456E61626C65223A206E756C6C2C0A20202263726561746554696D65223A20313537373433343932353030362C0A2020227570646174654279223A20312C0A202022626C61636B456E61626C65223A206E756C6C0A7D0A606060, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313631303533313832333530312220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22313232342220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D363835203434372E3363302D312E3920302E322D332E3820302E322D352E3620302D312E382D302E322D332E362D302E322D352E365633343863302D3220302E322D332E3820302E322D352E3620302D31352E352D342E332D33382E382D32342E362D36312E352D31322E332D31332E382D32392E322D32352E382D35302E322D33352E372D33392E342D31382E362D39312E312D32382E382D3134352E362D32382E38732D3130362E332031302E322D3134352E362032382E38632D323120392E392D33372E392032312E392D35302E322033352E372D32302E332032322E372D32342E372034352E392D32342E372036312E35203020302E382D302E3220312E352D302E3220322E337632393968302E3563302E382031352E3420352E392033362E352032342E342035372E322031322E332031332E382032392E322032352E382035302E322033352E372033392E342031382E362039312E312032382E38203134352E362032382E38733130362E332D31302E32203134352E362D32382E386331392D392033342E372D31392E372034362E372D33312E39483533392E32632D31312E3920302D32322E352D352E342D32392E362D31332E392D31342E3420312E382D32392E3520322E372D34342E3920322E372D34362E3420302D38392E382D382E322D3132322E322D32332E312D33302E332D31332E362D33382E352D32372E362D33382E352D33302E34762D302E3563302D3120312E342D332E3620342E332D372E3120332E3520312E3920372E3120332E372031302E3820352E352033392E342031382E362039312E312032382E38203134352E362032382E382031322E3120302032342D302E352033352E372D312E3520302E322D31322E3920362E372D32342E332031362E362D33312E322D362D342E322D31302E382D31302D31332E372D31372E312D332E322D372E382D332E372D31362E312D312E392D32332E392D31312E3920312E322D32342E3320312E382D33362E3820312E382D34362E3420302D38392E382D382E322D3132322E322D32332E312D33302E322D31332E392D33382E342D32372E392D33382E342D33302E37762D302E3563302D3120312E342D332E3620342E332D372E3120332E3520312E3920372E3120332E372031302E3820352E352033392E342031382E362039312E312032382E38203134352E362032382E382031392E3820302033392E332D312E342035372E392D346C36312E342D36312E3363372E332D372E332031372D31312E332032372E342D31312E332031302E3420302032302E3120342032372E342031312E342031352E322031352E322031352E322034302D302E312035352E326C2D362E3320362E3348363835762D31372E3763302D312E3920302E322D332E3820302E322D352E3620302D312E382D302E322D332E362D302E322D352E36762D38372E387A4D3334322E35203331312E356333322E352D31342E392037352E392D32332E31203132322E332D32332E312034362E3420302038392E3820382E32203132322E332032332E312032392E362031332E362033372E362032372E322033382E342033302E35682D302E3576312E32633020312E332D312E3520332E372D342E3220362E382D352E3120362D31352E312031342E372D33332E392032332E332D31382E3720382E362D34312031342E392D36352E342031382E382D313820322E382D33372E3120342E332D35362E3820342E332D31392E3720302D33382E382D312E352D35362E382D342E332D32342E342D332E392D34362E372D31302E322D36352E342D31382E382D31382E382D382E362D32382E392D31372E332D33342D32332E332D332E332D332E392D342E352D362E372D342E352D372E3620302E312D322E3220372E342D31362E362033382E352D33302E397A4D353837203437322E38632D33322E352031342E392D37352E392032332E322D3132322E332032332E322D34362E3420302D38392E382D382E332D3132322E322D32332E322D33302E332D31332E392D33382E352D32382D33382E352D33302E38762D302E32563434312E3563302D312E3120312E342D332E3720342E352D372E332D302E382D302E342D312E362D302E392D322E342D312E336C322E3620312E3368302E32633320312E3920362E3720332E372031302E3420352E342033392E342031382E362039312032382E38203134352E352032382E38733130362E322D31302E32203134352E362D32382E3863332E362D312E3720372E312D332E352031302E352D352E336C2D302E312D302E3163302E382D302E3420312E372D302E3920322E352D312E332D302E3820302E342D312E3620302E392D322E3320312E3320332E3320332E3920342E3520362E3720342E3520372E362D302E3120322E322D372E342031362E372D33382E352033317A2220702D69643D2231323235223E3C2F706174683E3C7061746820643D224D363432203434382E32732D302E3120302D302E3120302E3163302D302E3120302E312D302E3120302E312D302E317A2220702D69643D2231323236223E3C2F706174683E3C7061746820643D224D3734382E38203736382E35632D362E3120302D31322E312D322E332D31362E382D362E392D392E332D392E332D392E332D32342E3220302D33332E346C33382E332D33382E32483534312E32632D31332E3120302D32332E372D31302E392D32332E372D32347331302E362D32342032332E372D3234683238362E3463392E3620302031382E3320352E392032312E392031342E3820332E3720382E3920312E362031392E312D352E312032352E396C2D37382E382037382E39632D342E3720342E362D31302E3720362E392D31362E3820362E397A4D3832362E3120363236682D323835632D392E3620302D31382E332D352E392D32312E392D31342E382D332E372D382E392D312E362D31392E3220352E322D32352E396C37322E332D37322E3163392E332D392E332032342E332D392E332033332E36203073392E322032342E3720302033332E394C3539382E3520353739483832366331332E3120302032332E372031302E342032332E372032332E35533833392E3220363236203832362E31203632367A2220702D69643D2231323237223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.EnrichByBroadcastJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.EnrichByBroadcastJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]},{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"EnrichByBroadcastJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"字段处理\",\"display\":\"字段丰富(数据流广播)\",\"description\":\"通过key反查字典数据流,如果找到则把字典里其他字段拼到原始数据上;如果字典里没有找到则不添加字段。\",\"doc\":\"EnrichByBroadcastJob.md\",\"icon\":\"EnrichByBroadcastJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"key\",\"label\":\"查询key\",\"type\":[\"STRING\"],\"description\":\"通过查询key在广播的字典map中反查\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'process', '', 0x2320E5AD97E6AEB5E4B8B0E5AF8C28E695B0E68DAEE6B581E5B9BFE692AD290A0AE9809AE8BF876B6579E58F8DE69FA5E5AD97E585B8E695B0E68DAEE6B581EFBC8CE5A682E69E9CE689BEE588B0E58899E68A8AE5AD97E585B8E9878CE585B6E4BB96E5AD97E6AEB5E68BBCE588B0E58E9FE5A78BE695B0E68DAEE4B88AEFBC9BE5A682E69E9CE5AD97E585B8E9878CE6B2A1E69C89E689BEE588B0E58899E4B88DE6B7BBE58AA0E5AD97E6AEB5E380820A0AE68EA5E694B632E4B8AAE6B581E8BE93E585A5EFBC8CE4B880E4B8AAE698AFE695B0E68DAEE6B581EFBC88736C6F7430EFBC89EFBC8CE4B880E4B8AAE698AFE5AD97E585B8E6B581EFBC88736C6F7431EFBC89EFBC8CE99C80E8A681E7AD89E5AD97E585B8E6B581E58588E8BE93E585A5E5908EEFBC8CE5908EE7BBADE79A84E695B0E68DAEE6B581E6898DE58FAFE4BBA5E58F8DE69FA5E380820A0AE98082E794A8E59CBAE699AFEFBC9AE98082E794A8E4BA8EE5AD97E585B8E8A1A8E68896E7BBB4E5BAA6E8A1A8E6ADA4E7B1BBE6AF94E8BE83E5B08FE79A84E8A1A8E4B894E697B6E69588E680A7E8A681E6B182E4B88DE5A4AAE9AB98E79A84E59CBAE699AFEFBC8CE5819AE5AE9AE697B6E585A8E9878FE69FA5E8AFA2EFBC9B0A0AE4B88AE6B8B8E58FAFE4BBA5E9809AE8BF874A444243536F757263654A6F62E69DA5E5AE9AE697B6E88EB7E58F96E585A8E9878FE5AD97E585B8E8A1A8EFBC9B0A0AE58F82E695B0E8AFB4E6988E0A0A2D206B6579EFBC9A20E9809AE8BF87E69FA5E8AFA26B6579E59CA8E5B9BFE692ADE79A84E5AD97E585B86D6170E4B8ADE58F8DE69FA50A0A232320E5AD97E6AEB5E4B8B0E5AF8CE6938DE4BD9CE6A0B7E4BE8B0A0AE58F82E695B0E5A682E4B88BEFBC9A0A0A6060600A7B0A2020226B657922203A2022686F7374220A7D0A6060600A0AE8BE93E585A531202D20E58E9FE5A78BE695B0E68DAEEFBC9A0A0A6060600A7B0A202022686F737422203A202261222C0A20202274696D6522203A2022323032302D31312D32322031323A30303A3031222C0A20202276616C756522203A20320A7D0A7B0A202022686F737422203A202262222C0A20202274696D6522203A2022323032302D31312D32322031323A30303A3030222C0A20202276616C756522203A20320A7D0A7B0A202022686F737422203A202263222C0A20202274696D6522203A2022323032302D31312D32322031323A30303A3031222C0A20202276616C756522203A20330A7D0A6060600A0AE8BE93E585A532202D20E5AD97E585B8E695B0E68DAEEFBC9A0A0A6060600A7B0A202022697022203A2022312E312E312E31222C0A202022686F737422203A202261222C0A20202273797322203A20226D6574726963220A7D0A7B0A202022697022203A2022322E322E322E32222C0A202022686F737422203A202262222C0A20202273797322203A2022656F69220A7D0A6060600A0AE8BE93E587BAE79A84E695B0E68DAEE5A682E4B88BEFBC9A0A0A6060600A7B226970223A22312E312E312E31222C22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3031222C22737973223A226D6574726963222C2276616C7565223A327D0A7B226970223A22322E322E322E32222C22686F7374223A2262222C2274696D65223A22323032302D31312D32322031323A30303A3030222C22737973223A22656F69222C2276616C7565223A327D0A7B22686F7374223A2263222C2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A337D0A6060600A, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313630393734373632323732342220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22333338312220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3839332E303830313831203538352E323130313439682D38362E323334353235762D33372E3631353933326837392E3535373639376135372E3535323337362035372E35353233373620302030203020312E3738363735372D3131352E3130343735336C2D32302E3530303638332D302E36353832373920322E3434353033352D32302E333132363033613135332E343733303034203135332E34373330303420302030203020312E3033343433392D31372E363739343838413134382E333030383133203134382E333030383133203020302030203732332E303536313637203234352E3732363336613135312E333130303838203135312E3331303038382030203020302D33392E39363639323820352E36343233396C2D32302E37383238303320352E36343233392D332E3030393237342D32312E333437303432413232352E363935353934203232352E363935353934203020302030203230392E323232353331203236362E3431353132337631382E3830373936366C2D31362E37333930383920312E383830373937613133302E373135333635203133302E3731353336352030203020302031342E393532333333203236302E3439303333317633372E363135393332613136382E333331323937203136382E3333313239372030203020312D33352E3534373035362D3333322E383036393631203236332E333131353236203236332E333131353236203020302031203532312E3037343730322D34312E373533363835203138312E313230373134203138312E3132303731342030203020312032392E3939383730362D322E353339303735203138352E393136373436203138352E393136373436203020302031203138352E383232373036203138352E37323836363676332E3537333531336139352E3136383330392039352E3136383330392030203020312D31352E373034363532203138372E3531353432337A222066696C6C3D22233238324433332220702D69643D2233333832223E3C2F706174683E3C7061746820643D224D3339392E333731303639203334312E363436393838483332392E3837353633346137342E3537333538362037342E3537333538362030203020302D37342E3239313436362037332E323537303238763437382E3934343835382D31382E3830373936362031342E3537363137346137342E3537333538362037342E3537333538362030203020312037342E3537333538362D37342E343739353436683433312E343534373434563334312E363436393838483339392E3337313036397A222066696C6C3D22234646464646462220702D69643D2233333833223E3C2F706174683E3C7061746820643D224D3235352E353834313638203930382E353139303838682D31382E383037393636563431342E3731353933364139342E3033393833312039342E303339383331203020302031203332392E383735363334203332322E3833393032316836392E3439353433357633372E363135393333483332392E3837353633346135362E3432333839382035362E3432333839382030203020302D35352E343833352035342E383235323231763339392E3438313230316139332E3338313535322039332E3338313535322030203020312035352E37363536322D31382E383037393636683431322E363436373738563336302E343534393534483530362E303132323338762D33372E363135393333683237342E343038323236763531312E313036343831483332392E3837353633346135352E38353936362035352E38353936362030203020302D35352E343833352035322E35363832363576372E353233313837682D302E3934303339386131382E3830373936362031382E3830373936362030203020312D31372E3836373536382031342E3438323133347A222066696C6C3D22233238324433332220702D69643D2233333834223E3C2F706174683E3C7061746820643D224D3336392E363534343833203339322E383034363535483731302E373336393439763337312E333633323932483336392E3635343438337A222066696C6C3D22234638433434462220702D69643D2233333835223E3C2F706174683E3C7061746820643D224D3736312E363132343938203831352E313337353336483332392E3837353633346137342E3537333538362037342E3537333538362030203120302030203134392E303533313332683433312E3733363836347A222066696C6C3D22234646464646462220702D69643D2233333836223E3C2F706174683E3C7061746820643D224D3738302E343230343634203938322E393938363334483332392E3837353633346139332E3338313535322039332E33383135353220302031203120302D3138362E363639303634683435302E35343438337A4D3332392E383735363334203833332E3934353530326135352E37363536322035352E37363536322030203120302030203131312E343337313939683431322E393238383938563833332E3934353530327A222066696C6C3D22233238324433332220702D69643D2233333837223E3C2F706174683E3C7061746820643D224D3437352E30373331333320313032346C2D35342E3037323930332D33342E3233303439382D35342E3037323930322033342E323330343938762D3132372E3839343137683130382E313435383035763132372E38393431377A222066696C6C3D22233334434139442220702D69643D2233333838223E3C2F706174683E3C7061746820643D224D3332342E333237323834203839332E3934323931347A222066696C6C3D22234646464646462220702D69643D2233333839223E3C2F706174683E3C7061746820643D224D3332342E333237323834203837352E313334393438683433372E3238353231347633372E363135393332682D3433372E3238353231347A222066696C6C3D22233238324433332220702D69643D2233333930223E3C2F706174683E3C7061746820643D224D3332342E333237323834203831302E3532393538347A222066696C6C3D22234646464646462220702D69643D2233333931223E3C2F706174683E3C7061746820643D224D3330352E353139333138203334392E3037363133346833372E363135393333763436312E3435333435682D33372E3631353933337A4D3532302E343934333731203235372E3835373439384C3435332E303637383133203139302E3532343937396C2D36372E3333323531392036372E3333323531392D32362E3631333237322D32362E3631333237324C3435332E303637383133203133372E3339323437356C39342E3033393833312039332E3835313735312D32362E3631333237332032362E3631333237327A222066696C6C3D22233238324433332220702D69643D2233333932223E3C2F706174683E3C7061746820643D224D3433362E343232373633203138392E3330323436326833372E363135393332763234382E383239333932682D33372E3631353933327A4D3535392E383033303231203639342E3339303339336C2D39342E3033393833312D39332E3835313735312032362E3631333237322D32362E3631333237322036372E3432363535392036372E3333323531392036372E3432363535382D36372E3333323531392032362E3531393233332032362E3631333237322D39332E3934353739312039332E3835313735317A222066696C6C3D22233238324433332220702D69643D2233333933223E3C2F706174683E3C7061746820643D224D3533382E383332313338203339332E3535363937346833372E363135393333763234382E383239333933682D33372E3631353933337A222066696C6C3D22233238324433332220702D69643D2233333934223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.ExplodeJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.ExplodeJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]},{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"ExplodeJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"数据流变换\",\"display\":\"列转行(宽表转高表)\",\"description\":\"多列转到同一列,即宽表转高表;\\n原始字段名放到高表的目标字段名列,原始字段值放到高表的目标字段值列\",\"doc\":\"ExplodeJob.md\",\"icon\":\"ExplodeJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"sourceFields\",\"label\":\"输入字段\",\"type\":[\"LIST\"],\"description\":\"宽表需要转换的列\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":{\"apiVersion\":0,\"name\":null,\"label\":null,\"type\":[\"STRING\"],\"description\":null,\"optional\":false,\"defaultValue\":null,\"placeholder\":null,\"candidates\":null,\"inputType\":null,\"range\":null,\"regex\":null,\"order\":0,\"requireCondition\":null,\"availableCondition\":null,\"listParameter\":null,\"objectParameters\":null},\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"targetKeyField\",\"label\":\"输出key字段\",\"type\":[\"STRING\"],\"description\":\"合并到高表的字段名列名\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"targetValueField\",\"label\":\"输出value字段\",\"type\":[\"STRING\"],\"description\":\"合并到高表的字段值列名\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'process', '', 0x2320E58897E8BDACE8A18CEFBC88E5AEBDE8A1A8E8BDACE9AB98E8A1A8EFBC890A0AE5A49AE58897E8BDACE588B0E5908CE4B880E58897EFBC8CE58DB3E5AEBDE8A1A8E8BDACE9AB98E8A1A8EFBC9BE58E9FE5A78BE5AD97E6AEB5E5908DE694BEE588B0E9AB98E8A1A8E79A84E79BAEE6A087E5AD97E6AEB5E5908DE58897EFBC8CE58E9FE5A78BE5AD97E6AEB5E580BCE694BEE588B0E9AB98E8A1A8E79A84E79BAEE6A087E5AD97E6AEB5E580BCE588970A2020200A0A2D20E8BE93E587BAE68890E58A9FE8BDACE68DA2E79A84E695B0E68DAEE588B020736C6F7420300A2D20E8BE93E587BAE7BCBAE5A4B1E8BDACE68DA2E79A84E695B0E68DAEE588B020736C6F7420310A0AE4BE8BE5A6820A0A0AE58F82E695B0E5A682E4B88BEFBC9A0A0A6060600A7B0A202022736F757263654669656C647322203A205B20226E31222C20226E32222C20226E3322205D2C0A2020227461726765744B65794669656C6422203A20226E616D65222C0A20202274617267657456616C75654669656C6422203A202276616C7565220A7D0A6060600A0AE8BE93E585A5E5A682E4B88BEFBC9A0A0A6060600A7B0A202022636F756E74727922203A2022E7BE8EE59BBD222C0A2020226E3122203A20226D696B65222C0A2020226E3222203A20226D617279222C0A2020226E3322203A2022746F6D222C0A20202269737022203A2022E58AA0E5B79EE5A4A7E5ADA6220A7D0A7B0A202022636F756E74727922203A2022E4B8ADE59BBD222C0A2020226E3122203A20224A61736F6E222C0A2020226E3222203A20224A61636B222C0A20202269737022203A2022E88194E9809A220A7D0A7B0A202022636F756E74727922203A2022E7BE8EE59BBD222C0A2020226E3222203A20225472756D70222C0A20202269737022203A2022E58AA0E5B79EE5A4A7E5ADA6220A7D0A7B0A202022636F756E74727922203A2022E7BE8EE59BBD222C0A20202269737022203A2022E58AA0E5B79EE5A4A7E5ADA6220A7D0A7B0A202022636F756E74727922203A2022E7BE8EE59BBD222C0A2020226E3122203A206E756C6C2C0A20202269737022203A2022E58AA0E5B79EE5A4A7E5ADA6220A7D0A6060600A0AE8BE93E587BAE79A84E68890E58A9FE8BDACE68DA2E695B0E68DAEE5A682E4B88BEFBC88736C6F742030EFBC89EFBC9A0A0A6060600A7B22636F756E747279223A22E7BE8EE59BBD222C22697370223A22E58AA0E5B79EE5A4A7E5ADA6222C226E616D65223A226E31222C2276616C7565223A226D696B65227D0A7B22636F756E747279223A22E7BE8EE59BBD222C22697370223A22E58AA0E5B79EE5A4A7E5ADA6222C226E616D65223A226E32222C2276616C7565223A226D617279227D0A7B22636F756E747279223A22E7BE8EE59BBD222C22697370223A22E58AA0E5B79EE5A4A7E5ADA6222C226E616D65223A226E33222C2276616C7565223A22746F6D227D0A7B22636F756E747279223A22E4B8ADE59BBD222C22697370223A22E88194E9809A222C226E616D65223A226E31222C2276616C7565223A224A61736F6E227D0A7B22636F756E747279223A22E4B8ADE59BBD222C22697370223A22E88194E9809A222C226E616D65223A226E32222C2276616C7565223A224A61636B227D0A7B22636F756E747279223A22E7BE8EE59BBD222C22697370223A22E58AA0E5B79EE5A4A7E5ADA6222C226E616D65223A226E32222C2276616C7565223A225472756D70227D0A7B22636F756E747279223A22E7BE8EE59BBD222C22697370223A22E58AA0E5B79EE5A4A7E5ADA6222C226E616D65223A226E31222C2276616C7565223A6E756C6C7D0A6060600A0AE8BE93E587BAE79A84E7BCBAE5A4B1E8BDACE68DA2E695B0E68DAEEFBC88736C6F742031EFBC89EFBC9A0A0A6060600A7B22636F756E747279223A22E4B8ADE59BBD222C22697370223A22E88194E9809A222C226E616D65223A226E33222C2276616C7565223A6E756C6C7D0A7B22636F756E747279223A22E7BE8EE59BBD222C22697370223A22E58AA0E5B79EE5A4A7E5ADA6222C226E616D65223A226E31222C2276616C7565223A6E756C6C7D0A7B22636F756E747279223A22E7BE8EE59BBD222C22697370223A22E58AA0E5B79EE5A4A7E5ADA6222C226E616D65223A226E33222C2276616C7565223A6E756C6C7D0A7B22636F756E747279223A22E7BE8EE59BBD222C22697370223A22E58AA0E5B79EE5A4A7E5ADA6222C226E616D65223A226E31222C2276616C7565223A6E756C6C7D0A7B22636F756E747279223A22E7BE8EE59BBD222C22697370223A22E58AA0E5B79EE5A4A7E5ADA6222C226E616D65223A226E32222C2276616C7565223A6E756C6C7D0A7B22636F756E747279223A22E7BE8EE59BBD222C22697370223A22E58AA0E5B79EE5A4A7E5ADA6222C226E616D65223A226E33222C2276616C7565223A6E756C6C7D0A7B22636F756E747279223A22E7BE8EE59BBD222C22697370223A22E58AA0E5B79EE5A4A7E5ADA6222C226E616D65223A226E32222C2276616C7565223A6E756C6C7D0A7B22636F756E747279223A22E7BE8EE59BBD222C22697370223A22E58AA0E5B79EE5A4A7E5ADA6222C226E616D65223A226E33222C2276616C7565223A6E756C6C7D0A606060, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313631303038353232373630352220636C6173733D2269636F6E222076696577426F783D2230203020313231392031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D223531342220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D223233382E3038353933373522206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3330302E3933303233333935203531322E3035323930363538762D302E303532393036353863302D302E36303834323238362D302E33313734333738372D312E31313130333235322D302E33343338393037342D312E37313934353533386132362E35333235313936362032362E35333235313936362030203020302D312E363636353438382D382E33333237343536342032362E32343135333436372032362E32343135333436372030203020302D342E313533313436382D362E3239353835323338632D302E35353535313632362D302E373134323335322D302E38323030343833372D312E35383731383933332D312E34383133373639382D322E32343835313739356C2D37382E383033393634332D37392E36323430313236376132362E34353331363031392032362E34353331363031392030203120302D33372E36313633393337332033372E32343630343932386C33342E32303339333538352033342E3537343238313134483131362E38363931343531376132362E34353331363031392032362E343533313630313920302030203020302035322E39303633323033376839332E34353930313532316C2D33332E32373830373539372033332E30333939393637336132362E34373936313330362032362E34373936313330362030203020302033372E32373235303239392033372E35363334383739386C37382E383033393634332D37382E323734393031373320302E303236343533372D302E30353239303537366132362E35353839373235332032362E353538393732353320302030203020372E37373732323835362D31382E37323838333734317A4D3838342E3033373234353935203531322E3035323930363538762D302E303532393036353863302D302E363038343232383620302E33313734333738372D312E313131303332353220302E33343338393135362D312E373139343535333820302E31383531373138322D322E383330343837393120302E35383139363931352D352E363630393736363620312E363636353438382D382E333332373435363420302E39373837363733312D322E333534333331313320322E35363539353636332D342E3333383331383620342E31323636393330392D362E323935383532333820302E35353535313632362D302E3731343233353220302E38323030343833372D312E353837313839333320312E35303738323938362D322E32343835313739356C37382E383033393634332D37392E36323430313236376132362E35303630363637372032362E35303630363637372030203020312033372E36313633393435362033372E32343630343932386C2D33342E32303339333636392033342E35373432383131346839342E32323631353639396132362E34353331363031392032362E343533313630313920302030203120302035322E3930363332303337682D39332E34333235363233326C33332E32373830373539372033332E30333939393637336132362E34353331363031392032362E34353331363031392030203020312D33372E32393839353538382033372E35363334383739386C2D37382E38303339363432392D37382E32373439303137332D302E30323634353337312D302E30353239303537366132362E3633383333322032362E3633383333322030203020312D372E38303336383232342D31382E37323838333734317A222066696C6C3D22233737373737382220702D69643D22353135223E3C2F706174683E3C7061746820643D224D3432312E3231323735333738203132382E3136343634343737683334352E3030323131363631763736332E3833353030323334483432312E32313237353337387A222066696C6C3D22234546454545452220702D69643D22353136223E3C2F706174683E3C7061746820643D224D3734382E32303032363831382039302E313235682D3330382E393732393132326135362E35303339353030372035362E35303339353030372030203020302D35362E343531303434332035362E3435313034343332763733302E383437393131333663302033312E31333533363935342032352E33313536373437382035362E34353130343433322035362E343531303434332035362E3435313034343332683330382E393732393132326135362E35303339353030372035362E35303339353030372030203020302035362E343531303433352D35362E3435313034343332563134362E35373630343433324135362E35303339353030372035362E3530333935303037203020302030203734382E32303032363831382039302E3132357A206D2D3330382E393732393132322035322E3930363332303337683330382E3937323931323263312E3935373533333739203020332E353434373233313120312E353837313839333320332E353434373233313320332E3534343732333935763230362E3434303436323435483433352E3638323633323837563134362E353736303434333263302D312E393537353333373920312E35383731383933332D332E353434373233313120332E35343437323331312D332E35343437323339357A206D3331322E3531373633353332203236322E3839313530363737763231302E3531343234393739483433352E3638323633323837762D3231302E3531343234393738683331362E30363233353834347A206D2D332E3534343732333132203437352E3034353835323439682D3330382E3937323931323261332E353434373233313120332E35343437323331312030203020312D332E35343437323331312D332E3534343732333935762D3230382E3038303535383337683331362E3036323335383434763230382E3038303535383337633020312E39353735333337392D312E353837313839333320332E35343437323331312D332E353434373233313320332E35343437323339357A222066696C6C3D22233737373737382220702D69643D22353137223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.FilterFieldJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.FilterFieldJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"FilterFieldJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"数据流变换\",\"display\":\"自定义输出字段\",\"description\":\"用于指定是否输出某些字段\",\"doc\":\"FilterFieldJob.md\",\"icon\":\"FilterFieldJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"whiteListFields\",\"label\":\"字段白名单\",\"type\":[\"LIST\"],\"description\":\"仅保留的字段列表\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":{\"apiVersion\":0,\"name\":null,\"label\":null,\"type\":[\"STRING\"],\"description\":null,\"optional\":false,\"defaultValue\":null,\"placeholder\":null,\"candidates\":null,\"inputType\":null,\"range\":null,\"regex\":null,\"order\":0,\"requireCondition\":null,\"availableCondition\":null,\"listParameter\":null,\"objectParameters\":null},\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"blackListFields\",\"label\":\"字段黑名单\",\"type\":[\"LIST\"],\"description\":\"仅过滤的字段。如果黑名单中包含白名单字段,该字段优先属于黑名单\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":{\"apiVersion\":0,\"name\":null,\"label\":null,\"type\":[\"STRING\"],\"description\":null,\"optional\":false,\"defaultValue\":null,\"placeholder\":null,\"candidates\":null,\"inputType\":null,\"range\":null,\"regex\":null,\"order\":0,\"requireCondition\":null,\"availableCondition\":null,\"listParameter\":null,\"objectParameters\":null},\"objectParameters\":null}]}}', 'process', '', 0x2320E887AAE5AE9AE4B989E8BE93E587BAE5AD97E6AEB50A0AE59CA8E4B98BE5898DEFBC8CE68891E4BBACE58FAFE4BBA5E4BDBFE794A866696C746572E3808172656D6F7665E79A84E696B9E5BC8FE58EBBE4BFAEE589AAE695B0E68DAEEFBC8CE4BDBFE5BE97E789B9E5AE9AE79A84E58897E38081E695B0E68DAEE6B581E585A5E4B88BE7BAA7E7AE97E5AD900A0AE4BD86E698AFE5BD93E68891E4BBACE79A84E5AD97E6AEB5E789B9E588ABE5A49AE697B6EFBC8CE58887E695B0E68DAEE79A84E58897E4B88DE59BBAE5AE9AEFBC8CE8BF99E697B6E68891E4BBACE58FAAE683B3E4BF9DE79599E789B9E5AE9AE79A84E58897E4BE9BE4B88BE6B8B8E7AE97E5AD90E4BDBFE794A8E58FAFE4BBA5E4BDBFE794A8E8AFA5E7AE97E5AD900A0AE4BE8BE5A682E58E9FE5A78BE79A84E69F90E69DA1E695B0E68DAEE5A682E4B88B3A0A0A6060606A736F6E0A7B0A20202274696D65223A2022323032302D31312D32322031323A30303A3030222C0A20202276616C7565223A20312C0A202022686F7374223A202261222C0A2020226E616D65223A2022656F6974656B222C0A202022616765223A20320A7D0A6060600A0AE4B88AE99DA2E79A84E695B0E68DAEE585B1E69C8935E4B8AAE58897EFBC8CE7AE97E5AD90E68F90E4BE9BE4BA86E799BDE5908DE58D95E5928CE9BB91E5908DE58D95E38082E9809AE8BF87E7BB84E59088E4BDBFE794A8E799BDE5908DE58D95E5928CE9BB91E5908DE58D95EFBC8CE58FAFE4BBA5E5AFB9E695B0E68DAEE8BF9BE8A18CE4B88DE5908CE79A84E8BE93E587BA0A0A2A2A2AE799BDE5908DE58D95E5928CE9BB91E5908DE58D95E983BDE4B8BAE7A9BA2A2A2A0A0AE8BE93E587BAE7BB93E69E9CE4B88DE5819AE4BBBBE4BD95E5A484E79086EFBC8CE7BB93E69E9CE5A682E4B88B3A0A0A6060606A736F6E0A7B0A20202274696D65223A2022323032302D31312D32322031323A30303A3030222C0A20202276616C7565223A20312C0A202022686F7374223A202261222C0A2020226E616D65223A2022656F6974656B222C0A202022616765223A20320A7D0A6060600A0A2A2A2AE7BC96E8BE91E799BDE5908DE58D95EFBC8CE9BB91E5908DE58D95E4B8BAE7A9BA2A2A2A0A0AE9858DE7BDAEE5A682E4B88B3A0A0A6060606A736F6E0A7B0A20202277686974654C6973744669656C6473223A205B2274696D65222C2022686F7374225D0A7D0A6060600A0AE8BE93E587BAE7BB93E69E9CE5A682E4B88B3A0A0A6060606A736F6E0A7B0A20202274696D65223A2022323032302D31312D32322031323A30303A3030222C0A202022686F7374223A202261220A7D0A6060600A0A2A2A2AE7BC96E8BE91E9BB91E5908DE58D95EFBC8CE799BDE5908DE58D95E4B8BAE7A9BA2A2A2A0A0AE9858DE7BDAEE5A682E4B88B3A0A0A6060606A736F6E0A7B0A202022626C61636B4C6973744669656C6473223A205B2274696D65222C2022686F7374225D0A7D0A6060600A0AE8BE93E587BAE7BB93E69E9CE5A682E4B88B3A0A0A6060606A736F6E0A7B0A20202276616C7565223A20312C0A2020226E616D65223A2022656F6974656B222C0A202022616765223A20320A7D0A6060600A0A2A2A2AE9BB91E5908DE58D95E4B88EE799BDE5908DE58D95E69C89E9878DE590882A2A2A0A0AE9858DE7BDAEE5A682E4B88B3A0A0A6060606A736F6E0A7B0A20202277686974654C6973744669656C6473223A205B2274696D65222C2022686F7374225D2C0A202022626C61636B4C6973744669656C6473223A205B22616765222C2022686F7374225D0A7D0A6060600A0AE8BE93E587BAE7BB93E69E9CE5A682E4B88B3A0A0A6060606A736F6E0A7B0A20202274696D65223A2022323032302D31312D32322031323A30303A3030220A7D0A6060600A0AE5BD93E69F90E4B8AAE5AD97E6AEB5E5908CE697B6E5AD98E59CA8E4B88EE799BDE5908DE58D95E5928CE9BB91E5908DE58D95E4B8ADE697B6EFBC8CE8AFA5E5AD97E6AEB5E4BC9AE8AEA4E4B8BAE59CA8E9BB91E5908DE58D95E4B8ADEFBC8CE8A2ABE8BF87E6BBA4, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313632373239333038323733312220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22333235312220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E40666F6E742D66616365207B20666F6E742D66616D696C793A20666565646261636B2D69636F6E666F6E743B207372633A2075726C28222F2F61742E616C6963646E2E636F6D2F742F666F6E745F313033313135385F3175687238726930706B352E656F743F236965666978222920666F726D61742822656D6265646465642D6F70656E7479706522292C2075726C28222F2F61742E616C6963646E2E636F6D2F742F666F6E745F313033313135385F3175687238726930706B352E776F666632222920666F726D61742822776F66663222292C2075726C28222F2F61742E616C6963646E2E636F6D2F742F666F6E745F313033313135385F3175687238726930706B352E776F6666222920666F726D61742822776F666622292C2075726C28222F2F61742E616C6963646E2E636F6D2F742F666F6E745F313033313135385F3175687238726930706B352E747466222920666F726D61742822747275657479706522292C2075726C28222F2F61742E616C6963646E2E636F6D2F742F666F6E745F313033313135385F3175687238726930706B352E7376672369636F6E666F6E74222920666F726D6174282273766722293B207D0A3C2F7374796C653E3C2F646566733E3C7061746820643D224D3938342E313136333634203934352E373238632D302E3233323732372D36332E3633393237332D31322E3834363534352D3132352E3334313039312D33372E3530342D3138332E343132333634613437332E323435303931203437332E3234353039312030203020302D3130312E3730313831392D3135302E343532333633632D34332E35322D34332E3430333633362D39342E3230382D37372E3631343534352D3135302E3537343534352D3130312E333634333634613438322E363437323733203438322E3634373237332030203020302D34382E3836313039312D31372E363131363336203236362E343236313832203236362E3432363138322030203020302035312E3730363138322D34302E3334333237336335302E3030313435352D35302E3030313435352037372E3631343534352D3131362E34382037372E3631343534352D3138372E32363938313820302D37302E3638353039312D32372E3530323534352D3133372E3237343138322D37372E3631343534352D3138372E323735363337433634372E3137393633362032372E393937303931203538302E37303130393120302E333834203530392E39313132373320302E333834632D37302E36383530393120302D3133372E3237343138322032372E3530323534352D3138372E3237353633372037372E3631343534352D35302E3030313435352035302E3030313435352D37372E363134353435203131362E34382D37372E363134353435203138372E32373536333720302037302E3637393237332032372E353032353435203133372E3236383336342037372E363134353435203138372E323639383138613236352E343630333634203236352E3436303336342030203020302035312E3730363138322034302E333433323733203434372E373738393039203434372E3737383930392030203020302D34382E3836363930392031372E363131363336203437332E393935363336203437332E3939353633362030203020302D3135302E353638373237203130312E333634333634203437332E323435303931203437332E3234353039312030203020302D3130312E373031383138203135302E343538313832632D32342E3635373435352035382E3138313831382D33372E323731323733203131392E3838333633362D33372E343938313832203138332E35313730397634382E363463302031352E36382031312E3631383930392032382E3033322032372E3239383930392032382E303332683839312E3437393237336331352E363820302032392E3531353633362D31322E3335322032392E3531353633362D32382E303332762D34372E37323635343563302E3131363336342D302E34353338313820302E3131363336342D302E36383635343520302E3131363336342D312E3032347A4D3330312E393532203236352E32373431383263302D3131342E3635383930392039332E3330303336342D3230372E393533343535203230372E3935393237332D3230372E393533343535733230372E3935333435352039332E323934353435203230372E393533343534203230372E3935333435356330203131342E3635383930392D39332E323934353435203230372E3935333435352D3230372E393533343534203230372E3935333435342D3131342E36353839303920302D3230372E3935393237332D39332E3239343534352D3230372E3935393237332D3230372E3935333435347A4D39322E35323037323720313032322E343035383138563934362E36333536333663302E3435333831382D3232392E373731363336203138372E3631333039312D3431362E353837363336203431372E3339303534362D3431362E353837363336203232392E3737313633362030203431362E393330393039203138362E393236353435203431372E333834373237203431362E3538373633367637352E3737303138324839322E3532303732377A222066696C6C3D22233630363236362220702D69643D2233323532223E3C2F706174683E3C7061746820643D224D3533382E333135363336203539352E3834682D35362E3831343534356C2D35322E3136203230372E333839303931632D312E37303437323720362E3730323534352D302E3233323732372031342E30393136333620332E3836333237332031392E3038333633366C36352E3739373831382038312E32353637323863362E30323138313820372E3439393633362031352E39303639303920372E3439393633362032312E39333435343520306C36352E3739322D38312E323530393163342E3039303138322D352E30303336333620352E3435313633362D31322E32373633363420332E3836333237332D31392E3038393435346C2D35322E3237363336342D3230372E3338393039317A206D35362E3832303336342D3432302E3435303930396C2D3131332E363334393039203131332E3632393039312D35362E3832303336342D35362E3831343534366132382E3339323732372032382E3339323732372030203020302D34302E32323639303920302032382E3339323732372032382E33393237323720302030203020302034302E3232363930396C37362E3933333831382037362E3933333831396132382E3239333831382032382E3239333831382030203020302032302E31313334353520382E32393637323763372E32373237323720302031342E3534353435352D322E3733343534352032302E3131333435342D382E3239363732376C3133332E3734383336342D3133332E3734383336346132382E3339323732372032382E33393237323720302030203020302D34302E3232363930392032382E3339323732372032382E3339323732372030203020302D34302E32323639303920307A222066696C6C3D22233630363236362220702D69643D2233323533223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.FilterJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.FilterJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]},{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"FilterJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"数据流变换\",\"display\":\"过滤器\",\"description\":\"使用aviator表达式指定过滤规则,返回boolean值;如果为true,输出到slot 0;如果为false,输出到slot 1; \",\"doc\":\"FilterJob.md\",\"icon\":\"FilterJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"rule\",\"label\":\"过滤条件\",\"type\":[\"STRING\"],\"description\":\"使用aviator表达式,返回boolean值\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"AVIATOR_SCRIPT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'process', '', 0x2320E695B0E68DAEE8BF87E6BBA4E58886E6B5810A0AE6A0B9E68DAEE68C87E5AE9AE8BF87E6BBA4E79A8461766961746F72E79A84626F6F6C65616EE8A1A8E8BEBEE5BC8FEFBC8CE58886E6B581E58E9FE5A78BE695B0E68DAEE6B581E4B8BA32E4B8AAE695B0E68DAEE6B581E380820AE5AD97E6AEB5E5BC95E794A8E696B9E6B395E8AFB7E58F82E88083EFBC9A68747470733A2F2F7777772E79757175652E636F6D2F626F79616E2D6176666D6A2F61766961746F727363726970742F7567626D716D2368316A664E0A0A2D20E8BE93E587BAE8A1A8E8BEBEE5BC8FE4B8BA74727565E79A84E695B0E68DAEE588B020736C6F7420300A2D20E8BE93E587BAE8A1A8E8BEBEE5BC8FE4B8BA66616C7365E79A84E695B0E68DAEE588B0736C6F7420310A0AE4BE8BE5A6820A0AE58F82E695B0E8AFB4E6988E0A0A2D2072756C65EFBC9A2061766961746F72E79A84626F6F6C65616EE8A1A8E8BEBEE5BC8F0A0AE58F82E695B0E5A682E4B88BEFBC9A0A0A6060600A7B0A20202272756C6522203A202274696D65203E2027323032302D31312D32322031313A35393A3030272026262076616C7565202A2032203C203520262620236E65737465642E6E5B305D2E6E31203D3D20276127220A7D0A6060600A0AE8BE93E585A5E5A682E4B88BEFBC9A0A0A6060600A7B22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A312C226E6573746564223A7B226E223A5B7B226E31223A2261227D5D7D7D0A7B22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A327D0A7B22686F7374223A2262222C2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A327D0A7B22686F7374223A2262222C2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A337D0A6060600A0AE8BE93E587BAE79A84E69DA1E4BBB6E4B8BA74727565E5A682E4B88BEFBC88736C6F742030EFBC89EFBC9A0A0A6060600A7B22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A312C226E6573746564223A7B226E223A5B7B226E31223A2261227D5D7D7D0A6060600A0AE8BE93E587BAE79A84E69DA1E4BBB6E4B8BA66616C7365E695B0E68DAEEFBC88736C6F742031EFBC89EFBC9A0A0A6060600A7B22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A327D0A7B22686F7374223A2262222C2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A327D0A7B22686F7374223A2262222C2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A337D0A606060, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313630393132343835333334382220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22323132332220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3532392E333434203332372E353532683136362E3137367637302E3433326331302E30343820392E39322032332E34353620392E39322033332E35333620306C3132372E3339322D38322E37326331302E30382D362E3632342031302E30382D31392E383420302D32392E37366C2D3132372E3339322D38362E3038632D31302E30382D392E39322D32332E3438382D392E39322D33332E35333620307636312E3932682D3139392E3731326C2D3133342E313132203233312E3638483232372E35383476302E313932483139332E353336632D31362E37363820302D33332E3533362031362E3534342D33332E3533362033332E3038387331362E3736382033332E3038382033332E3533362033332E303838683230312E3138346C2D302E3132382D302E32323468302E36346C3133342E30382D3233312E3631367A206D3139392E3638203239382E343634632D31302E3034382D392E39322D32332E3435362D392E39322D33332E35303420307636352E353336682D39392E3133366C2D3130302E3537362D3136352E34342D33332E3533362036362E3134347339332E383838203135352E3532203130302E353736203136352E3434683133322E3637327636362E38386331302E30343820392E39322032332E34353620392E39322033332E35303420306C3132372E3432342D38322E3735326331302E3034382D362E3632342031302E3034382D31392E383420302D32392E37366C2D3132372E3339322D38362E30387A222066696C6C3D22233333333333332220702D69643D2232313234223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.GeoIPJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.GeoIPJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"GeoIPJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"文本解析\",\"display\":\"IP地址反查地理信息\",\"description\":\"通过IPv4地址查询地理信息,可输出国家、省、市、乡镇、运营商\",\"doc\":\"GeoIPJob.md\",\"icon\":\"GeoIPJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"ipField\",\"label\":\"IP输入字段\",\"type\":[\"STRING\"],\"description\":\"IP字段名\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"outputPrefix\",\"label\":\"输出字段前缀\",\"type\":[\"STRING\"],\"description\":\"根据IP查询地理信息多个字段,可在字段名前设置统一的前缀\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'process', '', 0x23204950E59CB0E59D80E58F8DE69FA5E59CB0E79086E4BFA1E681AF0A0AE9809AE8BF8749507634E59CB0E59D80E69FA5E8AFA2E59CB0E79086E4BFA1E681AFEFBC8CE58FAFE8BE93E587BAE59BBDE5AEB6E38081E79C81E38081E5B882E38081E4B9A1E99587E38081E8BF90E890A5E595860A0A0AE4BE8BE5A6823A0A0AE58F82E695B0E5A682E4B88BEFBC9A0A0A2D2069704669656C643A20E68C87E5AE9A6970E5AD97E6AEB5E5908D0A2D206F7574707574507265666978EFBC9AE68C87E5AE9AE8BE93E587BAE59CB0E79086E4BFA1E681AFE5AD97E6AEB5E5908DE79A84E5898DE7BC80EFBC8CE4BBA5E981BFE5858DE8A686E79B96E58E9FE5A78BE697A5E5BF97E5AD97E6AEB50A0A6060600A7B0A20202269704669656C6422203A20226970222C0A2020226F757470757450726566697822203A2022656F695F220A7D0A6060600A0AE8BE93E585A5E5A682E4B88BEFBC9A0A0A6060600A7B0A202022697022203A20223136392E3233352E32342E313333220A7D0A7B0A202022697022203A20223232302E3234382E34342E3632220A7D0A7B0A202022697022203A20223138302E3136372E3135372E3930220A7D0A7B0A202022697022203A20223237382E3234382E34342E3632220A7D200A6060600A0AE8BE93E587BAE79A84E695B0E68DAEE5A682E4B88BEFBC9A0A0A6060600A7B22656F695F697370223A22E58AA0E5B79EE5A4A7E5ADA6222C226970223A223136392E3233352E32342E313333222C22656F695F70726F76696E6365223A22E585B6E4BB96222C22656F695F746F776E223A22E585B6E4BB96222C22656F695F63697479223A22E585B6E4BB96222C22656F695F636F756E747279223A22E7BE8EE59BBD227D0A7B22656F695F697370223A22E88194E9809A222C226970223A223232302E3234382E34342E3632222C22656F695F70726F76696E6365223A22E4B88AE6B5B7222C22656F695F746F776E223A22E585B6E4BB96222C22656F695F63697479223A22E585B6E4BB96222C22656F695F636F756E747279223A22E4B8ADE59BBD227D0A7B22656F695F697370223A22E794B5E4BFA1222C226970223A223138302E3136372E3135372E3930222C22656F695F70726F76696E6365223A22E4B88AE6B5B7222C22656F695F746F776E223A22E585B6E4BB96222C22656F695F63697479223A22E585B6E4BB96222C22656F695F636F756E747279223A22E4B8ADE59BBD227D0A7B226970223A223237382E3234382E34342E3632227D0A6060600A, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313630393231393334303535302220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22333935322220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3531322E3737383234203939332E37353130344C3335322E323536203735312E35313336413337352E383038203337352E383038203020302031203133362E3536303634203431312E3636383438433133362E3534303136203230342E3633363136203330342E39363736382033362E3230383634203531322033362E3230383634633230372E30313138342030203337352E3433393336203136382E3432373532203337352E3433393336203337352E34353938342030203135312E30383039362D38382E3633373434203238352E33323733362D3232362E3639333132203334342E38323137366C2D3134372E393638203233372E323630387A4D3531322039372E3634383634632D3137332E3135383420302D3331342E3031393834203134302E38363134342D3331342E3031393834203331342E3031393834613331342E3334373532203331342E3334373532203020302030203138372E3431323438203238372E34353732386C382E323332393620332E3632343936203131372E3539363136203137372E3431383234203130372E393239362D3137332E30353620392E33333838382D332E3732373336613331322E3730393132203331322E3730393132203020302030203139372E353239362D3239312E3731373132433832352E3939393336203233382E3531303038203638352E31333739322039372E3634383634203531322039372E36343836347A2220702D69643D2233393533223E3C2F706174683E3C7061746820643D224D3338302E3535393336203239342E37343831366834332E3935303038563536322E33383038682D34332E3935303038563239342E37343831367A2220702D69643D2233393534223E3C2F706174683E3C7061746820643D224D3433342E3734393434203537322E36323038682D36342E3433303038563238342E35303831366836342E3433303038563537322E363230387A206D2D34332E39353030382D32302E34386832332E3437303038563330342E3938383136682D32332E3437303038563535322E313430387A2220702D69643D2233393535223E3C2F706174683E3C7061746820643D224D3630342E3232313434203435382E39353638682D37322E3431373238763130332E343234682D34352E3231393834563239332E3435373932683132302E32333830386335382E363133373620322E35383034382039302E30353035362032392E37333639362039342E33373138342038312E34343839362D302E38383036342035352E31373331322D33332E32313835362038332E31383937362D39362E393732382038342E30343939327A206D2D332E383931322D3132352E3431393532682D36382E35343635367638362E36303939326836382E35343635366333372E303438333220302035352E363033322D31352E30373332382035352E363033322D34352E32343033322D312E373430382D32362E37303539322D32302E323735322D34302E35303934342D35352E363033322D34312E333639367A2220702D69643D2233393536223E3C2F706174683E3C7061746820643D224D3534322E3034343136203537322E36323038682D36352E3639393834563238332E3231373932683133302E34373830386338302E353437383420332E3534333034203130312E323733362035312E3334333336203130342E35373038382039302E38343932382D302E363134342034332E32393437322D31392E37323232342039332E39363232342D3130372E30323834382039352E31323936682D36322E3332303634763130332E3432347A206D2D34352E32343033322D32302E34386832342E3733393834762D3130332E3432346838322E36353732386335382E33343735322D302E37373832342038352E39333430382D32342E32383932382038362E37313233322D37332E39353332382D332E38373037322D34352E37393332382D33302E37363039362D36382E36383939322D38342E36303238382D37312E30363536682D3130392E3532373034563535322E313430387A206D3130332E353236342D3132312E3733333132682D37382E3738363536762D3130372E30383939326837382E37383635366335312E373733343420312E32363937362036342E33343831362032382E34303537362036352E38323237322035302E393333373620302E30323034382032312E33383131322D382E35343031362035362E31353631362D36352E38323237322035362E31353631367A206D2D35382E32383630382D32302E34386835382E33303635366334302E323032323420302034352E333633322D31382E37313837322034352E333633322D33352E30303033322D302E38333936382D31322E35333337362D362E34393231362D33302E31383735322D34352E36303839362D33312E31323936682D35382E303630387636362E31323939327A2220702D69643D2233393537223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.GrokParseJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.GrokParseJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]},{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"GrokParseJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"文本解析\",\"display\":\"正则解析\",\"description\":\"对指定的字段进行正则解析,从而提取需要的字段。支持使用%{xxx}来引用预先定义的正则规则\",\"doc\":\"GrokParseJob.md\",\"icon\":\"GrokParseJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"sourceField\",\"label\":\"输入字段\",\"type\":[\"STRING\"],\"description\":\"需要正则解析字段名\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"matches\",\"label\":\"正则表达式\",\"type\":[\"LIST\"],\"description\":\"使用正则表达式提取内容\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":{\"apiVersion\":0,\"name\":null,\"label\":null,\"type\":[\"STRING\"],\"description\":null,\"optional\":false,\"defaultValue\":null,\"placeholder\":null,\"candidates\":null,\"inputType\":null,\"range\":null,\"regex\":null,\"order\":0,\"requireCondition\":null,\"availableCondition\":null,\"listParameter\":null,\"objectParameters\":null},\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"outputField\",\"label\":\"输出字段\",\"type\":[\"STRING\"],\"description\":\"解析结果输出到指定字段下,如果设置了输出字段名,解析结果将作为这个字段的子对象存在。如果不设置,解析结果将放置在最外层\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'process', '', 0x2320E6ADA3E58899E8A7A3E69E900A0AE5AFB9E68C87E5AE9AE79A84E5AD97E6AEB5E8BF9BE8A18CE6ADA3E58899E8A7A3E69E90EFBC8CE4BB8EE8808CE68F90E58F96E99C80E8A681E79A84E5AD97E6AEB5E38082E694AFE68C81E4BDBFE794A8257B7878787DE69DA5E5BC95E794A8E9A284E58588E5AE9AE4B989E79A84E6ADA3E58899E8A784E58899E380820AE68890E58A9FE8A7A3E69E90E8BE93E587BAE588B0736C6F742030EFBC8CE5A4B1E8B4A5E8BE93E587BAE588B0736C6F742031E380820A0A232320E7A4BAE4BE8B310A0AE8AFA5E4BE8BE5AD90E5B195E7A4BAE4BA86E5A682E4BD95E68F90E58F9674696D657374616D70E5928C70696E674D73670A0AE58E9FE5A78BE697A5E5BF973A0A0A6060606A736F6E0A7B0A2020226D65737361676522203A20225B313536323734363036303030303030305D2036342062797465732066726F6D203138302E3130312E34392E313220283138302E3130312E34392E3132293A2069636D705F7365713D312074746C3D35312074696D653D382E3334206D73220A7D0A6060600A0AE8A7A3E69E90E8A784E588993A0A0A6060606A736F6E0A7B0A202022736F757263654669656C6422203A20226D657373616765222C0A2020226D617463686573223A205B0A20202020225C5C5B283F3C74696D657374616D703E2E2A3F295C5C5D20283F3C70696E674D73673E2E2A29220A20205D0A7D0A6060600A0AE7BB93E69E9CEFBC9A0A6060606A736F6E0A7B0A2020226D65737361676522203A20225B313536323734363036303030303030305D2036342062797465732066726F6D203138302E3130312E34392E313220283138302E3130312E34392E3132293A2069636D705F7365713D312074746C3D35312074696D653D382E3334206D73222C0A20202274696D657374616D7022203A202231353632373436303630303030303030222C0A20202270696E674D736722203A202236342062797465732066726F6D203138302E3130312E34392E313220283138302E3130312E34392E3132293A2069636D705F7365713D312074746C3D35312074696D653D382E3334206D73220A7D0A6060600A0A232320E7A4BAE4BE8B320A0AE8AFA5E4BE8BE5AD90E5B195E7A4BAE4BA86E5A682E4BD95E7BB93E59088E887AAE5AE9AE4B989E68F90E58F96E5928CE9A284E5AE9AE4B989E68F90E58F96EFBC8CE585B6E4B8ADE79A8460247B555345527D60E5928C60247B444154417D60E983BDE698AFE9A284E5AE9AE4B989E79A84E6ADA3E58899E38082E6AF94E5A68260247B555345527D60E4BBA3E8A1A8605B612D7A412D5A302D392E5F2D5D2B60E380820A60257B555345523A757365727D60E8A1A8E7A4BAE4BDBFE794A8E4B88EE5AE9AE4B989E79A8460247B555345527D60E68F90E58F96E4BFA1E681AFEFBC8CE5B9B6E5B086E7BB93E69E9CE8AEBEE7BDAEE588B0E5AD97E6AEB5607573657260E4B88AE380820A0AE58E9FE5A78BE697A5E5BF973A0A0A6060606A736F6E0A7B0A2020226D65737361676522203A2022323031352D31322D32375431353A34343A31392B30383030206368696C6465202D207468697320697320612074657374206C696E65220A7D0A6060600A0AE8A7A3E69E90E8A784E588993A0A0A6060606A736F6E0A7B0A202022736F757263654669656C6422203A20226D657373616765222C0A2020226D617463686573223A205B0A20202020225E283F3C6C6F6774696D653E5C5C532B2920257B555345523A757365727D20282D7C283F3C6C6576656C3E5C5C772B292920257B444154413A6D73677D24220A20205D0A7D0A6060600A0AE7BB93E69E9CEFBC9A0A6060606A736F6E0A7B0A2020227573657222203A20226368696C6465222C0A2020226C6F6774696D6522203A2022323031352D31322D32375431353A34343A31392B30383030222C0A2020226D736722203A20227468697320697320612074657374206C696E65222C0A2020226D65737361676522203A2022323031352D31322D32375431353A34343A31392B30383030206368696C6465202D207468697320697320612074657374206C696E65220A7D0A6060600A0A232320E7A4BAE4BE8B330A0AE8AFA5E4BE8BE5AD90E698AFE4B880E4B8AAE585B8E59E8BE79A84617061636865E697A5E5BF97E79A84E8A7A3E69E90EFBC8CE4BDBFE794A8E9A284E5AE9AE4B989E6ADA3E58899E883BDE69E81E5A4A7E79A84E7AE80E58C96E8A7A3E69E90E8A784E58899E79A84E7BC96E58699E380820A0AE58E9FE5A78BE697A5E5BF973A0A0A6060606A736F6E0A7B0A2020226D65737361676522203A20223137322E31362E3132382E3238202D202D205B31342F4A756E2F323031393A30333A35383A3132202B303830305D205C22474554202F6170692F69746F612F6E6F746963652F6E6F74696365496E626F782F627562626C65496E626F7820485454502F312E315C222032303020313036205C22687474703A2F2F3139322E3136382E33312E39322F3239393839383130343939393933362F6D616E6167656D656E742F66696C7465722F3F656469743D315C22205C224D6F7A696C6C612F352E3020284D6163696E746F73683B20496E74656C204D6163204F5320582031305F31335F3429204170706C655765624B69742F3533372E333620284B48544D4C2C206C696B65204765636B6F29204368726F6D652F37332E302E333638332E3836205361666172692F3533372E33365C22205C222D5C2220302E303136220A7D0A6060600A0AE8A7A3E69E90E8A784E588993A0A0A6060606A736F6E0A7B0A202022736F757263654669656C6422203A20226D657373616765222C0A2020226D617463686573223A205B0A2020202022257B434F4D4D4F4E4150414348454C4F477D20257B51533A72656665727265727D20257B51533A6167656E747D205C22283F3C78666F7277617264666F723E5B302D395C5C2D5D2B295C2220283F3C7265717565737474696D653E5B302D395C5C2E5D2B29220A20205D0A7D0A6060600A0AE7BB93E69E9CEFBC9A0A6060606A736F6E0A7B0A2020226D65737361676522203A20223137322E31362E3132382E3238202D202D205B31342F4A756E2F323031393A30333A35383A3132202B303830305D205C22474554202F6170692F69746F612F6E6F746963652F6E6F74696365496E626F782F627562626C65496E626F7820485454502F312E315C222032303020313036205C22687474703A2F2F3139322E3136382E33312E39322F3239393839383130343939393933362F6D616E6167656D656E742F66696C7465722F3F656469743D315C22205C224D6F7A696C6C612F352E3020284D6163696E746F73683B20496E74656C204D6163204F5320582031305F31335F3429204170706C655765624B69742F3533372E333620284B48544D4C2C206C696B65204765636B6F29204368726F6D652F37332E302E333638332E3836205361666172692F3533372E33365C22205C222D5C2220302E303136222C0A202022636C69656E74497022203A20223137322E31362E3132382E3238222C0A2020226964656E7422203A20222D222C0A2020226175746822203A20222D222C0A20202274696D657374616D7022203A202231342F4A756E2F323031393A30333A35383A3132202B30383030222C0A2020227665726222203A2022474554222C0A2020227265717565737422203A20222F6170692F69746F612F6E6F746963652F6E6F74696365496E626F782F627562626C65496E626F78222C0A2020226874747076657273696F6E22203A2022312E31222C0A202022726573706F6E736522203A2022323030222C0A202022627974657322203A2022313036222C0A202022726566657272657222203A20225C22687474703A2F2F3139322E3136382E33312E39322F3239393839383130343939393933362F6D616E6167656D656E742F66696C7465722F3F656469743D315C22222C0A2020226167656E7422203A20225C224D6F7A696C6C612F352E3020284D6163696E746F73683B20496E74656C204D6163204F5320582031305F31335F3429204170706C655765624B69742F3533372E333620284B48544D4C2C206C696B65204765636B6F29204368726F6D652F37332E302E333638332E3836205361666172692F3533372E33365C22222C0A20202278666F7277617264666F7222203A20222D222C0A2020227265717565737474696D6522203A2022302E303136220A7D0A606060, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313630393932363739383631362220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22363831302220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3933392E3532203436352E3932632D31392E39363820302D33352E38342031352E3837322D33352E38342033352E3834763236312E31326135362E3135382035362E3135382030203020312D35362E33322035362E3332682D3636352E366135362E3135382035362E3135382030203020312D35362E33322D35362E3332563530322E37383463302D31392E3936382D31352E3837322D33352E38342D33352E38342D33352E3834732D33352E38342031352E3837322D33352E38342033352E3834563736322E383863302037302E3635362035372E333434203132382031323820313238683636352E366337302E3635362030203132382D35372E333434203132382D313238563530312E373663302D31392E3936382D31352E3837322D33352E38342D33352E38342D33352E38347A222066696C6C3D22233263326332632220702D69643D2236383131223E3C2F706174683E3C7061746820643D224D3138392E393532203635332E33313263302031392E3936382031302E3735322033302E3230382033322E3736382033302E3230382031392E39363820302033312E3233322D31302E32342033322E3736382D33302E323038762D3230392E39326C3230392E3932203232372E383463382E31393220382E3139322031372E39322031312E3737362033302E3230382031312E3737362031372E393220302032382E31362D372E3136382033302E3230382D32302E39393220302D31302E32342D342E3039362D31392E3936382D31312E3737362D33302E3230384C3333392E393638203434302E33326833302E3230386339352E3734342D332E353834203134342E3839362D35352E383038203134362E3934342D3135352E3634382D382E3139322D38382E3036342D36322E3937362D3133372E3231362D3136342E3836342D3134362E393434483232352E373932632D32362E31313220302D33372E3838382031312E3737362D33352E38342033352E3834763437392E3734347A4D323536203139342E35366839332E3138346336312E39353220342E3039362039362E3235362033342E383136203130312E3838382039332E31383420322E3034382037302E3134342D33322E323536203130332E3933362D3130312E383838203130312E38383848323536563139342E35367A206D3336362E3038203438382E3936683139352E3037326331392E39363820302033312E3233322D31302E32342033322E3736382D33302E3230382D322E3034382D31392E3936382D31322E382D33312E3233322D33322E3736382D33322E373638483635322E323838563434302E3332683135302E3031366331392E39363820302033312E3233322D31302E32342033322E3736382D33302E3230382D322E3034382D31392E3936382D31322E382D33312E3233322D33322E3736382D33322E373638483635322E323838762D3137362E3634683136342E3836346331392E39363820302033312E3233322D31302E3735322033322E3736382D33322E3736382D322E3034382D31372E39322D31322E382D32382E31362D33322E3736382D33302E323038483632322E3038632D32362E31313220302D33372E3838382031312E3737362D33352E38342033352E3834563634372E3638632D322E35362032342E30363420392E3732382033352E38342033352E38342033352E38347A222066696C6C3D22233263326332632220702D69643D2236383132223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.GsubJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.GsubJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]},{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"GsubJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"文本解析\",\"display\":\"文本替换\",\"description\":\"对字符串进行普通或正则替换\",\"doc\":\"GsubJob.md\",\"icon\":\"GsubJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"sourceField\",\"label\":\"输入字段\",\"type\":[\"STRING\"],\"description\":\"需要替换字段名\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"replaceMatch\",\"label\":\"被替换的值\",\"type\":[\"STRING\"],\"description\":\"被替换的值被替换成替换成的值\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"replaceValue\",\"label\":\"替换成的值\",\"type\":[\"STRING\"],\"description\":\"被替换的值被替换成替换成的值\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"regexReplace\",\"label\":\"是否使用正则替换\",\"type\":[\"BOOL\"],\"description\":\"是否使用正则替换,默认不使用\",\"optional\":true,\"defaultValue\":\"false\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"outputField\",\"label\":\"输出字段\",\"type\":[\"STRING\"],\"description\":\"解析结果输出到指定字段下,如果设置了输出字段名,解析结果将作为这个字段的子对象存在。如果不设置,解析结果将放置在最外层\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'process', '', 0x2320E69687E69CACE69BBFE68DA20A0AE5AFB9E5AD97E7ACA6E4B8B2E8BF9BE8A18CE699AEE9809AE69BBFE68DA2E68896E6ADA3E58899E69BBFE68DA20A0A2D20736C6F742030EFBC8CE8BDACE68DA2E68890E58A9FE7BB93E69E9C0A2D20736C6F742031EFBC8CE8BDACE68DA2E5A4B1E8B4A5E695B0E68DAE0A0A232320E7A4BAE4BE8B310A0AE5B086602C60E69BBFE68DA2E4B8BA602D60EFBC8CE58F82E695B0E5A682E4B88BEFBC9A0A0A6060606A736F6E0A7B0A202022736F757263654669656C64223A20226D657373616765222C0A2020227265706C6163654D61746368223A20222C222C0A2020227265706C61636556616C7565223A20222D220A7D0A6060600A0AE8BE93E585A5E695B0E68DAEEFBC9A0A6060606A736F6E0A7B0A2020226D657373616765223A20226368696E612C7368616E676861692C7075646F6E67220A7D0A6060600A0AE8BE93E587BAE695B0E68DAEEFBC9A0A6060606A736F6E0A7B0A2020226D657373616765223A20226368696E612D7368616E676861692D7075646F6E67220A7D0A6060600A0A232320E7A4BAE4BE8B320A0AE4BDBFE794A8E6ADA3E58899E69BBFE68DA2E5AFB9E6898BE69CBAE58FB7E8BF9BE8A18CE68EA9E7A081EFBC8C60243160E5928C60243360E68C87E6ADA3E58899E58CB9E9858DE79A84E7ACAC31E7BB84E5928CE7ACAC33E7BB84E79A84E580BC0A0A6060606A736F6E0A7B0A202022736F757263654669656C64223A20226D657373616765222C0A20202272656765785265706C616365223A20747275652C0A2020227265706C6163654D61746368223A2022285C5C647B337D29285C5C647B347D29285C5C647B347D29222C0A2020227265706C61636556616C7565223A202224312A2A2A2A2433220A7D0A6060600A0AE8BE93E585A5E695B0E68DAEEFBC9A0A6060606A736F6E0A7B0A2020226D657373616765223A20223138393634373232333637220A7D0A6060600A0AE8BE93E587BAE695B0E68DAEEFBC9A0A6060606A736F6E0A7B0A2020226D657373616765223A20223138392A2A2A2A32333637220A7D0A606060, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313630393932363937343837382220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22373633352220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3333362E36203435352E39563334302E32483731366334302E3220302037352E312032352E352039322E362036322E372031332E312D32302E382032302E372D34362E312032302E372D37332E3620302D37302E352D35312D3132372E362D3131342D3132372E36483333362E365638352E3663302D31372E312D31372E322D32372D32392E362D31372E324C37322E37203235332E36632D31302E3720382E342D31302E3720323620302033342E344C333037203437322E396331322E342031302032392E3620302032392E362D31377A206D3631342E38203238306C2D3233342E332D313835632D31322E352D392E382D32392E3720302E312D32392E372031372E32763131352E3748333038632D34302E3220302D37352E312D32352E352D39322E362D36322E362D31332E312032302E382D32302E372034362E312D32302E372037332E3620302037302E35203531203132372E3620313134203132372E36683337382E38763131362E3163302031372E312031372E332032372032392E372031372E326C3233342E332D3138356331302E352D382E372031302E352D32362E342D302E312D33342E387A2220702D69643D2237363336223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.JavascriptProcessJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.JavascriptProcessJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"JavascriptProcessJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"专用算子\",\"display\":\"JS脚本处理\",\"description\":\"使用javascript当成flatMap处理每一条数据,返回一条或多条数据\",\"doc\":\"JavascriptProcessJob.md\",\"icon\":\"JavascriptProcessJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"script\",\"label\":\"js脚本\",\"type\":[\"STRING\"],\"description\":\"javascript脚本代码处理数据。可在脚本中使用`doc`作为输入的json对象,脚本的最后一行为结果返回给引擎(不需要return关键字)。可以用数组返回多个对象,相当于flatMap。如果返回null,视为丢弃这条记录(相当于过滤的功能)\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"JAVASCRIPT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"ignoreException\",\"label\":\"忽略异常\",\"type\":[\"BOOL\"],\"description\":\"是否忽略执行脚本过程过的异常。如果异常抛出可能会使得任务失败。建议在调试阶段设置为false,生产运行设置为true\",\"optional\":true,\"defaultValue\":\"true\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'process', '', 0x23204A53E8849AE69CACE5A484E790860A0AE9809AE8BF876A617661736372697074E5AFB9E695B0E68DAEE8BF9BE8A18C31E5AFB931EFBC8CE68896E8808531E5AFB94EE8A7A3E69E90E38082E8BE93E585A5E79A844D6170E7B1BBE59E8BE79A84E695B0E68DAEEFBC8CE59CA86A73E4B8ADE8A786E4B8BA2060646F6360206A736F6EE5AFB9E8B1A1E38082E58FAFE4BDBFE794A86A73E8AFADE8A880E5AFB960646F6360E5AFB9E8B1A1E8BF9BE8A18CE4BFAEE694B9E380820A6A73E4BBA3E7A081E79A84E69C80E5908EE4B880E8A18CE7BB93E69E9CE4BC9AE4BD9CE4B8BAE69C80E7BB88E7BB93E69E9CE8BF94E59B9EEFBC8CE58FAFE4BBA5E698AFE4B880E4B8AAE5AFB9E8B1A1EFBC8CE4B99FE58FAFE4BBA5E698AFE4B880E4B8AAE695B0E7BB84E38082E5A682E69E9CE698AFE5AFB9E8B1A1EFBC8CE79BB8E5BD93E4BA8E31E5AFB931E8A7A3E69E90EFBC9BE5A682E69E9CE698AFE695B0E7BB84EFBC8CE79BB8E5BD93E4BA8E31E5AFB94EE8A7A3E69E90E380820AE58FA6E5A496E4B880E7A78DE789B9E6AE8AE68385E586B5E698AFEFBC8CE5A682E69E9CE8BF94E59B9E6E756C6CEFBC8CE8A1A8E7A4BAE4B8A2E5BC83E8BF99E69DA1E695B0E68DAEE380820A0A6A617661736372697074E59CA8E5A484E790866A736F6EE5AFB9E8B1A1E79A84E697B6E58099EFBC8CE585B7E69C89E696B9E4BEBFE781B5E6B4BBE79A84E789B9E782B9E380820A6A73E5BC95E6938E286E6173686F726E29E5AE8CE585A8E694AFE68C812045434D4153637269707420352E3120E8A784E88C83E4BBA5E58F8AE4B880E4BA9BE689A9E5B195E380820A0AE4BE8BE5A682E8BE93E585A5E79A84E6B688E681AFE5A682E4B88BEFBC88E6ADA4E6B688E681AFE58FAFE883BDE698AFE7BB8FE8BF87E6ADA3E58899E68F90E58F96E5908EE79A84776562E8AEBFE997AEE697A5E5BF97EFBC8CE79C81E795A5E4BA86E697A0E585B3E79A84E5AD97E6AEB5EFBC89EFBC9A0A0A6060600A7B226279746573223A202234303536222C202275726C223A20222F6170692F76312F6A617273222C2022636F6465223A2022323030222C20227265737054696D65223A20223230227D0A7B226279746573223A2022323839373637222C202275726C223A20222F6170692F76312F6A6F6273222C2022636F6465223A2022323030222C20227265737054696D65223A2022323030227D0A7B226279746573223A20223138373631313837222C202275726C223A20222F6170692F76312F66696C652F44476464617953222C2022636F6465223A2022323030222C20227265737054696D65223A202235353030227D0A7B226279746573223A202232333438222C202275726C223A20222F6170692F76312F6A6172732F31222C2022636F6465223A2022323030222C20227265737054696D65223A20223230227D0A7B226279746573223A2022323330222C202275726C223A20222F6170692F76312F6161222C2022636F6465223A2022343034222C20227265737054696D65223A20223230227D0A7B226279746573223A2022323330222C202275726C223A20222F6170692F76312F6262222C2022636F6465223A2022343034222C20227265737054696D65223A20223139227D0A7B226279746573223A202235333431222C202275726C223A20222F6170692F76312F6262222C2022636F6465223A2022353030222C20227265737054696D65223A20223330227D0A7B226279746573223A202231303235222C202275726C223A20222F6170692F76312F61757468222C2022636F6465223A2022343033222C20227265737054696D65223A20223334227D0A6060600A0AE5B88CE69C9BE5819AE5A682E4B88BE8A7A3E69E900A0A312E20E5B08620627974657320E8BDACE58C96E4B8BA20666C6F617420E7B1BBE59E8BEFBC8CE4BF9DE79599203220E4BD8DE5B08FE695B00A322E20E6A0B9E68DAE20627974657320E5A4A7E5B08FEFBC8CE5A29EE58AA0203120E4B8AAE5AD97E6AEB5EFBC8CE5A682E69E9C206279746573203C2031303234EFBC8CE5A29EE58AA0206477203D206279746573EFBC8C20E5A682E69E9C206279746573203E2031303234EFBC8C206279746573203D206279746573202F2031303234EFBC8CE5A29EE58AA0206477203D206B62EFBC8C20E5A682E69E9C206279746573203E2031303234202A2031303234EFBC8C206279746573203D206279746573202F2031303234202F203130323420EFBC8CE7AD89E4BBB7206477203D206D62200A332E20E5B08620726573706F6E736520E8BF94E59B9EE7A081E69BBFE68DA2E4B8BAE4B8ADE69687E8AFB4E6988EEFBC8CE5A682203178783A20E69C8DE58AA1E599A8E694B6E588B0E8AFB7E6B182203278783A20E8AFB7E6B182E68890E58A9F203378783A20E9878DE5AE9AE5909120347878EFBC9AE5AEA2E688B7E7ABAFE99499E8AFAF203578783A20E69C8DE58AA1E599A8E99499E8AFAFEFBC8CE6B3A8E6848FE698AFE69BBFE68DA2EFBC8CE4B88DE698AFE696B0E5A29EE5AD97E6AEB50A0A736372697074E5A682E4B88BEFBC9A0A0A6060606A6176617363726970740A766172206477203D20646F632E62797465733B0A696620286477203E2031303234202A203130323429200A202020206477203D20287061727365466C6F617428646F632E6279746573292F313032342E302F313032342E30292E746F4669786564283229202B20276D62273B200A656C736520696620286477203E203130323429200A202020206477203D20287061727365466C6F617428646F632E6279746573292F313032342E30292E746F4669786564283229202B20276B62273B0A76617220636F64655F64657363203D20646F632E636F64653B200A69662028646F632E636F64652E73746172747357697468282731272929200A20202020636F64655F64657363203D2027E69C8DE58AA1E599A8E694B6E588B0E8AFB7E6B182273B200A656C73652069662028646F632E636F64652E73746172747357697468282732272929200A20202020636F64655F64657363203D2027E8AFB7E6B182E68890E58A9F273B200A656C73652069662028646F632E636F64652E73746172747357697468282733272929200A20202020636F64655F64657363203D2027E9878DE5AE9AE59091273B200A656C73652069662028646F632E636F64652E73746172747357697468282734272929200A20202020636F64655F64657363203D2027E5AEA2E688B7E7ABAFE99499E8AFAF273B200A656C73652069662028646F632E636F64652E73746172747357697468282735272929200A20202020636F64655F64657363203D2027E69C8DE58AA1E599A8E99499E8AFAF273B200A646F632E6477203D2064773B200A646F632E636F6465203D20636F64655F646573633B200A646F630A6060600A0A0AE8BE93E587BAE79A84E695B0E68DAEE5A682E4B88BEFBC9A0A0A6060600A7B22636F6465223A22E8AFB7E6B182E68890E58A9F222C226279746573223A2234303536222C227265737054696D65223A223230222C2275726C223A222F6170692F76312F6A617273222C226477223A22332E39366B62227D0A7B22636F6465223A22E8AFB7E6B182E68890E58A9F222C226279746573223A22323839373637222C227265737054696D65223A22323030222C2275726C223A222F6170692F76312F6A6F6273222C226477223A223238322E39386B62227D0A7B22636F6465223A22E8AFB7E6B182E68890E58A9F222C226279746573223A223138373631313837222C227265737054696D65223A2235353030222C2275726C223A222F6170692F76312F66696C652F44476464617953222C226477223A2231372E38396D62227D0A7B22636F6465223A22E8AFB7E6B182E68890E58A9F222C226279746573223A2232333438222C227265737054696D65223A223230222C2275726C223A222F6170692F76312F6A6172732F31222C226477223A22322E32396B62227D0A7B22636F6465223A22E5AEA2E688B7E7ABAFE99499E8AFAF222C226279746573223A22323330222C227265737054696D65223A223230222C2275726C223A222F6170692F76312F6161222C226477223A22323330227D0A7B22636F6465223A22E5AEA2E688B7E7ABAFE99499E8AFAF222C226279746573223A22323330222C227265737054696D65223A223139222C2275726C223A222F6170692F76312F6262222C226477223A22323330227D0A7B22636F6465223A22E69C8DE58AA1E599A8E99499E8AFAF222C226279746573223A2235333431222C227265737054696D65223A223330222C2275726C223A222F6170692F76312F6262222C226477223A22352E32326B62227D0A7B22636F6465223A22E5AEA2E688B7E7ABAFE99499E8AFAF222C226279746573223A2231303235222C227265737054696D65223A223334222C2275726C223A222F6170692F76312F61757468222C226477223A22312E30306B62227D0A606060, 0x3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D227574662D38223F3E0D0A3C212D2D2047656E657261746F723A2041646F626520496C6C7573747261746F722031362E302E342C20535647204578706F727420506C75672D496E202E205356472056657273696F6E3A20362E3030204275696C6420302920202D2D3E0D0A3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E0D0A3C7376672076657273696F6E3D22312E31222069643D224C617965725F312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B2220783D223070782220793D22307078220D0A092077696474683D22313236707822206865696768743D223132367078222076696577426F783D2230203020313236203132362220656E61626C652D6261636B67726F756E643D226E65772030203020313236203132362220786D6C3A73706163653D227072657365727665223E0D0A3C7061746820643D224D39382E3237372C33342E343434632D302E3030342D302E3436392D302E3135342D302E39332D302E3437352D312E3239354C37382E3133372C31302E363834632D302E3030362D302E3030362D302E3031322D302E3030382D302E3031362D302E3031340D0A09632D302E3131372D302E3133312D302E3235342D302E32342D302E3339382D302E333334632D302E3034332D302E3032392D302E3038362D302E3035332D302E3133312D302E303738632D302E3132352D302E3036382D302E3235382D302E3132352D302E3339352D302E3136360D0A09632D302E3033372D302E30312D302E30372D302E3032352D302E3130372D302E3033354337362E3934312C31302E3032322C37362E3738372C31302C37362E3633312C31304832382E323939632D322E3230372C302D342C312E3739352D342C3476393463302C322E3230352C312E3739332C342C342C346836360D0A0963322E3230352C302C342D312E3739352C342D345633342E3636374339382E3239392C33342E3539322C39382E3238372C33342E3531382C39382E3237372C33342E3434347A204D34382E3038362C3130362E353038632D312E3238352C302D322E3937332D302E3231392D342E3037342D302E3538360D0A096C302E3632352D342E35313463302E37372C302E3235382C312E37362C302E3434312C322E3836312C302E34343163322E3334382C302C332E3831342D312E3036362C332E3831342D342E3931385638312E33373768352E3537387631352E36323968302E3030310D0A094335362E3839312C3130342E3035312C35332E3531362C3130362E3530382C34382E3038362C3130362E3530387A204D36372E3630342C3130362E343731632D322E3832342C302D352E36312D302E3733342D372E3030352D312E3530346C312E3133372D342E3632330D0A0963312E3530342C302E3737312C332E3831362C312E3534312C362E3230312C312E35343163322E3536382C302C332E3932342D312E3036322C332E3932342D322E36373863302D312E3534312D312E3137342D322E3432322D342E3134352D332E3438340D0A09632D342E3130392D312E3433322D362E3738372D332E3730352D362E3738372D372E33303163302D342E3231392C332E3532312D372E3434372C392E3335342D372E34343763322E3738382C302C342E3834342C302E3538362C362E3331312C312E3234386C2D312E3234352C342E3531320D0A09632D302E3939322D302E3437372D322E3735322D312E3137342D352E3137352D312E313734632D322E34322C302D332E3539362C312E3130332D332E3539362C322E33383563302C312E3537362C312E3339362C322E3237352C342E3538382C332E3438340D0A0963342E3336342C312E3631352C362E34322C332E3838392C362E34322C372E3337334337372E3538342C3130322E3934392C37342E3339312C3130362E3437312C36372E3630342C3130362E3437317A204D39342E3239392C37372E393136682D36365631346834362E3333327632302E3436350D0A0963302C312E3130352C302E3839362C322C322C326831372E3636385637372E3931367A204D37362E35322C35322E373463302E3436312C302E3935362C302E3636352C312E3932332C302E3636352C332E313663302C312E3933382D302E36312C332E3438332D312E3834392C342E3637380D0A09632D312E3136332C312E3132392D322E3636352C312E3739332D342E3636372C322E303735632D302E3739372C302E3130392D322E3335372C302E3131342D332E3138392C30632D332E3138312D302E3432362D352E3533352D312E3931322D372E3034312D342E3434390D0A09632D302E3139332D302E3331362D302E3233322D302E34322D302E3138332D302E34363563302E3037392D302E3037342C332E38352D322E3234392C332E3839352D322E32343963302E30322C302C302E3136332C302E3138382C302E3332322C302E3431360D0A0963312E3135392C312E3731342C322E3630312C322E3530372C342E3533322C322E35303763312E3134352C302C322E3036362D302E3331322C322E36352D302E39303263302E3137342D302E3137332C302E3336362D302E3433312C302E3434312D302E3538340D0A0963302E3338312D302E3739332C302E3231332D312E3832382D302E3339322D322E343737632D302E34392D302E3532352D312E3235392D302E3934372D332E3332342D312E383333632D312E3531372D302E3635342D322E3339332D312E3037352D332E3033372D312E3436320D0A09632D322E3533312D312E3533312D332E3636372D332E3436332D332E3636372D362E32323863302D312E3834382C302E3537352D332E3330342C312E3737382D342E34393863312E3137312D312E3135392C322E3734312D312E3833332C342E3631332D312E3938310D0A0963302E3730392D302E3035352C302E3830382D302E3035352C312E3536312C302E30303563312E3533362C302E3131342C322E372C302E3438352C332E37392C312E32303963302E35392C302E3339322C312E3434372C312E3238332C312E3932322C312E3939360D0A0963302E3232342C302E3333372C302E3430372C302E3632342C302E3430372C302E36343563302C302E3033342D332E3630322C322E3336332D332E37332C322E343138632D302E30342C302E3031342D302E3135342D302E3131392D302E3330382D302E3336320D0A09632D302E3133342D302E3231332D302E3432312D302E3536342D302E3634352D302E373832632D302E3632392D302E3633352D312E3234382D302E3838322D322E3230342D302E383832632D302E3834322D302E3030362D312E3338372C302E3230372D312E3835372C302E3731380D0A09632D302E3332372C302E3335322D302E3437362C302E3731332D302E3531312C312E323438632D302E3033392C302E3637342C302E3134352C312E3231342C302E3537342C312E36373563302E3435312C302E34382C312E3133362C302E3835372C332E3137362C312E3733330D0A0963322E372C312E31362C342E3035332C312E3936322C352E3039382C332E3032324337352E3838372C35312E3634362C37362E3230332C35322E3038352C37362E35322C35322E37347A204D35352E3038382C33382E36393668322E34323876382E3738330D0A0963302C352E3832362D302E30322C382E3932322D302E30352C392E313939632D302E3334322C322E3733392D312E3633342C342E3538322D332E3833392C352E343735632D312E3833382C302E3733372D342E3334352C302E3739382D362E3239372C302E3134380D0A09632D312E3834372D302E3631352D332E3338332D312E3935322D342E32372D332E3732316C2D302E3134392D302E3239376C312E3935372D312E31383963312E3037352D302E3634382C312E3937322D312E3138382C312E3939312D312E3139380D0A0963302E3031362D302E3030362C302E3134352C302E3138382C302E3238382C302E34323663302E3838362C312E3531372C312E3634392C322E3035362C322E3932332C322E30353163302E3839322D302E3030352C312E3432362D302E3137392C312E3834332D302E3539350D0A0963302E3239372D302E3239372C302E3436362D302E3631392C302E3630392D312E3135396C302E3130392D302E3431316C302E3031352D382E3735396C302E30322D382E3735334835352E3038387A222F3E0D0A3C2F7376673E0D0A, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.JsonDecoderJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.JsonDecoderJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]},{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"JsonDecoderJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"文本解析\",\"display\":\"解码器(JSON)\",\"description\":\"把byte数组转换为String,然后按json格式decode,输出slot 0 为decode成功数据,输出slot 1 为decode失败数据(错误原因添加在error_msg字段) \",\"doc\":\"JsonDecoderJob.md\",\"icon\":\"JsonDecoderJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"byteArrayFieldName\",\"label\":\"输入字段\",\"type\":[\"STRING\"],\"description\":\"从上游的Map中指定目标字段名,字段值需要是二进制数组(byte[])类型\",\"optional\":true,\"defaultValue\":\"bytes\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"outputFieldName\",\"label\":\"输出字段\",\"type\":[\"STRING\"],\"description\":\"如果指定Decoder后内容输出到指定的字段名,如果不指定则输出为整个顶层Map\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"removeByteArrayField\",\"label\":\"移除输入字段\",\"type\":[\"BOOL\"],\"description\":\"是否移除目标字段\",\"optional\":true,\"defaultValue\":\"true\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"reserveOriginColumns\",\"label\":\"是否保留原有字段\",\"type\":[\"BOOL\"],\"description\":\"当未指定输出字段时,输出为整个顶层Map,是否同时保留原有字段\",\"optional\":true,\"defaultValue\":\"false\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"charset\",\"label\":\"字符编码\",\"type\":[\"STRING\"],\"description\":\"例如标准编码:US-ASCII,ISO-8859-1,UTF-8,UTF-16BE,UTF-16LE,UTF-16\",\"optional\":true,\"defaultValue\":\"UTF-8\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'process', '', 0x2320E8A7A3E7A08162797465E695B0E7BB84E4B8BA4A534F4EE6A0BCE5BC8F0A0AE58588E68A8A62797465E695B0E7BB84E8BDACE68DA2E4B8BA537472696E67EFBC8CE784B6E5908EE68C896A736F6EE6A0BCE5BC8F6465636F6465EFBC8C0A2D20E8BE93E587BA736C6F742030EFBC8C20E7B1BBE59E8BE4B8BA604D61703C537472696E672C204F626A6563743E60EFBC8C6465636F6465E68890E58A9FE695B0E68DAE0A2D20E8BE93E587BA736C6F742031EFBC8C20E7B1BBE59E8BE4B8BA604D61703C537472696E672C204F626A6563743E60EFBC8C6465636F6465E5A4B1E8B4A5E695B0E68DAEEFBC88E99499E8AFAFE58E9FE59BA0E6B7BBE58AA0E59CA86572726F725F6D7367E5AD97E6AEB5EFBC890A0AE4BE8BE5A682E8BE93E585A5E79A84E6B688E681AFE5A682E4B88BEFBC9A0A0A6060600A7B0A2020226279746573223A202265794A304D534936496E517849697769644449694F694A304D694973496E517A496A6F6964444D694C434A416147397A64473568625755694F694A7362324E6862476876633351694C434A41634746306143493649693932595849766247396E4C32356E615735344C32466A5932567A63793573623263694C434A41636D3933626E5674596D5679496A6F784C434A4151476C6B496A6F6961575178496977695145426B5A584E6A636D6C7764476C7662694936496A45334D6934784E6934784D6A67754D6A4D31494330674C5342624D6A5976546D39324C7A49774D546B364D5451364D4455364D544D674B7A41344D4442644945644656434176595842704C326C3062324576626D393061574E6C4C32357664476C6A5A556C75596D39344C324A31596D4A735A556C75596D393449456855564641764D533478494451774D5341304D69426F644852774F6938764D546B794C6A45324F4334794D5334784D7A49766247396E6157342F636D563064584A7556584A7350535579526E4E356333526C62535579526E4E6C64485270626D647A4A544E47644746696157356B5A58676C4D30516C4D6A56464E5355794E5546454A5449314F54676C4D6A56464E5355794E5467794A5449315154676C4D6A56464E5355794E546C444A544931516A416C4D6A56464E5355794E546C454A5449314F44416C4D6A56464E7955794E5546464A5449315154456C4D6A56464E7955794E546B774A5449314F4459675457393661577873595338314C6A41674B45316859326C756447397A61447367535735305A5777675457466A49453954494667674D5442664D5452664D796B6751584277624756585A574A4C615851764E544D334C6A4D324943684C5346524E5443776762476C725A5342485A574E7262796B67513268796232316C4C7A63344C6A41754D7A6B774E4334354E79425459575A68636D6B764E544D334C6A4D32494463334F4467674C534973496B42306157316C63335268625841694F6A45314E6A51334D5451324F4441774D444173496E4E306157316C496A6F694D6A41784F5338344C7A49674D5441364E5467364D434A39222C0A2020226D657461223A207B0A2020202022746F706963223A20226B7374222C0A2020202022706172746974696F6E223A20302C0A20202020226F6666736574223A20302C0A202020202274696D657374616D70223A20313630373537313439373333390A20207D0A7D0A6060600A0AE58F82E695B0E8AFB4E6988E0A0A2D2063686172736574EFBC9A2062797465E695B0E7BB84E8A7A3E7A081E4B8BA737472696E67E79A84E5AD97E7ACA6E99B86200A2D206279746541727261794669656C644E616D65EFBC9AE8BE93E585A5E695B0E68DAEE9878C62797465E695B0E7BB84E68980E59CA8E5AD97E6AEB5E5908D0A2D206F75747075744669656C644E616D65EFBC9AE58F8DE5BA8FE58897E58C96E5908EE58685E5AEB9E8BE93E587BAE588B0E68C87E5AE9AE79A84E5AD97E6AEB5E5908DEFBC8CE5A682E69E9CE4B88DE68C87E5AE9AE58899E8BE93E587BAE4B8BAE695B4E4B8AAE9A1B6E5B1824D61700A0AE5A682E69E9CE68C895554462D38E8A7A3E7A08162797465E695B0E7BB84E4B8BA737472696E67EFBC8CE784B6E5908EE58F8DE5BA8FE58897E58C96E4B8BA6A736F6EEFBC8CE5B9B6E8BE93E587BAE588B06A736F6E4F7574707574E5AD97E6AEB50AE58F82E695B0E5A682E4B88BEFBC9A0A0A6060600A7B0A2020226368617273657422203A20225554462D38222C0A2020226279746541727261794669656C644E616D6522203A20226279746573222C0A2020226F75747075744669656C644E616D6522203A20226A736F6E4F7574707574222C0A20202272656D6F76654279746541727261794669656C6422203A20747275650A7D0A6060600A0A0AE8BE93E587BAE79A84E695B0E68DAEE5A682E4B88BEFBC88736C6F742030EFBC89EFBC9A0A0A6060600A7B0A2020226A736F6E4F7574707574223A207B0A20202020227431223A20227431222C0A20202020227432223A20227432222C0A20202020227433223A20227433222C0A202020202240686F73746E616D65223A20226C6F63616C686F7374222C0A20202020224070617468223A20222F7661722F6C6F672F6E67696E782F6163636573732E6C6F67222C0A202020202240726F776E756D626572223A20312C0A202020202240406964223A2022696431222C0A202020202240406465736372697074696F6E223A20223137322E31362E3132382E323335202D202D205B32362F4E6F762F323031393A31343A30353A3133202B303830305D20474554202F6170692F69746F612F6E6F746963652F6E6F74696365496E626F782F627562626C65496E626F7820485454502F312E312034303120343220687474703A2F2F3139322E3136382E32312E3133322F6C6F67696E3F72657475726E55726C3D25324673797374656D25324673657474696E6773253346746162696E646578253344253235453525323541442532353938253235453525323538322532354138253235453525323539432532354230253235453525323539442532353830253235453725323541452532354131253235453725323539302532353836204D6F7A696C6C612F352E3020284D6163696E746F73683B20496E74656C204D6163204F5320582031305F31345F3329204170706C655765624B69742F3533372E333620284B48544D4C2C206C696B65204765636B6F29204368726F6D652F37382E302E333930342E3937205361666172692F3533372E33362037373838202D222C0A20202020224074696D657374616D70223A20313536343731343638303030302C0A20202020227374696D65223A2022323031392F382F322031303A35383A30220A20207D2C0A2020226D657461223A207B0A2020202022746F706963223A20226B7374222C0A2020202022706172746974696F6E223A20302C0A20202020226F6666736574223A20302C0A202020202274696D657374616D70223A20313630373537313439373333390A20207D0A7D0A6060600A0AE8BE93E587BAE79A84E99499E8AFAFE695B0E68DAEEFBC88736C6F742031EFBC89EFBC9A0A0A6060600A7B0A2020226572726F725F6D7367223A2022556E7265636F676E697A656420746F6B656E202772727272273A2077617320657870656374696E6720284A534F4E20537472696E672C204E756D6265722C2041727261792C204F626A656374206F7220746F6B656E20276E756C6C272C20277472756527206F72202766616C736527295C6E206174205B536F757263653A2028537472696E67295C22727272725C223B206C696E653A20312C20636F6C756D6E3A20355D222C0A2020226279746573223A2022636E4A7963673D3D222C0A2020226D657461223A207B0A2020202022746F706963223A20226B7374222C0A2020202022706172746974696F6E223A20302C0A20202020226F6666736574223A203133302C0A202020202274696D657374616D70223A20313630373537383736373437390A20207D0A7D0A606060, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313630373538303337383633372220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D223833372220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3231322E393932203532362E333336203231322E393932203532362E333336203231322E393932203532362E333336203231352E3034203532362E333336203231322E393932203532362E3333365A2220702D69643D22383338223E3C2F706174683E3C7061746820643D224D3534362E383136203430372E353532632D34332E30303820302D36312E34342034352E3035362D36312E34342039322E313620302034372E3130342032302E34382039302E3131322036312E34342039302E3131322034302E393620302036312E34342D34332E3030382036312E34342D39322E3136433630382E323536203435342E363536203538392E383234203430372E353532203534362E383136203430372E3535327A2220702D69643D22383339223E3C2F706174683E3C7061746820643D224D3738342E333834203139362E363038203233392E363136203139362E363038632D39302E31313220302D3136332E38342037332E3732382D3136332E3834203136332E38346C30203332372E363863302039302E3131322037332E373238203136332E3834203136332E3834203136332E38346C3534342E37363820306339302E3131322030203136332E38342D37332E373238203136332E38342D3136332E38346C302D3332372E3638433934382E323234203237302E333336203837342E343936203139362E363038203738342E333834203139362E3630387A4D3234392E383536203533382E36323463302036312E34342D32382E3637322037392E3837322D36392E3633322037392E3837322D31302E323420302D32322E3532382D322E3034382D33302E37322D342E3039366C342E3039362D32382E36373263362E31343420322E3034382031342E33333620342E3039362032322E35323820342E3039362032322E35323820302033362E3836342D31302E32342033362E3836342D35312E326C302D3135352E3634382033342E38313620304C3234372E383038203533382E3632347A4D3334322E303136203631382E343936632D32322E35323820302D34352E3035362D362E3134342D35352E3239362D31342E3333366C382E3139322D32382E3637326331322E32383820382E3139322033302E37322031342E3333362035312E322031342E3333362032382E36373220302034332E3030382D31342E3333362034332E3030382D33342E38313620302D32302E34382D31322E3238382D33322E3736382D33382E3931322D34332E3030382D33342E3831362D31342E3333362D35372E3334342D33342E3831362D35372E3334342D36372E35383420302D33362E3836342032382E3637322D36352E3533362037352E3737362D36352E3533362032322E35323820302033382E39313220362E3134342034392E3135322031302E32346C2D382E3139322032382E363732632D382E3139322D342E3039362D32322E3532382D31302E32342D34302E39362D31302E32342D32382E36373220302D33382E3931322031362E3338342D33382E3931322033302E373220302032302E34382031322E3238382032382E3637322034332E3030382034332E3030382033362E3836342031362E3338342035352E3239362033362E3836342035352E3239362036392E363332433432332E393336203538392E383234203339352E323634203631382E343936203334322E303136203631382E3439367A4D3534362E383136203631382E343936632D35392E33393220302D39382E3330342D34372E3130342D39382E3330342D3131382E37383420302D37332E3732382034302E39362D3132302E383332203130302E3335322D3132302E3833322036312E343420302039362E3235362035312E322039362E323536203131382E373834433634352E3132203537372E353336203630322E313132203631382E343936203534362E383136203631382E3439367A4D3834392E3932203631362E3434386C2D33342E38313620302D36312E34342D3130382E353434632D31342E3333362D32342E3537362D32382E3637322D35332E3234382D33382E3931322D37372E3832346C2D322E303438203063322E3034382032382E36373220322E3034382035392E33393220322E303438203130302E3335326C302038382E3036342D33322E37363820304C3638312E393834203338322E3937366C33382E39313220302036312E3434203130382E3534346331342E3333362032342E3537362032382E3637322035332E3234382033362E3836342037372E3832346C302030632D322E3034382D33302E37322D342E3039362D36312E34342D342E3039362D39382E3330346C302D38362E3031362033322E37363820304C3834372E383732203631362E3434387A2220702D69643D22383430223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.JsonParseJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.JsonParseJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]},{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"JsonParseJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"文本解析\",\"display\":\"解析XJson\",\"description\":\"针对字段值本身是json字符串,对json字符串中的内容进行反序列化\",\"doc\":\"JsonParseJob.md\",\"icon\":\"JsonParseJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"sourceField\",\"label\":\"输入字段\",\"type\":[\"STRING\"],\"description\":\"需要解析的json字段名\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"flatDelimiter\",\"label\":\"平铺拼接符\",\"type\":[\"STRING\"],\"description\":\"将嵌套的json结构平铺,使用平铺拼接符拼接生成字段名\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"outputField\",\"label\":\"输出字段\",\"type\":[\"STRING\"],\"description\":\"解析结果输出到指定字段下,如果设置了输出字段名,解析结果将作为这个字段的子对象存在。如果不设置,解析结果将放置在最外层\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'process', '', 0x23206A736F6EE68F90E58F960A0A4A736F6EE794A8E4BA8EE580BCE4B8BA6A736F6EE5AD97E7ACA6E4B8B2E79A84E68F90E58F96E588B0E69C80E5A496E5B1822CE5A682E69E9C6973526563E8AEBEE7BDAEE4B8BA74727565E58899E5B0864A736F6EE58E8BE5B9B328666C617474656E29E5908EE694BEE588B0E69C80E5A496E5B182E38082E6ADA3E7A1AEE7BB93E69E9CE8BE93E587BAE588B0736C6F742030EFBC8CE5A4B1E8B4A5E59CA8736C6F742031E8BE93E587BAE58E9FE5A78BE695B0E68DAEE380820A0AE58187E8AEBEE58E9FE5A78BE697A5E5BF97E5A682E4B88B3A0A0A6060606A736F6E0A7B0A2020226D65737361676522203A20227B5C22615C223A312C5C22625C223A7B5C22626230315C223A32312C5C22626230325C223A32322C5C22626230335C223A7B5C2263635C223A33332C5C22636330315C223A33342C5C22696E746172725C223A5B312C325D7D2C5C227374726172725C223A5B5C22615C222C5C22625C225D7D2C5C22635C223A5B7B5C2263315C223A317D2C7B5C2263315C223A327D5D7D220A7D0A6060600A0A232320E7A4BAE4BE8B310A0AE8AFA5E4BE8BE5AD90E698AFE4B880E4B8AAE7AE80E58D95E79A846A736F6EE68F90E58F96E6938DE4BD9C0A0AE8A7A3E69E90E8A784E588993A0A0A6060606A736F6E0A7B0A202022736F757263654669656C6422203A20226D657373616765220A7D0A6060600A0AE8BE93E587BAE79A84E695B0E68DAEEFBC88736C6F742030EFBC89EFBC9A0A0A6060606A736F6E0A7B0A20202020226D657373616765223A227B5C22615C223A312C5C22625C223A7B5C22626230315C223A32312C5C22626230325C223A32322C5C22626230335C223A7B5C2263635C223A33332C5C22636330315C223A33342C5C22696E746172725C223A5B312C325D7D2C5C227374726172725C223A5B5C22615C222C5C22625C225D7D2C5C22635C223A5B7B5C2263315C223A317D2C7B5C2263315C223A327D5D7D222C0A202020202261223A312C0A202020202262223A7B0A20202020202020202262623031223A32312C0A20202020202020202262623032223A32322C0A20202020202020202262623033223A7B0A202020202020202020202020226363223A33332C0A2020202020202020202020202263633031223A33342C0A20202020202020202020202022696E74617272223A5B0A20202020202020202020202020202020312C0A20202020202020202020202020202020320A2020202020202020202020205D0A20202020202020207D2C0A202020202020202022737472617272223A5B0A2020202020202020202020202261222C0A2020202020202020202020202262220A20202020202020205D0A202020207D2C0A202020202263223A5B0A20202020202020207B0A202020202020202020202020226331223A310A20202020202020207D2C0A20202020202020207B0A202020202020202020202020226331223A320A20202020202020207D0A202020205D0A7D0A6060600A0A232320E7A4BAE4BE8B320A0AE8AFA5E4BE8BE5AD90E698AF6A736F6EE68F90E58F96E4B98BE5908EEFBC8CE5B086E5B58CE5A5976A736F6EE5B9B3E993BAEFBC8CE993BEE68EA5E7ACA6E4B8BA602E600A0AE8A7A3E69E90E8A784E588993A0A0A6060606A736F6E0A7B0A2022736F757263654669656C64223A226D657373616765222C0A2022666C617444656C696D69746572223A222E220A7D0A6060600A0AE8BE93E587BAE79A84E695B0E68DAEEFBC88736C6F742030EFBC89EFBC9A0A0A6060606A736F6E0A7B0A20202020226D657373616765223A227B5C22615C223A312C5C22625C223A7B5C22626230315C223A32312C5C22626230325C223A32322C5C22626230335C223A7B5C2263635C223A33332C5C22636330315C223A33342C5C22696E746172725C223A5B312C325D7D2C5C227374726172725C223A5B5C22615C222C5C22625C225D7D2C5C22635C223A5B7B5C2263315C223A317D2C7B5C2263315C223A327D5D7D222C0A202020202261223A312C0A2020202022622E62623031223A32312C0A2020202022622E62623032223A32322C0A2020202022622E626230332E6363223A33332C0A2020202022622E626230332E63633031223A33342C0A2020202022622E626230332E696E746172725B305D223A312C0A2020202022622E626230332E696E746172725B315D223A322C0A2020202022622E7374726172725B305D223A2261222C0A2020202022622E7374726172725B315D223A2262222C0A2020202022635B305D2E6331223A312C0A2020202022635B315D2E6331223A320A7D0A6060600A0A232320E7A4BAE4BE8B330A0AE8AFA5E4BE8BE5AD90E5B086E8A7A3E69E90E5908EE79A84E695B0E68DAEE5AD98E694BEE588B0E4B880E4B8AAE79BAEE6A087E5AD97E6AEB56F7574E4B8AD0A0AE8A7A3E69E90E8A784E588993A0A0A6060606A736F6E0A7B0A2022736F757263654669656C64223A226D657373616765222C0A20226F75747075744669656C64223A226F7574220A7D0A6060600AE8BE93E587BAE79A84E695B0E68DAEEFBC88736C6F742030EFBC89EFBC9A0A0A6060606A736F6E0A7B0A20202020226D657373616765223A227B5C22615C223A312C5C22625C223A7B5C22626230315C223A32312C5C22626230325C223A32322C5C22626230335C223A7B5C2263635C223A33332C5C22636330315C223A33342C5C22696E746172725C223A5B312C325D7D2C5C227374726172725C223A5B5C22615C222C5C22625C225D7D2C5C22635C223A5B7B5C2263315C223A317D2C7B5C2263315C223A327D5D7D222C0A20202020226F7574223A7B0A20202020202020202261223A312C0A20202020202020202262223A7B0A2020202020202020202020202262623031223A32312C0A2020202020202020202020202262623032223A32322C0A2020202020202020202020202262623033223A7B0A20202020202020202020202020202020226363223A33332C0A202020202020202020202020202020202263633031223A33342C0A2020202020202020202020202020202022696E74617272223A5B0A2020202020202020202020202020202020202020312C0A2020202020202020202020202020202020202020320A202020202020202020202020202020205D0A2020202020202020202020207D2C0A20202020202020202020202022737472617272223A5B0A202020202020202020202020202020202261222C0A202020202020202020202020202020202262220A2020202020202020202020205D0A20202020202020207D2C0A20202020202020202263223A5B0A2020202020202020202020207B0A20202020202020202020202020202020226331223A310A2020202020202020202020207D2C0A2020202020202020202020207B0A20202020202020202020202020202020226331223A320A2020202020202020202020207D0A20202020202020205D0A202020207D0A7D0A6060600A0AE88BA5E8A7A3E69E90E5A4B1E8B4A5EFBC8CE58899E4BC9AE59CA8736C6F743120E4B8ADE8BE93E587BAE58E9FE5A78BE695B0E68DAE, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313630393331343330343837392220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22323139372220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3734322E34203735352E343536483536342E373730313333632D31342E3433383420302D32362E3131322031322E3437353733332D32362E3131322032372E383639383637763136382E3631383636366832382E3433333036374C3734322E34203736302E343339343637762D342E3938333436377A4D3734322E34203639392E373333333333762D38382E31383334363663302D31352E3138393333332031312E343638382D32372E3437373333332032352E362D32372E3437373333347332352E362031322E3238382032352E362032372E343737333334763136302E313336353333633020372E323139322D322E3634353333332031342E313331322D372E3333383636372031392E3238353333334C3539362E303837343637203939382E373037326132342E3734363636372032342E3734363636372030203020312D31382E32363133333420382E323236313333483139342E3536433132392E35333620313030362E3933333333332037362E38203935302E3330363133332037362E38203838302E343532323637563134332E3533303636374337362E382037332E363933383637203132392E3533362031372E303636363637203139342E35362031372E303636363637683438312E3238433734302E3836342031372E303636363637203739332E362037332E363933383637203739332E36203134332E3534373733337634382E39333031333463302031352E3138393333332D31312E343638382032372E3437373333332D32352E362032372E343737333333732D32352E362D31322E3238382D32352E362D32372E343737333333563134332E35333036363763302D33392E343735322D32392E373938342D37312E3439323236372D36362E35362D37312E343932323637483139342E3536632D33362E3736313620302D36362E35362033322E3031373036372D36362E35362037312E353039333333763733362E38383734363763302033392E343735322032392E373938342037312E3439323236372036362E35362037312E343932323637483438362E34762D3136382E363138363637433438362E34203733372E313630353333203532312E343839303637203639392E373333333333203536342E373730313333203639392E373333333333483734322E347A4D3238392E303538313333203239342E3537303636376833332E333832346C2D31352E353831383636203135332E323735373333632D322E3634353333332032362E3032363636372D392E3433373836372034352E3035362D32302E343238382035372E373533362D31322E313835362031332E3332393036372D32392E3938363133332032302E3030323133332D35332E3637343636372032302E3030323133332D32302E35343832363720302D33352E3630313036372D362E333438382D34342E3836383236372D31392E303436342D392E3535373333332D31322E363937362D31332E3139323533332D33302E3133393733332D31302E3933393733332D35322E3336303533336C302E3733333836372D372E3330343533336833332E3339393436366C2D302E3731363820362E393937333333632D322E3634353333332032362E3030393620362E3032343533332033392E303134342032362E3238323636372033392E303134342031312E31323734363720302031392E3739373333332D332E3830353836372032352E3636383236372D31312E30393333333320352E3838382D372E33303435333320392E3634323636372D31392E303436342031312E3238313036362D33352E323235366C31352E343632342D3135322E303132387A206D3134342E3132382D342E3433373333346332332E39373836363720302034322E32353730363720352E3339333036372035342E3534353036372031362E3530333436372031332E3037333036372031312E3734313836372031392E3437333036372033302E3133393733332031382E3934342035342E393033343637483437332E36632D312E343333362D31332E393737362D352E3831393733332D32342E3133323236372D31322E3632393333332D33302E313536382D362E3737353436372D362E333438382D31372E3930323933332D392E3139383933332D33322E3733333836372D392E3139383933342D31322E3835313220302D32322E3733323820312E3931313436372D33302E3030333220362E3032343533342D392E30343533333320342E3737383636372D31332E3835383133332031322E363937362D31342E393530342032332E3438333733332D302E3937323820392E3532333220322E3739383933332031372E343539322031312E3931323533332032332E31373635333320342E30323737333320322E3532353836372031352E32343035333320372E3238373436372033332E3339393436372031332E3936303533342032362E37303933333320392E3530363133332034332E363232342031372E3133343933332035312E303937362032322E3230333733332031362E3530333436372031312E3734313836372032332E373035362032372E3933383133332032312E3537323236372034382E3837383933332D322E3034382032302E3330393333332D31302E3833373333332033362E3438383533332D32362E3239393733342034382E323330342D31352E3432383236372031312E3433343636372D33362E333030382031372E343539322D36322E3237363236362031372E343539322D32352E31303530363720302D34342E3235333836372D352E3339333036372D35372E313339322D31362E3139363236362D31352E373639362D31332E3331322D32332E30342D33342E3236393836372D32312E3533383133342D36332E3134363636376833332E31303933333463302E3531322031372E31333439333320342E3639333333332032392E3532353333332031322E382033362E3831323820372E33333836363720362E333438382031392E3235313220392E383330342033362E30393620392E383330342031342E38343820302032372E3130313836372D322E3835303133332033362E3231353436362D382E3234333220392E3134373733332D352E3731373333332031342E3435353436372D31332E303034382031352E3432383236372D32322E35323820312E3231313733332D31322E3036363133332D342E3336393036372D32312E3538393333332D31362E3231333333332D32382E353639362D332E3737313733332D322E3231383636372D31362E3338342D372E3238373436372D33382E3136313036372D31342E3931363236372D32342E3230303533332D382E3837343636372D33392E3235333333332D31352E3232333436372D34342E3836383236372D31392E3032393333332D31342E3632363133332D31302E3437383933332D32302E373837322D32352E373032342D31382E373339322D34352E37303435333320322E3033303933332D31392E3938353036372031312E303539322D33352E38342032372E3633303933342D34372E3237343636372031352E3339343133332D31312E3039333333332033332E3932383533332D31362E3530333436372035352E3839333333332D31362E3530333436377A206D3230372E32323334363720306333312E31313235333320302035342E3532382031312E3039333333332037302E3231323236372033332E3632313333342031342E393530342032312E3238323133332032302E3635303636372034392E3532373436372031372E313030382038342E343238382D332E3534393836372033342E3930313333332D31342E393530342036322E383232342D33342E3233353733342038342E3038373436362D32302E3234313036372032322E323230382D34352E3930393333332033332E333331322D37372E303034382033332E333331322D33312E34303236363720302D35342E3738342D31312E3433343636372D37302E3231323236362D33332E363338342D31342E3933333333332D32312E3538393333332D32302E3336303533332D34392E353130342D31362E3837383933342D38332E37393733333320332E3531353733332D33342E3537373036372031342E3632363133332D36322E3439383133332033332E3936323636372D38342E30373034433538332E333338363637203330312E323236363637203630392E303036393333203239302E313333333333203634302E333932353333203239302E3133333333337A206D2D332E3234323636372033322E363832363637632D32312E31323835333320302D33382E3139353220372E3933362D35312E353037322032332E3830382D31322E3638303533332031352E3232333436372D32302E313732382033352E353332382D32322E3831383133332036312E3535393436372D322E363131322032352E3730323420302E3735303933332034362E3031313733332031302E3332353333332036312E32353232363620392E3834373436372031352E3533303636372032352E3538323933332032332E3436363636372034362E363934342032332E3436363636372032312E31323835333320302033382E3136313036372D372E3631313733332035312E303937362D32322E3532382031322E3632393333332D31342E3931363236372032302E3434353836372D33352E353332382032332E3135393436372D36322E31393039333320322E373133362D32362E3635383133332D302E383730342D34372E3631362D31302E343434382D36322E3833393436372D392E3836343533332D31352E3232333436372D32352E333935322D32322E3532382D34362E3530363636372D32322E3532387A206D3133312E38342D32382E3234353333336833332E333832346C38342E31323136203136332E3433303468312E3134333436376C31362E3630353836372D3136332E343330346833332E3637323533336C2D32332E3034203232362E353737303636682D33322E3532393036374C3739372E333534363637203335352E343938363637682D312E3134333436376C2D31362E38343438203136352E363439303636483734352E3938346C32332E30342D3232362E3537373036367A2220702D69643D2232313938223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.JsonStringToMapJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.JsonStringToMapJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.lang.String\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]},{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.lang.String\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"JsonStringToMapJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"文本解析\",\"display\":\"字符串转Json\",\"description\":\"将json string转为map\",\"doc\":\"JsonStringToMapJob.md\",\"icon\":\"JsonStringToMapJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[]}}', 'process', '', 0x23204A736F6EE58F8DE5BA8FE58897E58C960A0AE5B086E5B086E5AD97E7ACA6E4B8B2E58F8DE5BA8FE58897E58C96E4B8BA4D6170EFBC9A0A2D20E8BE93E587BA736C6F742030EFBC8C20E7B1BBE59E8BE4B8BA604D61703C537472696E672C204F626A6563743E60EFBC8C6465636F6465E68890E58A9FE695B0E68DAE0A2D20E8BE93E587BA736C6F742031EFBC8C20E7B1BBE59E8BE4B8BA60537472696E6760EFBC8CE58E9FE5A78BE5AD97E7ACA6E4B8B20A0AE58187E8AEBEE8BE93E585A5E695B0E68DAEE5A682E4B88BEFBC9A0A6060600A7B226E616D65223A22E5BCA0E4B889222C22616765223A317D0A7B226E616D65223A22E69D8EE59B9B222C22616765223A327D0A7B226E616D65223A22E78E8BE4BA94222C22616765223A0A6060600A0A736C6F742030E8BE93E587BA0A6060600A7B226E616D65223A22E5BCA0E4B889222C22616765223A317D0A7B226E616D65223A22E69D8EE59B9B222C22616765223A327D0A6060600A0A736C6F742031E8BE93E587BA0A6060600A7B226E616D65223A22E78E8BE4BA94222C22616765223A0A606060, 0x3C3F786D6C2076657273696F6E3D22312E3022203F3E3C737667206865696768743D223230222076657273696F6E3D22312E31222076696577426F783D22302030203230203230222077696474683D2232302220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F737667223E3C672069643D226C6179657231223E3C7061746820643D224D20332030204C2033203132204C2034203132204C20342031204C2031322031204C2031322034204C2031322035204C2031362035204C203136203132204C203137203132204C2031372035204C2031372034204C2031332030204C2031322030204C20332030207A204D20313320312E33353335313536204C2031352E3634363438342034204C2031332034204C20313320312E33353335313536207A204D2034203133204C2034203136204C20332E393932313837352031362E313330383539204C20332E393636373936392031362E323537383132204C20332E393233383238312031362E333832383132204C20332E383635323334342031362E35204C20332E373932393638382031362E363037343232204C20332E373037303331322031362E373037303331204C20332E3630393337352031362E373932393639204C20332E352031362E383635323334204C20332E333832383132352031362E393233383238204C20332E323539373635362031362E393634383434204C20332E313330383539342031362E393932313838204C2033203137204C20322E383639313430362031362E393932313838204C20322E373430323334342031362E393634383434204C20322E363137313837352031362E393233383238204C20322E352031362E383635323334204C20322E3339303632352031362E373932393639204C20322E323932393638382031362E373037303331204C20322E323037303331322031362E363037343232204C20322E313334373635362031362E35204C20322E303736313731392031362E333832383132204C20322E303333323033312031362E323537383132204C20322E303037383132352031362E313330383539204C2032203136204C2031203136204C20312E303037383132352031362E313833353934204C20312E303335313536322031362E333637313838204C20312E303736313731392031362E353436383735204C20312E313334373635362031362E373232363536204C20312E323038393834342031362E383930363235204C20312E333030373831322031372E303532373334204C20312E343034323936392031372E323035303738204C20312E353231343834342031372E333437363536204C20312E363532333433382031372E343738353136204C20312E373934393231392031372E353935373033204C20312E393437323635362031372E363939323139204C20322E313037343231392031372E373931303136204C20322E323737333433382031372E383635323334204C20322E3435333132352031372E393233383238204C20322E363332383132352031372E393634383434204C20322E383136343036322031372E393932313838204C2033203138204C20332E313833353933382031372E393932313838204C20332E333637313837352031372E393634383434204C20332E3534363837352031372E393233383238204C20332E373232363536322031372E383635323334204C20332E383932353738312031372E373931303136204C20342E303532373334342031372E363939323139204C20342E323035303738312031372E353935373033204C20342E333437363536322031372E343738353136204C20342E343738353135362031372E333437363536204C20342E353935373033312031372E323035303738204C20342E363939323138382031372E303532373334204C20342E373931303135362031362E383930363235204C20342E383635323334342031362E373232363536204C20342E393233383238312031362E353436383735204C20342E393634383433382031362E333637313838204C20342E393932313837352031362E313833353934204C2035203136204C2035203133204C2034203133207A204D20372E35203133204120312E3520312E3439393939393920302030203020362031342E35204120312E3520312E3439393939393920302030203020372E35203136204C20382E35203136204120302E3520302E3520302030203120392031362E35204120302E3520302E3520302030203120382E35203137204C2036203137204C2036203138204C20382E35203138204120312E3520312E343939393939392030203020302031302031362E35204120312E3520312E3439393939393920302030203020382E35203135204C20372E35203135204120302E3520302E3520302030203120372031342E35204120302E3520302E3520302030203120372E35203134204C203130203134204C203130203133204C20372E35203133207A204D203133203133204C2031322E3831363430362031332E303037383132204C2031322E3633323831322031332E303333323033204C2031322E3435333132352031332E303736313732204C2031322E3237373334342031332E313334373636204C2031322E3130373432322031332E323038393834204C2031312E3934373236362031332E323938383238204C2031312E3739343932322031332E343034323937204C2031312E3635323334342031332E353231343834204C2031312E3532313438342031332E363532333434204C2031312E3430343239372031332E373934393232204C2031312E3330303738312031332E393437323636204C2031312E3230383938342031342E313037343232204C2031312E3133343736362031342E323737333434204C2031312E3037363137322031342E343531313732204C2031312E3033353135362031342E363332383132204C2031312E3030373831322031342E383136343036204C203131203135204C203131203136204C2031312E3030373831322031362E313833353934204C2031312E3033353135362031362E333637313838204C2031312E3037363137322031362E353436383735204C2031312E3133343736362031362E373232363536204C2031312E3230383938342031362E383930363235204C2031312E3330303738312031372E303532373334204C2031312E3430343239372031372E323035303738204C2031312E3532313438342031372E333437363536204C2031312E3635323334342031372E343738353136204C2031312E3739343932322031372E353935373033204C2031312E3934373236362031372E363939323139204C2031322E3130373432322031372E373931303136204C2031322E3237373334342031372E383635323334204C2031322E3435333132352031372E393233383238204C2031322E3633323831322031372E393634383434204C2031322E3831363430362031372E393932313838204C203133203138204C2031332E3138333539342031372E393932313838204C2031332E3336373138382031372E393634383434204C2031332E3534363837352031372E393233383238204C2031332E3732323635362031372E383635323334204C2031332E3839323537382031372E373931303136204C2031342E3035323733342031372E363939323139204C2031342E3230353037382031372E353935373033204C2031342E3334373635362031372E343738353136204C2031342E3437383531362031372E333437363536204C2031342E3539353730332031372E323035303738204C2031342E3639393231392031372E303532373334204C2031342E3739313031362031362E383930363235204C2031342E3836353233342031362E373232363536204C2031342E3932333832382031362E353436383735204C2031342E3936343834342031362E333637313838204C2031342E3939323138382031362E313833353934204C203135203136204C203135203135204C2031342E3939323138382031342E383136343036204C2031342E3936343834342031342E363332383132204C2031342E3932333832382031342E343531313732204C2031342E3836353233342031342E323737333434204C2031342E3739313031362031342E313037343232204C2031342E3639393231392031332E393437323636204C2031342E3539353730332031332E373934393232204C2031342E3437383531362031332E363532333434204C2031342E3334373635362031332E353231343834204C2031342E3230353037382031332E343034323937204C2031342E3035323733342031332E323938383238204C2031332E3839323537382031332E323038393834204C2031332E3732323635362031332E313334373636204C2031332E3534363837352031332E303736313732204C2031332E3336373138382031332E303333323033204C2031332E3138333539342031332E303037383132204C203133203133207A204D2031362E353133363732203133204120302E353030303520302E35303030352030203020302031362031332E35204C203136203138204C203137203138204C2031372031352E303031393533204C2031392E3039393630392031372E383030373831204120302E353030303520302E35303030352030203020302032302031372E35204C203230203133204C203139203133204C2031392031352E393938303437204C2031362E3930303339312031332E313939323139204120302E353030303520302E35303030352030203020302031362E353133363732203133207A204D203133203134204C2031332E3133303835392031342E303037383132204C2031332E3235393736362031342E303333323033204C2031332E3338323831322031342E303736313732204C2031332E352031342E313334373636204C2031332E3630393337352031342E323037303331204C2031332E3730373033312031342E323932393639204C2031332E3739323936392031342E333930363235204C2031332E3836353233342031342E35204C2031332E3932333832382031342E363137313838204C2031332E3936363739372031342E373430323334204C2031332E3939323138382031342E383639313431204C203134203135204C203134203136204C2031332E3939323138382031362E313330383539204C2031332E3936363739372031362E323537383132204C2031332E3932333832382031362E333832383132204C2031332E3836353233342031362E35204C2031332E3739323936392031362E363037343232204C2031332E3730373033312031362E373037303331204C2031332E3630393337352031362E373932393639204C2031332E352031362E383635323334204C2031332E3338323831322031362E393233383238204C2031332E3235393736362031362E393634383434204C2031332E3133303835392031362E393932313838204C203133203137204C2031322E3836393134312031362E393932313838204C2031322E3734303233342031362E393634383434204C2031322E3631373138382031362E393233383238204C2031322E352031362E383635323334204C2031322E3339303632352031362E373932393639204C2031322E3239323936392031362E373037303331204C2031322E3230373033312031362E363037343232204C2031322E3133343736362031362E35204C2031322E3037363137322031362E333832383132204C2031322E3033333230332031362E323537383132204C2031322E3030373831322031362E313330383539204C203132203136204C203132203135204C2031322E3030373831322031342E383639313431204C2031322E3033333230332031342E373430323334204C2031322E3037363137322031342E363137313838204C2031322E3133343736362031342E35204C2031322E3230373033312031342E333930363235204C2031322E3239323936392031342E323932393639204C2031322E3339303632352031342E323037303331204C2031322E352031342E313334373636204C2031322E3631373138382031342E303736313732204C2031322E3734303233342031342E303333323033204C2031322E3836393134312031342E303037383132204C203133203134207A204D2033203139204C2033203230204C203137203230204C203137203139204C203136203139204C2034203139204C2033203139207A2022207374796C653D2266696C6C3A233232323232323B2066696C6C2D6F7061636974793A313B207374726F6B653A6E6F6E653B207374726F6B652D77696474683A3070783B222F3E3C2F673E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.KeyValueParseJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.KeyValueParseJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]},{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"KeyValueParseJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"文本解析\",\"display\":\"键值提取\",\"description\":\"用于将某字段的kv样式的值转为json类型\",\"doc\":\"KeyValueParseJob.md\",\"icon\":\"KeyValueParseJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"sourceField\",\"label\":\"输入字段\",\"type\":[\"STRING\"],\"description\":\"需要被转化为kv的字段\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"fieldSplit\",\"label\":\"字段分割符\",\"type\":[\"STRING\"],\"description\":\"字段分割符,根据分隔符分割成多个字段组\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"valueSplit\",\"label\":\"键值分隔符\",\"type\":[\"STRING\"],\"description\":\"键值分隔符,根据符号分割字段名和字段值\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"trimValue\",\"label\":\"值前后缀\",\"type\":[\"BOOL\"],\"description\":\"删除值的头跟尾存在的空格\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"trimKey\",\"label\":\"字段名前后缀\",\"type\":[\"BOOL\"],\"description\":\"删除字段名的头跟尾中存在的空格\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"excludeKeys\",\"label\":\"字段黑名单\",\"type\":[\"LIST\"],\"description\":\"黑名单里的字段将被剔除\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":{\"apiVersion\":0,\"name\":null,\"label\":null,\"type\":[\"STRING\"],\"description\":null,\"optional\":false,\"defaultValue\":null,\"placeholder\":null,\"candidates\":null,\"inputType\":null,\"range\":null,\"regex\":null,\"order\":0,\"requireCondition\":null,\"availableCondition\":null,\"listParameter\":null,\"objectParameters\":null},\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"includeKeys\",\"label\":\"字段白名单\",\"type\":[\"LIST\"],\"description\":\"只保留白名单里的字段\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":{\"apiVersion\":0,\"name\":null,\"label\":null,\"type\":[\"STRING\"],\"description\":null,\"optional\":false,\"defaultValue\":null,\"placeholder\":null,\"candidates\":null,\"inputType\":null,\"range\":null,\"regex\":null,\"order\":0,\"requireCondition\":null,\"availableCondition\":null,\"listParameter\":null,\"objectParameters\":null},\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"outputField\",\"label\":\"输出字段\",\"type\":[\"STRING\"],\"description\":\"解析结果输出到指定字段下,如果设置了输出字段名,解析结果将作为这个字段的子对象存在。如果不设置,解析结果将放置在最外层\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'process', '', 0x2320E994AEE580BCE68F90E58F960A0A4B56E794A8E4BA8EE5B086E69F90E5AD97E6AEB5E79A846B76E6A0B7E5BC8FE79A84E580BCE8BDACE4B8BA6A736F6EE7B1BBE59E8B0A0A232320E7A4BAE4BE8B310A0AE8BF99E698AFE4B880E4B8AA4B56E8A7A3E69E90E79A84E4BE8BE5AD900A0AE58E9FE5A78BE697A5E5BF973A0A0A6060606A736F6E0A7B0A20202020226D736722203A2022613D61616120623D62626220633D6363632078797A3D313233203132333D78797A220A7D0A6060600A0AE8A7A3E69E90E8A784E588993A0A0A6060606A736F6E0A7B0A2020202022736F757263654669656C6422203A20226D7367222C0A20202020226669656C6453706C697422203A202220222C0A202020202276616C756553706C697422203A20223D222C0A20202020226578636C7564654B65797322203A205B202262222C20226322205D2C0A2020202022696E636C7564654B65797322203A205B202261222C202262222C202278797A225D0A7D0A6060600A0AE7BB93E69E9C3A0A0A6060606A736F6E0A7B0A20202020226D736722203A2022613D61616120623D62626220633D6363632078797A3D313233203132333D78797A222C0A20202020226122203A2022616161222C0A202020202278797A22203A2022313233220A7D0A0A6060600A0A232320E7A4BAE4BE8B320A0AE8BF99E698AFE4B880E4B8AAE5B086E7BB93E69E9CE8BE93E587BAE4B8AAE68C87E5AE9AE5AD97E6AEB5E79A84E4BE8BE5AD900A0AE58E9FE5A78BE697A5E5BF973A0A0A6060606A736F6E0A7B0A20202020226D736722203A2022613D61616120623D62626220633D6363632078797A3D313233203132333D78797A220A7D0A6060600A0AE8A7A3E69E90E8A784E588993A0A0A6060606A736F6E0A7B0A2020202022736F757263654669656C6422203A20226D7367222C0A20202020226669656C6453706C697422203A202220222C0A202020202276616C756553706C697422203A20223D222C0A20202020226578636C7564654B65797322203A205B202262222C20226322205D2C0A2020202022696E636C7564654B65797322203A205B202261222C202262222C202278797A225D2C0A20202020226F75747075744669656C64223A20226B76220A7D0A6060600A0AE7BB93E69E9C3A0A0A6060606A736F6E0A7B0A20202020226D736722203A2022613D61616120623D62626220633D6363632078797A3D313233203132333D78797A222C0A20202020226B7622203A207B0A2020202020202020226122203A2022616161222C0A20202020202020202278797A22203A2022313233220A202020207D0A7D0A606060, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313630393233383231323335322220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22323835362220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3731342E31372039382E3233483331312E3833632D39382E363920302D3137382E39392038302E32392D3137382E3939203137382E3939763437322E303363302039382E36392038302E33203137382E3939203137382E3939203137382E3939683430322E33356339382E36392030203137382E39392D38302E33203137382E39392D3137382E3939563237372E323163302D39382E36392D38302E332D3137382E39382D3137392D3137382E39387A206D30203734382E3231483331312E3833632D35382E363120302D3130362E32392D34372E36382D3130362E32392D3130362E3239563238362E3363302D35382E36312034372E36382D3130362E3239203130362E32392D3130362E3239683430322E33356335382E36312030203130362E32392034372E3638203130362E3239203130362E3239763435332E383563302035382E36312D34372E3639203130362E32392D3130362E33203130362E32397A222066696C6C3D22233036303030312220702D69643D2232383537223E3C2F706174683E3C7061746820643D224D3437352E3437203630332E33396C2D38352E38352D36392E36342038312E362D37302E353963372E34392D362E34392031302E352D31362E313520382E39332D32352E323520312E32382D372E37322D302E36332D31352E39322D362E31352D32322E332D392E38342D31312E33382D32372E30362D31322E36332D33382E34352D322E37386C2D37332E32362036332E3338762D36372E343963302D31352E30362D31322E322D32372E32362D32372E32362D32372E3236732D32372E32362031322E32312D32372E32362032372E3236763235322E343363302031352E30362031322E322032372E32362032372E32362032372E32367332372E32362D31322E322032372E32362D32372E3236762D37302E32376C37382E38332036332E393563352E303520342E312031312E313220362E30392031372E313520362E303920372E393320302031352E38312D332E34342032312E31392D31302E303920352E31342D362E333420362E38362D31342E323720352E35392D32312E373320312E35392D392E33382D312E36372D31392E32392D392E35382D32352E37317A4D3731332E3336203339342E3139632D31342E32312D352E30372D32392E373820322E33342D33342E38332031362E35346C2D35392E3735203136372E37342D36332E36312D3136322E3833632D352E34382D31342E30312D32312E32372D32302E39362D33352E33312D31352E34372D31322E333420342E38322D31392E31372031372E36342D31362E38392033302E32312D302E373420342E36342D302E343120392E353120312E34332031342E326C39302E3138203233302E383563302E313420302E333520302E333320302E363520302E343820302E393920302E323420302E353420302E3520312E303720302E373720312E353920302E353120302E393820312E303620312E393120312E363720322E3820302E323920302E343320302E353620302E383620302E383720312E323720302E393120312E313920312E383920322E3320322E393720332E3320302E303820302E303820302E313520302E313720302E323420302E323520312E313820312E303820322E343720322E303120332E383120322E383620302E343120302E323620302E383520302E343820312E323720302E373220312E303920302E363120322E323120312E313420332E333720312E3620302E323720302E313120302E353120302E323720302E373920302E333720302E313820302E303620302E333520302E303820302E353320302E3134203120302E333320322E303120302E353820332E303420302E3820302E343120302E303920302E383320302E323120312E323420302E323820312E343120302E323320322E383320302E333620342E323720302E333720302E3032203020302E303420302E303120302E303620302E303168302E303463312E3536203020332E30382D302E313620342E35382D302E343220302E34352D302E303820302E38392D302E323120312E33332D302E333120312E31322D302E323520322E32312D302E353620332E32382D302E393420302E32332D302E303820302E34362D302E313120302E36392D302E3220302E32352D302E3120302E34362D302E323520302E372D302E333620312E31382D302E3520322E33312D312E303820332E34312D312E373420302E33362D302E323220302E37352D302E343120312E312D302E363520312E33342D302E383920322E36312D312E383920332E37382D332E303120302E32312D302E3220302E33382D302E343320302E35382D302E363420302E39322D302E393520312E37382D312E393620322E35372D332E303420302E332D302E343220302E35372D302E383620302E38352D312E323920302E35392D302E393220312E31332D312E383820312E36312D322E383920302E32352D302E353220302E34392D312E303420302E37312D312E353820302E31342D302E333520302E33342D302E363720302E34372D312E30346C38342E32352D3233362E353463312E36312D342E353120312E38332D392E313320312E312D31332E353420322E32342D31322E38392D342E39342D32352E38372D31372E36352D33302E347A222066696C6C3D22233036303030312220702D69643D2232383538223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.PartitionJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.PartitionJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"PartitionJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"数据流变换\",\"display\":\"对数据流做分区操作\",\"description\":\"对于stream进行partitioning\",\"doc\":\"PartitionJob.md\",\"icon\":\"PartitionJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"partitionType\",\"label\":\"Partition类型\",\"type\":[\"STRING\"],\"description\":\"可选:rebalance(Round-robin partitioning),shuffle(Random partitioning), rescale(local Round-robin partitioning)\",\"optional\":true,\"defaultValue\":\"rebalance\",\"placeholder\":\"\",\"candidates\":[\"rebalance\",\"shuffle\",\"rescale\"],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'process', '', 0x2320506172746974696F6E4A6F620A0AE5AFB9E4BA8E73747265616DE8BF9BE8A18C706172746974696F6E696E67EFBC8CE794A8E4BA8EE5819AE695B0E68DAEE5B9B3E8A1A1E8A7A3E586B3E695B0E68DAEE580BEE6969CE997AEE9A298E380820A0A232320E58F82E695B0E8AFB4E6988E0A0A506172746974696F6EE7B1BBE59E8BEFBC8C706172746974696F6E54797065EFBC9A0A0A2D20726562616C616E636528526F756E642D726F62696E20706172746974696F6E696E67290A2D2073687566666C652852616E646F6D20706172746974696F6E696E67290A2D2072657363616C65286C6F63616C20526F756E642D726F62696E20706172746974696F6E696E67290A0AE585B7E4BD93E980BBE8BE91E8AFB7E58F82E88083EFBC9A0A68747470733A2F2F63692E6170616368652E6F72672F70726F6A656374732F666C696E6B2F666C696E6B2D646F63732D72656C656173652D312E31322F6465762F73747265616D2F6F70657261746F72732F23706879736963616C2D706172746974696F6E696E670A0A, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313631333937313932353039392220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22313233332220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3635392E303030383839203431382E313333333333683239332E3833313131316131362E3332373131312031362E3332373131312030203020302031362E3332373131312D31362E333535353535563130372E3833323838396131362E3332373131312031362E3332373131312030203020302D31362E3335353535352D31362E333237313131682D3239332E3833313131326131362E3332373131312031362E3332373131312030203020302D31362E3332373131312031362E333237313131763130362E313833313131682D3135352E30373931313161382E31333531313120382E3133353131312030203020302D382E31303636363620382E313036363637763235332E313535353535682D39372E393632363637563336342E3934323232326131362E3332373131312031362E3332373131312030203020302D31362E3332373131312D31362E3332373131314837312E3232343838396131362E3332373131312031362E3332373131312030203020302D31362E3335353535362031362E333237313131763239332E393434383839633020392E30343533333320372E3331303232322031362E3335353535362031362E3335353535362031362E333535353536683239332E3833313131316131362E3332373131312031362E3332373131312030203020302031362E3332373131312D31362E333535353536762D3131302E3237393131316839372E393632363637763235332E313535353536633020342E34333733333320332E36343038383920382E31303636363720382E31303636363620382E313036363636683135352E303739313132763130362E313833313131633020392E30313638383920372E3331303232322031362E3332373131312031362E3335353535352031362E333237313131683239332E3833313131316131362E3332373131312031362E3332373131312030203020302031362E3332373131312D31362E333535353535563632322E3336343434346131362E3332373131312031362E3332373131312030203020302D31362E3335353535352D31362E333535353535483635392E3030303838396131362E3332373131312031362E3332373131312030203020302D31362E3335353535362031362E333535353535763131342E323839373738682D38392E383237353535762D3434392E3133373737386838392E383237353535763131342E323631333334633020392E30343533333320372E3331303232322031362E3335353535362031362E3335353535362031362E3335353535357A206D36312E3135353535352D3234392E303331313131683137312E343036323233763137312E3532682D3137312E343334363637762D3137312E35327A206D2D3431362E323536203432382E363537373738483133322E343635373738563432362E333832323232683137312E343334363636763137312E3433343636377A206D3431362E3232373535362038352E383435333333683137312E343334363637763137312E353438343435682D3137312E343334363637762D3137312E35327A2220702D69643D2231323334223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.RemoveFieldsJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.RemoveFieldsJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"RemoveFieldsJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"字段处理\",\"display\":\"列操作删除\",\"description\":\"列操作删除\",\"doc\":\"RemoveFieldsJob.md\",\"icon\":\"RemoveFieldsJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"fields\",\"label\":\"删除字段\",\"type\":[\"LIST\"],\"description\":\"删除列操作定义列表,按顺序执行\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":{\"apiVersion\":0,\"name\":null,\"label\":null,\"type\":[\"STRING\"],\"description\":null,\"optional\":false,\"defaultValue\":null,\"placeholder\":null,\"candidates\":null,\"inputType\":null,\"range\":null,\"regex\":null,\"order\":0,\"requireCondition\":null,\"availableCondition\":null,\"listParameter\":null,\"objectParameters\":null},\"objectParameters\":null}]}}', 'process', '', 0x2320E58897E6938DE4BD9CE588A0E999A40A0AE58F82E695B0E8AFB4E6988E0A0A2D206669656C6473EFBC9A20E58897E6938DE4BD9CE5AE9AE4B989E58897E8A1A80A0AE4BE8BE5A6823A0A0AE58F82E695B0E5A682E4B88BEFBC9A0A0A6060600A7B0A2020226669656C647322203A205B202274696D65222C202276616C7565222C202276616C756532222C2022686F737422205D0A7D0A6060600A0AE8BE93E585A5E5A682E4B88BEFBC9A0A0A6060600A7B0A202022686F737422203A202261222C0A20202274696D6522203A2022323032302D31312D32322031323A30303A3030222C0A20202276616C756522203A20310A7D0A7B0A202022686F737422203A202262222C0A20202274696D6522203A2022323032302D31312D32322031323A30303A3031222C0A20202276616C756522203A20320A7D0A6060600A0AE8BE93E587BAE79A84E695B0E68DAEE5A682E4B88BEFBC9A0A0A6060600A7B7D0A7B7D0A6060600A, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313630393330353232373535332220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22323337322220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3137302E3636363636372038352E333333333333683239382E3636363636366138352E3333333333332038352E3333333333332030203020312038352E3333333333342038352E333333333334763638322E3636363636366138352E3333333333332038352E3333333333332030203020312D38352E3333333333342038352E333333333334483137302E3636363636376138352E3333333333332038352E3333333333332030203020312D38352E3333333333342D38352E333333333334563137302E3636363636376138352E3333333333332038352E3333333333332030203020312038352E3333333333342D38352E3333333333346D30203334312E333333333334763137302E363636363636683239382E363636363636762D3137302E363636363636483137302E3636363636376D3020323536763137302E363636363636683239382E363636363636762D3137302E363636363636483137302E3636363636374D3137302E363636363637203137302E363636363637763137302E363636363636683239382E363636363636563137302E363636363637483137302E3636363636376D3537392E3834203334312E3333333333334C363430203430312E343933333333203730302E3136203334312E333333333333203831302E363636363637203435312E3834203932312E313733333333203334312E333333333333203938312E333333333333203430312E343933333333203837302E38323636363720353132203938312E333333333333203632322E353036363637203932312E313733333333203638322E363636363637203831302E363636363637203537322E3136203730302E3136203638322E36363636363720363430203632322E353036363637203735302E353036363637203531327A222066696C6C3D222220702D69643D2232333733223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.RenameFieldsJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.RenameFieldsJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"RenameFieldsJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"字段处理\",\"display\":\"列操作重命名\",\"description\":\"列操作重命名\",\"doc\":\"RenameFieldsJob.md\",\"icon\":\"RenameFieldsJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"fields\",\"label\":\"重命名字段\",\"type\":[\"LIST\"],\"description\":\"重命名列操作定义列表,按顺序执行\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":{\"apiVersion\":0,\"name\":null,\"label\":null,\"type\":[\"OBJECT\"],\"description\":null,\"optional\":false,\"defaultValue\":null,\"placeholder\":null,\"candidates\":null,\"inputType\":null,\"range\":null,\"regex\":null,\"order\":0,\"requireCondition\":null,\"availableCondition\":null,\"listParameter\":null,\"objectParameters\":[{\"apiVersion\":2,\"name\":\"oldField\",\"label\":\"原始列\",\"type\":[\"STRING\"],\"description\":\"重命名前列的名称\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"newField\",\"label\":\"新列\",\"type\":[\"STRING\"],\"description\":\"重命名后列的名称。如果该列名已存在,那么原来的列会被覆盖\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"isReplace\",\"label\":\"是否覆盖\",\"type\":[\"BOOL\"],\"description\":\"如果添加的字段已存在,是否覆盖原先的值\",\"optional\":true,\"defaultValue\":\"false\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]},\"objectParameters\":null}]}}', 'process', '', 0x2320E58897E6938DE4BD9CE9878DE591BDE5908D0A0AE58F82E695B0E8AFB4E6988E0A0A2D206669656C6473EFBC9A20E58897E6938DE4BD9CE5AE9AE4B989E58897E8A1A80A0AE4BE8BE5A6823A0A0AE58F82E695B0E5A682E4B88BEFBC9A0A0A6060600A7B0A2020226669656C647322203A205B207B0A20202020226F6C644669656C6422203A2022686F7374222C0A20202020226E65774669656C6422203A2022484F5354220A20207D2C207B0A20202020226F6C644669656C6422203A202276616C7565222C0A20202020226E65774669656C6422203A202274696D65220A20207D2C207B0A20202020226F6C644669656C6422203A202274696D65222C0A20202020226E65774669656C6422203A202276616C7565222C0A202020202269735265706C61636522203A20747275650A20207D205D0A7D0A6060600A0AE8BE93E585A5E5A682E4B88BEFBC9A0A0A6060600A7B0A202022686F737422203A202261222C0A20202274696D6522203A2022323032302D31312D32322031323A30303A3030222C0A20202276616C756522203A20310A7D0A7B0A202022686F737422203A202262222C0A20202274696D6522203A2022323032302D31312D32322031323A30303A3031222C0A20202276616C756522203A20320A7D0A6060600A0AE8BE93E587BAE79A84E695B0E68DAEE5A682E4B88BEFBC9A0A0A6060600A7B22484F5354223A2261222C2276616C7565223A22323032302D31312D32322031323A30303A3030227D0A7B22484F5354223A2262222C2276616C7565223A22323032302D31312D32322031323A30303A3031227D0A6060600A, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313630393239343534393537322220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22373334312220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3634203830304835332E37366133312E33362033312E33362030203020312D31392E38342D34302E33326C3132382D3338344133322E36342033322E363420302030203120313932203335326133322E36342033322E36342030203020312033302E30382032312E37366C313238203338346133322033322030203120312D36302E31362032302E34384C313932203438352E31326C2D39372E3932203239332E31326133302E37322033302E37322030203020312D33302E30382032312E37367A222066696C6C3D22233444344434442220702D69643D2237333432223E3C2F706174683E3C7061746820643D224D323536203637324831323861333220333220302030203120302D36346831323861333220333220302030203120302036347A4D37363820373638682D39366133322033322030203020312D33322D3332762D3139326133322033322030203020312033322D33324837363861313238203132382030203020312030203235367A206D2D36342D363468363461363420363420302030203020302D313238682D36347A222066696C6C3D22233444344434442220702D69643D2237333433223E3C2F706174683E3C7061746820643D224D38333220393630682D3136306133322033322030203020312D33322D3332762D3139326133322033322030203020312033322D33324838333261313238203132382030203020312030203235367A206D2D3132382D36346831323861363420363420302030203020302D313238682D3132387A4D3737332E3736203433342E35366133322033322030203020312D32312E31322D372E36386C2D39362D38352E31326133312E33362033312E333620302030203120302D34342E382033322E36342033322E36342030203020312034352E343420306C37312E36382036342036342D37312E36386133312E33362033312E33362030203020312034342E3820302033322E36342033322E363420302030203120302034352E34346C2D38342E34382039366133332E39322033332E39322030203020312D32322E342031302E38387A222066696C6C3D22233444344434442220702D69643D2237333434223E3C2F706174683E3C7061746820643D224D373638203338346133322033322030203020312D33322D333220323234203232342030203020302D3433322D38332E38342033322033322030203020312D35382E38382D32342E3332413238382032383820302030203120383030203335326133322033322030203020312D33322033327A222066696C6C3D22233444344434442220702D69643D2237333435223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.SqlJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.SqlJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.table.api.Table\",\"parameterizedTypes\":null}],\"outTypes\":[{\"raw\":\"org.apache.flink.table.api.Table\",\"parameterizedTypes\":null}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"SqlJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"脚本处理\",\"display\":\"执行sql_1.9\",\"description\":\"上游StreamToTable转为table后,再执行sql; 下游可以通过TableToStreamJob再转回DataStream\",\"doc\":\"SqlJob.md\",\"icon\":\"SqlJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"sql\",\"label\":\"sql语句\",\"type\":[\"STRING\"],\"description\":\"请指定sql语句,可以支持过滤,聚合等操作\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"SQL\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"tableName\",\"label\":\"输出表的名称\",\"type\":[\"STRING\"],\"description\":\"sql语句执行的结果表名\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'process', '', 0x232053514CE689A7E8A18C0A0AE4B88AE6B8B84461746153747265616DE695B0E68DAEE794A853747265616D546F5461626C654A6F62E8BDACE4B8BA7461626C65E5908EEFBC8CE5868DE689A7E8A18C53716C4A6F62EFBC9BE4B88BE6B8B8E58FAFE4BBA5E9809AE8BF875461626C65546F53747265616D4A6F62E5868DE8BDACE59B9E4461746153747265616DEFBC9B0A2D20666C696E6B2073716CE8AFADE6B395E8AFB7E58F82E88083EFBC9A2068747470733A2F2F63692E6170616368652E6F72672F70726F6A656374732F666C696E6B2F666C696E6B2D646F63732D72656C656173652D312E392F6465762F7461626C652F73716C2E68746D6C0A0A0A232320E6A0B7E4BE8BE8AFB4E6988E0A0A73716CE6938DE4BD9CE4B880E888ACE79A84E4B889E983A8E69BB2EFBC9A0A0A2D20E8BE93E585A5E695B0E68DAEE9809AE8BF8753747265616D546F5461626C654A6F62E68C896576656E74E6A8A1E5BC8FE8BDACE58C967461626C65EFBC8CE8BE93E587BA726F775F74696D65E5819AE4B8BA77617465726D61726BEFBC9B0A2D20E5868DE689A7E8A18C53716C4A6F62E8BF9BE8A18CE695B0E68DAEE5A484E79086EFBC9B0A2D20E9809AE8BF875461626C65546F53747265616D4A6F62E5868DE8BDACE59B9E4461746153747265616DEFBC8CE4B88BE6B8B8E58FAFE4BBA5E5819AE585B6E4BB96E79A844461746153747265616DE5A484E79086E6889673696E6BEFBC9B0A0A0AE8BE93E585A5E5A682E4B88BEFBC9A0A0A6060600A7B2250726F76696465724964223A22313030303032222C22436F6C537263466C6167223A2231222C224D73674964223A2261222C2274696D657374616D70223A313631303030303338333333392C22447467726D526C223A312C2252657475726E436F6465223A22227D0A7B2250726F76696465724964223A22313030303032222C22436F6C537263466C6167223A2231222C224D73674964223A2261222C2274696D657374616D70223A313631303030303338363333392C22447467726D526C223A342C2252657475726E436F6465223A2230303031227D0A6060600A0A53747265616D546F5461626C654A6F62E58F82E695B0E5A682E4B88BEFBC9A0A0A6060600A7B0A202022636F6C756D6E73223A205B0A202020207B0A20202020202022636F6C756D6E4E616D65223A202250726F76696465724964222C0A20202020202022636F6C756D6E54797065223A2022737472696E67220A202020207D2C0A202020207B0A20202020202022636F6C756D6E4E616D65223A2022436F6C537263466C6167222C0A20202020202022636F6C756D6E54797065223A2022737472696E67220A202020207D2C0A202020207B0A20202020202022636F6C756D6E4E616D65223A20224D73674964222C0A20202020202022636F6C756D6E54797065223A2022737472696E67220A202020207D2C0A202020207B0A20202020202022636F6C756D6E4E616D65223A202274696D657374616D70222C0A20202020202022636F6C756D6E54797065223A20226C6F6E67220A202020207D2C0A202020207B0A20202020202022636F6C756D6E4E616D65223A2022447467726D526C222C0A20202020202022636F6C756D6E54797065223A2022696E74220A202020207D2C0A202020207B0A20202020202022636F6C756D6E4E616D65223A202252657475726E436F6465222C0A20202020202022636F6C756D6E54797065223A2022737472696E67220A202020207D0A20205D2C0A2020226576656E7454696D65456E61626C6564223A20747275652C0A2020226576656E7454696D654F75747075744669656C64223A2022726F775F74696D65222C0A202022616C6C6F7765644C6174656E657373223A20302C0A20202274696D654669656C644E616D65223A202274696D657374616D70222C0A20202274696D65466F726D6174223A2022554E49585F4D53222C0A2020226576656E7454696D6546726F6D536F75726365223A2066616C73652C0A20202270726F6354696D65456E61626C6564223A2066616C73652C0A2020227461626C654E616D65223A20227265715F72657370222C0A20202277696E646F774F66667365744265694A696E67223A2066616C73650A7D0A6060600A0A53716C4A6F62E58F82E695B0E5A682E4B88BEFBC9A0A0A6060600A7B0A20202273716C223A202273656C656374202A202C20287265737054696D65202D2072657154696D6529206173204475726174696F6E2066726F6D202873656C6563742053455353494F4E5F535441525428726F775F74696D652C20696E74657276616C2027313027207365636F6E642920617320607472616E735F74696D65602C5C6E6D6178286074696D657374616D706029206173206074696D657374616D70602C5C6E6D61782850726F76696465724964292061732050726F766964657249642C5C6E6D617828436F6C537263466C61672920617320436F6C537263466C61672C5C6E4D736749642C5C6E6D61782843415345205748454E20447467726D526C203D2034207468656E2052657475726E436F646520656C736520272720656E64292061732052657475726E436F64652C5C6E6D61782843415345205748454E20447467726D526C203D2034207468656E206074696D657374616D706020656C7365203020656E6429206173207265737054696D652C5C6E6D61782843415345205748454E20447467726D526C203D2031207468656E206074696D657374616D706020656C7365203020656E64292061732072657154696D652C5C6E6D61782843415345205748454E2050726F76696465724964206E6F7420696E202827313030303032272C273130303030332729207468656E20276D617374657227205748454E2050726F76696465724964203D202731303030303227207468656E2027736C6176652720656C736520272720656E642920617320436F7265547970655C6E66726F6D207265715F7265737020776865726520436F6C537263466C6167203D27312720616E642050726F76696465724964206C696B6520273130303025275C6E67726F7570206279204D736749642C2053455353494F4E28726F775F74696D652C20696E74657276616C2027313027207365636F6E64295C6E29222C0A2020227461626C654E616D65223A20226F7574707574220A7D0A6060600A0A5461626C65546F53747265616D4A6F62E697A0E99C80E68C87E5AE9AE58F82E695B0EFBC9B0A0AE8BE93E587BAE8819AE59088E7BB93E69E9CE5A682E4B88BEFBC9A0A0A6060600A7B0A20202250726F76696465724964223A2022313030303032222C0A20202252657475726E436F6465223A202230303031222C0A202022436F6C537263466C6167223A202231222C0A2020227265737054696D65223A20313631303030303338363333392C0A2020227472616E735F74696D65223A20313630393937313538333333392C0A2020224475726174696F6E223A20333030302C0A20202272657154696D65223A20313631303030303338333333392C0A202022436F726554797065223A2022736C61766520222C0A2020224D73674964223A202261222C0A20202274696D657374616D70223A20313631303030303338363333390A7D0A6060600A0A, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313631303036393232383630352220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22333335372220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3237312E31203332372E35203230382E36203338322E37632D32322D33302E362D34342E332D34352E382D36372E312D34352E382D31312E3120302D32302E3120332D32372E3220382E392D3720352E392D31302E362031322E362D31302E362032302E31203020372E3420322E352031342E3520372E362032312E3120362E3820382E392032372E352032372E392036312E392035372033322E322032362E392035312E382034332E392035382E362035312031372E312031372E332032392E332033332E382033362E342034392E3620372E312031352E382031302E372033332031302E372035312E3720302033362E342D31322E362036362E352D33372E372039302E322D32352E322032332E372D35382033352E362D39382E342033352E362D33312E3620302D35392E312D372E372D38322E362D32332E322D32332E342D31352E352D34332E352D33392E382D36302E322D37336C37312D34322E386332312E332033392E322034352E392035382E382037332E372035382E382031342E3520302032362E372D342E322033362E362D31322E3720392E392D382E342031342E382D31382E322031342E382D32392E3320302D31302E312D332E372D32302E312D31312E322D33302E322D372E352D31302E312D32332E392D32352E342D34392E322D34362E312D34382E332D33392E342D37392E362D36392E382D39332E372D39312E322D31342E312D32312E342D32312E312D34322E382D32312E312D36342E3120302D33302E382031312E372D35372E322033352E322D37392E322032332E342D32322035322E342D33332038362E382D33332032322E3120302034332E3220352E312036332E332031352E34433232362E31203238312E36203234372E38203330302E33203237312E31203332372E357A2220702D69643D2233333538223E3C2F706174683E3C7061746820643D224D3730392E32203634366C37372E322039392E382D31303020302D33392E322D35302E35632D33322E342031372E382D36382E362032362E362D3130382E342032362E362D36362E3620302D3132322D32332D3136362E312D36382E392D34342E312D34352E392D36362E312D3130302E372D36362E312D3136342E3220302D34322E342031302E332D38312E342033302E382D3131362E392032302E352D33352E352034382E372D36332E372038342E372D38342E362033352E392D32302E392037342E352D33312E34203131352E372D33312E342036332030203131372032322E37203136322E322036382E322034352E322034352E342036372E38203130302E382036372E38203136362E32433736372E38203535302E35203734382E32203630322E33203730392E32203634367A4D3635362E35203537372E386331372E392D32362E352032362E382D35352E392032362E382D38382E3120302D34322D31342E322D37372E372D34322E362D3130372E312D32382E342D32392E332D36322E372D34342D3130332D34342D34312E3520302D37362E322031342E332D3130342E322034322E382D32382032382E362D34322036342E382D3432203130382E3920302034392E312031372E362038372E392035322E39203131362E342032372E362032322E332035382E392033332E352039342033332E352032302E3120302033392E312D332E392035362E382D31312E386C2D37392E342D3130322E32203130302E3720304C3635362E35203537372E387A2220702D69643D2233333539223E3C2F706174683E3C7061746820643D224D3831362E35203236372E316C38342E3420302030203336332E314C31303234203633302E326C302038302E354C3831362E35203731302E37203831362E35203236372E317A2220702D69643D2233333630223E3C2F706174683E3C2F7376673E, 'flink-job-1_9_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.StreamToTableJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.StreamToTableJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.table.api.Table\",\"parameterizedTypes\":null}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"StreamToTableJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"数据类型转换\",\"display\":\"Map转Table_1.9\",\"description\":\"按指定schema转成Table,下游可以用SqlJob进行数据操作\",\"doc\":\"SqlJob.md\",\"icon\":\"StreamToTableJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"columns\",\"label\":\"字段定义\",\"type\":[\"LIST\"],\"description\":\"转成的table需要哪些字段\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":{\"apiVersion\":0,\"name\":null,\"label\":null,\"type\":[\"OBJECT\"],\"description\":null,\"optional\":false,\"defaultValue\":null,\"placeholder\":null,\"candidates\":null,\"inputType\":null,\"range\":null,\"regex\":null,\"order\":0,\"requireCondition\":null,\"availableCondition\":null,\"listParameter\":null,\"objectParameters\":[{\"apiVersion\":2,\"name\":\"columnName\",\"label\":\"源字段名\",\"type\":[\"STRING\"],\"description\":\"源数据里的字段名\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"aliasName\",\"label\":\"目标字段名\",\"type\":[\"STRING\"],\"description\":\"定义table里的字段名;不填则默认同源字段名;Event模式下指定时间字段不能重命名。\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"columnType\",\"label\":\"字段类型\",\"type\":[\"STRING\"],\"description\":\"定义table里的字段类型\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[\"string\",\"int\",\"double\",\"float\",\"decimal\",\"boolean\",\"short\",\"long\",\"timestamp\",\"time\",\"date\"],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]},\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"eventTimeEnabled\",\"label\":\"是否在table中添加event_time\",\"type\":[\"BOOL\"],\"description\":\"是否在table中添加event_time\",\"optional\":true,\"defaultValue\":\"false\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"eventTimeOutputField\",\"label\":\"输出event时间戳字段名称\",\"type\":[\"STRING\"],\"description\":\"在下游sql语句里可使用的字段名\",\"optional\":true,\"defaultValue\":\"event_time\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"allowedLateness\",\"label\":\"业务时间最大延迟,单位毫秒\",\"type\":[\"INT\"],\"description\":\"event模式下,业务时间最大延迟,单位毫秒\",\"optional\":true,\"defaultValue\":\"10000\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"timeFieldName\",\"label\":\"时间字段\",\"type\":[\"STRING\"],\"description\":\"event模式下,通过时间字段设置水位线;时间字段无法重命名为目标字段名\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"timeFormat\",\"label\":\"时间格式\",\"type\":[\"STRING\"],\"description\":\"event模式下,支持UNIX_S, UNIX_MS以及通用时间表达格式;\",\"optional\":true,\"defaultValue\":\"UNIX_MS\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"timeLocale\",\"label\":\"输入时间格式方言\",\"type\":[\"STRING\"],\"description\":\"event模式下,支持用户设定时间方言,默认的时区为: en-US,可选的时区参见列表: https://www.andiamo.co.uk/resources/iso-language-codes\",\"optional\":true,\"defaultValue\":\"en-US\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"windowOffsetBeiJing\",\"label\":\"是否开启北京时间\",\"type\":[\"BOOL\"],\"description\":\"是否开启北京时间\",\"optional\":true,\"defaultValue\":\"false\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"eventTimeFromSource\",\"label\":\"是否复用上游的event time以及watermark\",\"type\":[\"BOOL\"],\"description\":\"是否在schema生成时,使用上游数据流已经生成的event time以及watermark\",\"optional\":true,\"defaultValue\":\"false\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"procTimeEnabled\",\"label\":\"是否在table中添加proc_time\",\"type\":[\"BOOL\"],\"description\":\"是否在table中添加proc_time\",\"optional\":true,\"defaultValue\":\"false\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"procTimeOutputField\",\"label\":\"输出processing时间戳字段名称\",\"type\":[\"STRING\"],\"description\":\"在下游sql语句里可使用的字段名,注意按照该类型生成的时间是UTC时间,与北京时间差8小时\",\"optional\":true,\"defaultValue\":\"proc_time\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"tableName\",\"label\":\"输出表名\",\"type\":[\"STRING\"],\"description\":\"下游SqlJob可select from此表名\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'process', '', 0x232053514CE689A7E8A18C0A0AE4B88AE6B8B84461746153747265616DE695B0E68DAEE794A853747265616D546F5461626C654A6F62E8BDACE4B8BA7461626C65E5908EEFBC8CE5868DE689A7E8A18C53716C4A6F62EFBC9BE4B88BE6B8B8E58FAFE4BBA5E9809AE8BF875461626C65546F53747265616D4A6F62E5868DE8BDACE59B9E4461746153747265616DEFBC9B0A2D20666C696E6B2073716CE8AFADE6B395E8AFB7E58F82E88083EFBC9A2068747470733A2F2F63692E6170616368652E6F72672F70726F6A656374732F666C696E6B2F666C696E6B2D646F63732D72656C656173652D312E392F6465762F7461626C652F73716C2E68746D6C0A0A0A232320E6A0B7E4BE8BE8AFB4E6988E0A0A73716CE6938DE4BD9CE4B880E888ACE79A84E4B889E983A8E69BB2EFBC9A0A0A2D20E8BE93E585A5E695B0E68DAEE9809AE8BF8753747265616D546F5461626C654A6F62E68C896576656E74E6A8A1E5BC8FE8BDACE58C967461626C65EFBC8CE8BE93E587BA726F775F74696D65E5819AE4B8BA77617465726D61726BEFBC9B0A2D20E5868DE689A7E8A18C53716C4A6F62E8BF9BE8A18CE695B0E68DAEE5A484E79086EFBC9B0A2D20E9809AE8BF875461626C65546F53747265616D4A6F62E5868DE8BDACE59B9E4461746153747265616DEFBC8CE4B88BE6B8B8E58FAFE4BBA5E5819AE585B6E4BB96E79A844461746153747265616DE5A484E79086E6889673696E6BEFBC9B0A0A0AE8BE93E585A5E5A682E4B88BEFBC9A0A0A6060600A7B2250726F76696465724964223A22313030303032222C22436F6C537263466C6167223A2231222C224D73674964223A2261222C2274696D657374616D70223A313631303030303338333333392C22447467726D526C223A312C2252657475726E436F6465223A22227D0A7B2250726F76696465724964223A22313030303032222C22436F6C537263466C6167223A2231222C224D73674964223A2261222C2274696D657374616D70223A313631303030303338363333392C22447467726D526C223A342C2252657475726E436F6465223A2230303031227D0A6060600A0A53747265616D546F5461626C654A6F62E58F82E695B0E5A682E4B88BEFBC9A0A0A6060600A7B0A202022636F6C756D6E73223A205B0A202020207B0A20202020202022636F6C756D6E4E616D65223A202250726F76696465724964222C0A20202020202022636F6C756D6E54797065223A2022737472696E67220A202020207D2C0A202020207B0A20202020202022636F6C756D6E4E616D65223A2022436F6C537263466C6167222C0A20202020202022636F6C756D6E54797065223A2022737472696E67220A202020207D2C0A202020207B0A20202020202022636F6C756D6E4E616D65223A20224D73674964222C0A20202020202022636F6C756D6E54797065223A2022737472696E67220A202020207D2C0A202020207B0A20202020202022636F6C756D6E4E616D65223A202274696D657374616D70222C0A20202020202022636F6C756D6E54797065223A20226C6F6E67220A202020207D2C0A202020207B0A20202020202022636F6C756D6E4E616D65223A2022447467726D526C222C0A20202020202022636F6C756D6E54797065223A2022696E74220A202020207D2C0A202020207B0A20202020202022636F6C756D6E4E616D65223A202252657475726E436F6465222C0A20202020202022636F6C756D6E54797065223A2022737472696E67220A202020207D0A20205D2C0A2020226576656E7454696D65456E61626C6564223A20747275652C0A2020226576656E7454696D654F75747075744669656C64223A2022726F775F74696D65222C0A202022616C6C6F7765644C6174656E657373223A20302C0A20202274696D654669656C644E616D65223A202274696D657374616D70222C0A20202274696D65466F726D6174223A2022554E49585F4D53222C0A2020226576656E7454696D6546726F6D536F75726365223A2066616C73652C0A20202270726F6354696D65456E61626C6564223A2066616C73652C0A2020227461626C654E616D65223A20227265715F72657370222C0A20202277696E646F774F66667365744265694A696E67223A2066616C73650A7D0A6060600A0A53716C4A6F62E58F82E695B0E5A682E4B88BEFBC9A0A0A6060600A7B0A20202273716C223A202273656C656374202A202C20287265737054696D65202D2072657154696D6529206173204475726174696F6E2066726F6D202873656C6563742053455353494F4E5F535441525428726F775F74696D652C20696E74657276616C2027313027207365636F6E642920617320607472616E735F74696D65602C5C6E6D6178286074696D657374616D706029206173206074696D657374616D70602C5C6E6D61782850726F76696465724964292061732050726F766964657249642C5C6E6D617828436F6C537263466C61672920617320436F6C537263466C61672C5C6E4D736749642C5C6E6D61782843415345205748454E20447467726D526C203D2034207468656E2052657475726E436F646520656C736520272720656E64292061732052657475726E436F64652C5C6E6D61782843415345205748454E20447467726D526C203D2034207468656E206074696D657374616D706020656C7365203020656E6429206173207265737054696D652C5C6E6D61782843415345205748454E20447467726D526C203D2031207468656E206074696D657374616D706020656C7365203020656E64292061732072657154696D652C5C6E6D61782843415345205748454E2050726F76696465724964206E6F7420696E202827313030303032272C273130303030332729207468656E20276D617374657227205748454E2050726F76696465724964203D202731303030303227207468656E2027736C6176652720656C736520272720656E642920617320436F7265547970655C6E66726F6D207265715F7265737020776865726520436F6C537263466C6167203D27312720616E642050726F76696465724964206C696B6520273130303025275C6E67726F7570206279204D736749642C2053455353494F4E28726F775F74696D652C20696E74657276616C2027313027207365636F6E64295C6E29222C0A2020227461626C654E616D65223A20226F7574707574220A7D0A6060600A0A5461626C65546F53747265616D4A6F62E697A0E99C80E68C87E5AE9AE58F82E695B0EFBC9B0A0AE8BE93E587BAE8819AE59088E7BB93E69E9CE5A682E4B88BEFBC9A0A0A6060600A7B0A20202250726F76696465724964223A2022313030303032222C0A20202252657475726E436F6465223A202230303031222C0A202022436F6C537263466C6167223A202231222C0A2020227265737054696D65223A20313631303030303338363333392C0A2020227472616E735F74696D65223A20313630393937313538333333392C0A2020224475726174696F6E223A20333030302C0A20202272657154696D65223A20313631303030303338333333392C0A202022436F726554797065223A2022736C61766520222C0A2020224D73674964223A202261222C0A20202274696D657374616D70223A20313631303030303338363333390A7D0A6060600A0A, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313631303036393230323437302220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22323533332220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3132332E373531203430392E313437683235392E3937346331352E383520302032352E3336342D31322E3638322032352E3336342D32352E33363420302D31352E3835342D31322E3638322D32352E3336332D32352E3336342D32352E333633483138332E39396336302E3233362D3132332E363436203138332E3838322D3230392E323438203332362E3535312D3230392E323438203138302E3731332030203333322E383931203133362E333238203335382E323534203331302E3639396835332E383938433839372E333331203235362E393635203732322E3935382039382E343437203531302E3534312039382E343437632D3135352E333520302D3238382E3530362038352E3630322D3336312E343236203231322E343137563132332E38303963302D31322E3638312D392E3530392D32352E3336332D32352E3336342D32352E3336332D31322E36383120302D32352E3336332031322E3638322D32352E3336332032352E333633763235392E39373463302E3030312032352E3336342032352E3336332032352E3336342032352E3336332032352E3336346D3737362E373438203230362E303736682D3235392E3937632D31352E38353420302D32352E3336332031322E3638322D32352E3336332032352E33363420302031352E3834382031322E3638322032352E3336322032352E3336332032352E333632683139362E353633433738302E303235203738392E353932203635332E3231203837322E303236203531302E353431203837322E303236632D3138302E37313320302D3333322E3839312D3133362E3332382D3335382E3235342D3331302E37682D35302E373235433132362E393235203736372E343033203330312E323933203932352E3932203531302E353431203932352E3932633135352E33352030203239312E3637342D38352E353938203336312E3432372D3231322E343137763138372E30353463302031352E3835342031322E3638322032352E3336332032352E3336332032352E3336332031352E38353120302032352E3336332D31322E3638312032352E3336332D32352E333633563634302E35383863332E3136392D32352E3336352D32322E3139352D32352E3336352D32322E3139352D32352E3336356D3020307A222066696C6C3D22233039423642412220702D69643D2232353334223E3C2F706174683E3C2F7376673E, 'flink-job-1_9_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.StringDecoderJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.StringDecoderJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]},{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"StringDecoderJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"文本解析\",\"display\":\"解码器(String)\",\"description\":\"把byte数组按指定字符集转换为String,并输出到指定字段,如果不指定输出字段则默认输出到@message字段,\\n输出slot 0 为decode成功数据,输出slot 1 为decode失败数据(错误原因添加在error_msg字段) \",\"doc\":\"StringDecoderJob.md\",\"icon\":\"StringDecoderJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"byteArrayFieldName\",\"label\":\"输入字段\",\"type\":[\"STRING\"],\"description\":\"从上游的Map中指定目标字段名,字段值需要是二进制数组(byte[])类型\",\"optional\":true,\"defaultValue\":\"bytes\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"outputFieldName\",\"label\":\"输出字段\",\"type\":[\"STRING\"],\"description\":\"如果指定Decoder后内容输出到指定的字段名,如果不指定输出字段则默认输出到@message字段\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"removeByteArrayField\",\"label\":\"移除输入字段\",\"type\":[\"BOOL\"],\"description\":\"是否移除目标字段\",\"optional\":true,\"defaultValue\":\"true\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"reserveOriginColumns\",\"label\":\"是否保留原有字段\",\"type\":[\"BOOL\"],\"description\":\"当未指定输出字段时,输出为整个顶层Map,是否同时保留原有字段\",\"optional\":true,\"defaultValue\":\"false\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"charset\",\"label\":\"字符编码\",\"type\":[\"STRING\"],\"description\":\"例如标准编码:US-ASCII,ISO-8859-1,UTF-8,UTF-16BE,UTF-16LE,UTF-16\",\"optional\":true,\"defaultValue\":\"UTF-8\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'process', '', 0x2320E8A7A3E7A08162797465E695B0E7BB84E4B8BA537472696E67E5AD97E7ACA6E4B8B20A0AE68A8A62797465E695B0E7BB84E68C89E68C87E5AE9AE5AD97E7ACA6E99B86E8BDACE68DA2E4B8BA537472696E672CE5B9B6E8BE93E587BAE588B0E68C87E5AE9AE5AD97E6AEB50A2D20E8BE93E587BA736C6F742030EFBC8C20E7B1BBE59E8BE4B8BA604D61703C537472696E672C204F626A6563743E60EFBC8C6465636F6465E68890E58A9FE695B0E68DAE0A2D20E8BE93E587BA736C6F742031EFBC8C20E7B1BBE59E8BE4B8BA604D61703C537472696E672C204F626A6563743E60EFBC8C6465636F6465E5A4B1E8B4A5E695B0E68DAEEFBC88E99499E8AFAFE58E9FE59BA0E6B7BBE58AA0E59CA86572726F725F6D7367E5AD97E6AEB5EFBC890A0AE4BE8BE5A682E8BE93E585A5E79A84E6B688E681AFE5A682E4B88BEFBC9A0A0A6060600A7B0A2020226279746573223A202265794A304D534936496E517849697769644449694F694A304D694973496E517A496A6F6964444D694C434A416147397A64473568625755694F694A7362324E6862476876633351694C434A41634746306143493649693932595849766247396E4C32356E615735344C32466A5932567A63793573623263694C434A41636D3933626E5674596D5679496A6F784C434A4151476C6B496A6F6961575178496977695145426B5A584E6A636D6C7764476C7662694936496A45334D6934784E6934784D6A67754D6A4D31494330674C5342624D6A5976546D39324C7A49774D546B364D5451364D4455364D544D674B7A41344D4442644945644656434176595842704C326C3062324576626D393061574E6C4C32357664476C6A5A556C75596D39344C324A31596D4A735A556C75596D393449456855564641764D533478494451774D5341304D69426F644852774F6938764D546B794C6A45324F4334794D5334784D7A49766247396E6157342F636D563064584A7556584A7350535579526E4E356333526C62535579526E4E6C64485270626D647A4A544E47644746696157356B5A58676C4D30516C4D6A56464E5355794E5546454A5449314F54676C4D6A56464E5355794E5467794A5449315154676C4D6A56464E5355794E546C444A544931516A416C4D6A56464E5355794E546C454A5449314F44416C4D6A56464E7955794E5546464A5449315154456C4D6A56464E7955794E546B774A5449314F4459675457393661577873595338314C6A41674B45316859326C756447397A61447367535735305A5777675457466A49453954494667674D5442664D5452664D796B6751584277624756585A574A4C615851764E544D334C6A4D324943684C5346524E5443776762476C725A5342485A574E7262796B67513268796232316C4C7A63344C6A41754D7A6B774E4334354E79425459575A68636D6B764E544D334C6A4D32494463334F4467674C534973496B42306157316C63335268625841694F6A45314E6A51334D5451324F4441774D444173496E4E306157316C496A6F694D6A41784F5338344C7A49674D5441364E5467364D434A39222C0A2020226D657461223A207B0A2020202022746F706963223A20226B7374222C0A2020202022706172746974696F6E223A20302C0A20202020226F6666736574223A20302C0A202020202274696D657374616D70223A20313630373537313439373333390A20207D0A7D0A6060600A0AE58F82E695B0E8AFB4E6988E0A0A2D2063686172736574EFBC9A2062797465E695B0E7BB84E8A7A3E7A081E4B8BA737472696E67E79A84E5AD97E7ACA6E99B86200A2D206279746541727261794669656C644E616D65EFBC9AE8BE93E585A5E695B0E68DAEE9878C62797465E695B0E7BB84E68980E59CA8E5AD97E6AEB5E5908D0A2D206F75747075744669656C644E616D65EFBC9AE58F8DE5BA8FE58897E58C96E5908EE58685E5AEB9E8BE93E587BAE588B0E68C87E5AE9AE79A84E5AD97E6AEB5E5908DEFBC8CE5A682E69E9CE4B88DE68C87E5AE9AE8BE93E587BAE5AD97E6AEB5E58899E9BB98E8AEA4E8BE93E587BAE588B0406D657373616765E5AD97E6AEB50A0AE5A682E69E9CE68C895554462D38E8A7A3E7A08162797465E695B0E7BB84E4B8BA737472696E67EFBC8CE784B6E5908EE58F8DE5BA8FE58897E58C96E4B8BA6A736F6EEFBC8CE5B9B6E8BE93E587BAE588B06A736F6E4F7574707574E5AD97E6AEB50AE58F82E695B0E5A682E4B88BEFBC9A0A0A6060600A7B0A2020226368617273657422203A20225554462D38222C0A2020226279746541727261794669656C644E616D6522203A20226279746573222C0A2020226F75747075744669656C644E616D6522203A20226A736F6E4F7574707574222C0A20202272656D6F76654279746541727261794669656C6422203A20747275650A7D0A6060600A0A0AE8BE93E587BAE79A84E695B0E68DAEE5A682E4B88BEFBC88736C6F742030EFBC89EFBC9A0A0A6060600A7B0A2020226A736F6E4F7574707574223A207B0A20202020227431223A20227431222C0A20202020227432223A20227432222C0A20202020227433223A20227433222C0A202020202240686F73746E616D65223A20226C6F63616C686F7374222C0A20202020224070617468223A20222F7661722F6C6F672F6E67696E782F6163636573732E6C6F67222C0A202020202240726F776E756D626572223A20312C0A202020202240406964223A2022696431222C0A202020202240406465736372697074696F6E223A20223137322E31362E3132382E323335202D202D205B32362F4E6F762F323031393A31343A30353A3133202B303830305D20474554202F6170692F69746F612F6E6F746963652F6E6F74696365496E626F782F627562626C65496E626F7820485454502F312E312034303120343220687474703A2F2F3139322E3136382E32312E3133322F6C6F67696E3F72657475726E55726C3D25324673797374656D25324673657474696E6773253346746162696E646578253344253235453525323541442532353938253235453525323538322532354138253235453525323539432532354230253235453525323539442532353830253235453725323541452532354131253235453725323539302532353836204D6F7A696C6C612F352E3020284D6163696E746F73683B20496E74656C204D6163204F5320582031305F31345F3329204170706C655765624B69742F3533372E333620284B48544D4C2C206C696B65204765636B6F29204368726F6D652F37382E302E333930342E3937205361666172692F3533372E33362037373838202D222C0A20202020224074696D657374616D70223A20313536343731343638303030302C0A20202020227374696D65223A2022323031392F382F322031303A35383A30220A20207D2C0A2020226D657461223A207B0A2020202022746F706963223A20226B7374222C0A2020202022706172746974696F6E223A20302C0A20202020226F6666736574223A20302C0A202020202274696D657374616D70223A20313630373537313439373333390A20207D0A7D0A6060600A0AE8BE93E587BAE79A84E99499E8AFAFE695B0E68DAEEFBC88736C6F742031EFBC89EFBC9A0A0A6060600A7B0A2020226572726F725F6D7367223A2022556E7265636F676E697A656420746F6B656E202772727272273A2077617320657870656374696E6720284A534F4E20537472696E672C204E756D6265722C2041727261792C204F626A656374206F7220746F6B656E20276E756C6C272C20277472756527206F72202766616C736527295C6E206174205B536F757263653A2028537472696E67295C22727272725C223B206C696E653A20312C20636F6C756D6E3A20355D222C0A2020226279746573223A2022636E4A7963673D3D222C0A2020226D657461223A207B0A2020202022746F706963223A20226B7374222C0A2020202022706172746974696F6E223A20302C0A20202020226F6666736574223A203133302C0A202020202274696D657374616D70223A20313630373537383736373437390A20207D0A7D0A606060, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313630373539373239343632342220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22313039312220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3339312E3638203536312E37393263302032342E39362D362E3436342034372E33362D31392E3236342036372E3236342D31322E3836342031392E3930342D33312E36382033352E3339322D35362E3338342034362E363536732D35342E30382031362E3839362D38382031362E383936632D34302E37303420302D37342E32342D372E3631362D3130302E3637322D32322E3937362D31382E3735322D31312E3037322D33332E3938342D32352E3835362D34352E3639362D34342E3238384336392E383234203630362E3732203634203538382E38203634203537312E333932203634203536312E32382036372E3532203535322E3537362037342E3536203534352E33343463372E30342D372E3233322031362D31302E3831362032362E38382D31302E38313620382E38333220302031362E32353620322E3735322032322E3420382E333834433132392E383536203534382E353434203133352E3034203535362E393238203133392E33393220353638203134342E3634203538312E3132203135302E323732203539322E313238203135362E343136203630302E393663362E303820382E3833322031342E3635362031362E3036342032352E3732382032312E37362031312E30373220352E37362032352E3620382E36342034332E35383420382E36342032342E37363820302034342E3836342D352E3832342036302E3238382D31372E3334342031352E3438382D31312E3538342032332E3233322D32352E39322032332E3233322D34332E3220302D31332E3639362D342E31362D32342E3833322D31322E3534342D33332E3334342D382E33322D382E3537362D31392E3133362D31352E30342D33322E33322D31392E3538342D31332E3234382D342E34382D33302E3931322D392E32382D35332E3035362D31342E34433138312E3736203439362E373034203135362E393932203438382E353736203133362E3936203437392E323332632D31392E3936382D392E32382D33352E38342D32312E3935322D34372E3438382D33372E3935324337372E363936203432352E32382037312E383732203430352E3337362037312E383732203338312E35363863302D32322E36353620362E3230382D34322E38382031382E35362D36302E34387333302E3237322D33312E3136382035332E3639362D34302E36346332332E3432342D392E3437322035312E3030382D31342E3237322038322E3638382D31342E3237322032352E33343420302034372E31363820332E322036352E36363420392E3430382031382E34333220362E3333362033332E3739322031342E3635362034352E3935322032352E3038382031322E31362031302E3336382032312E31322032312E3331322032362E3638382033322E37363873382E3434382032322E36353620382E3434382033332E343732633020392E39322D332E35322031382E38382D31302E35362032362E383136433335362E303936203430312E373238203334372E333238203430352E363936203333362E383332203430352E363936632D392E35333620302D31362E3833322D322E3336382D32312E37362D372E313034433331302E303136203339332E373238203330342E3634203338352E3932203239382E383136203337352E3034203239312E333238203335392E343838203238322E333638203334372E333932203237312E383732203333382E363234203236312E333132203332392E3932203234342E3438203332352E353638203232312E323438203332352E353638632D32312E35363820302D33382E39313220342E3733362D35322E31362031342E3230382D31332E31383420392E3437322D31392E38342032302E3836342D31392E38342033342E313736203020382E32353620322E32342031352E333620362E37322032312E3337367331302E3638382031312E322031382E35362031352E3438382031352E38373220372E36382032332E3933362031302E3131322032312E33373620362E3031362033392E3933362031302E3632346332332E32333220352E3530342034342E3238382031312E35322036332E3136382031372E3938342031382E38313620362E3635362033342E38382031342E3539322034382E3036342032332E393336433336322E383136203438322E3838203337332E3132203439342E3732203338302E353434203530392E303536203338372E393638203532332E343536203339312E3638203534302E393932203339312E3638203536312E3739327A4D3434392E383536203338372E326C382E34343820304C3435382E333034203334312E30353663302D31322E33353220302E33322D32322E31343420312E3032342D32392E313220302E36342D372E303420322E3439362D31332E313220352E34342D31382E31313220332E3030382D352E32343820372E3239362D392E3533362031322E3932382D31322E38433438332E333238203237372E363936203438392E36203237362E303332203439362E353736203237362E30333263392E37323820302031382E353620332E3634382032362E3433322031312E30303820352E32343820342E38363420382E36342031302E38313620392E3938342031372E373932433533342E34203331312E393336203533352E313034203332312E3932203533352E313034203333342E3738344C3533352E313034203338372E326C32382E30393620306331302E383820302031392E31333620322E35362032342E38393620372E363820352E373620352E31383420382E36342031312E383420382E36342031392E383420302031302E3336382D342E3039362031372E3533362D31322E3232342032312E363936533536342E363038203434322E3536203534392E353034203434322E35364C3533352E313034203434322E35366C30203134312E31383463302031322E30333220302E3338342032312E32343820312E32382032372E373132433533372E3238203631372E3932203533392E3532203632332E313638203534332E313034203632372E3263332E36343820342E30333220392E3620362E30382031372E38353620362E303820342E343820302031302E3632342D302E3833322031382E32342D322E33363820372E3734342D312E362031332E37362D322E3433322031372E3938342D322E34333220362E32373220302031312E37373620322E3439362031362E37363820372E34383820342E39393220342E39323820372E3438382031312E31333620372E3438382031382E33363820302031322E3335322D362E37322032312E3838382D32302E3232342032382E343136732D33332E30323420392E3739322D35382E323420392E373932632D323420302D34322E32342D332E3936382D35342E3539322D31322E303332732D32302E34382D31392E322D32342E33322D33332E3430382D352E37362D33332E3334342D352E37362D35372E3135324C3435382E333034203434322E3536203434382E313932203434322E3536632D31312E30373220302D31392E35322D322E3632342D32352E3334342D372E383732533431342E313434203432322E373834203431342E313434203431342E36353663302D3820332E3030382D31342E36353620392E3135322D31392E3834433432392E333736203338392E3736203433382E323732203338372E32203434392E383536203338372E327A4D3732352E3736203538312E3832346C302036342E31323863302031352E3535322D332E3634382032372E322D31302E38382033352E3030382D372E333620372E3734342D31362E36342031312E3634382D32372E3930342031312E3634382D31312E31333620302D32302E3039362D332E3930342D32372E3236342D31312E373736732D31302E3735322D31392E35322D31302E3735322D33342E38386C302D3231332E373663302D33342E3439362031322E34382D35312E3737362033372E3337362D35312E3737362031322E37333620302032322E30313620332E3936382032372E3634382031322E30333273342E3836342031362E31393220352E3530342033312E39333663392E3135322D31352E3734342032322E342D32332E3837322033322D33312E3933367332322E3635362D31322E3033322033382E37322D31322E3033322033312E37343420332E3936382034362E3834382031322E3033326331352E32333220382E3036342032322E3834382031382E3735322032322E3834382033322E303634203020392E3334342D332E3236342031372E3135322D392E3732382032332E3136382D362E35323820362E3134342D31332E35303420392E3231362D32302E39393220392E3231362D322E37353220302D392E362D312E3732382D32302E3335322D352E3234382D31302E3735322D332E3435362D32302E3232342D352E3138342D32382E34382D352E3138342D31312E32363420302D32302E343820322E3934342D32372E36343820382E3839362D372E31303420352E3838382D31322E3630382031342E3635362D31362E3531322032362E3330342D332E3936382031312E3634382D362E37322032352E3430382D382E3235362034312E343038433732362E353238203533392E32203732352E3736203535382E363536203732352E3736203538312E3832347A4D3838312E333434203630372E393336632D32362E34393620302D34382032312E3536382D343820343820302032362E3439362032312E3530342034382E3036342034382034382E3036347334382D32312E3536382034382D34382E303634433932392E333434203632392E353034203930372E393034203630372E393336203838312E333434203630372E3933367A2220702D69643D2231303932223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.TableToStreamJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.TableToStreamJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.table.api.Table\",\"parameterizedTypes\":null}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"TableToStreamJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"数据类型转换\",\"display\":\"Table转Map流_1.9\",\"description\":\"Table转Map流\",\"doc\":\"SqlJob.md\",\"icon\":\"TableToStreamJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[]}}', 'process', '', 0x232053514CE689A7E8A18C0A0AE4B88AE6B8B84461746153747265616DE695B0E68DAEE794A853747265616D546F5461626C654A6F62E8BDACE4B8BA7461626C65E5908EEFBC8CE5868DE689A7E8A18C53716C4A6F62EFBC9BE4B88BE6B8B8E58FAFE4BBA5E9809AE8BF875461626C65546F53747265616D4A6F62E5868DE8BDACE59B9E4461746153747265616DEFBC9B0A2D20666C696E6B2073716CE8AFADE6B395E8AFB7E58F82E88083EFBC9A2068747470733A2F2F63692E6170616368652E6F72672F70726F6A656374732F666C696E6B2F666C696E6B2D646F63732D72656C656173652D312E392F6465762F7461626C652F73716C2E68746D6C0A0A0A232320E6A0B7E4BE8BE8AFB4E6988E0A0A73716CE6938DE4BD9CE4B880E888ACE79A84E4B889E983A8E69BB2EFBC9A0A0A2D20E8BE93E585A5E695B0E68DAEE9809AE8BF8753747265616D546F5461626C654A6F62E68C896576656E74E6A8A1E5BC8FE8BDACE58C967461626C65EFBC8CE8BE93E587BA726F775F74696D65E5819AE4B8BA77617465726D61726BEFBC9B0A2D20E5868DE689A7E8A18C53716C4A6F62E8BF9BE8A18CE695B0E68DAEE5A484E79086EFBC9B0A2D20E9809AE8BF875461626C65546F53747265616D4A6F62E5868DE8BDACE59B9E4461746153747265616DEFBC8CE4B88BE6B8B8E58FAFE4BBA5E5819AE585B6E4BB96E79A844461746153747265616DE5A484E79086E6889673696E6BEFBC9B0A0A0AE8BE93E585A5E5A682E4B88BEFBC9A0A0A6060600A7B2250726F76696465724964223A22313030303032222C22436F6C537263466C6167223A2231222C224D73674964223A2261222C2274696D657374616D70223A313631303030303338333333392C22447467726D526C223A312C2252657475726E436F6465223A22227D0A7B2250726F76696465724964223A22313030303032222C22436F6C537263466C6167223A2231222C224D73674964223A2261222C2274696D657374616D70223A313631303030303338363333392C22447467726D526C223A342C2252657475726E436F6465223A2230303031227D0A6060600A0A53747265616D546F5461626C654A6F62E58F82E695B0E5A682E4B88BEFBC9A0A0A6060600A7B0A202022636F6C756D6E73223A205B0A202020207B0A20202020202022636F6C756D6E4E616D65223A202250726F76696465724964222C0A20202020202022636F6C756D6E54797065223A2022737472696E67220A202020207D2C0A202020207B0A20202020202022636F6C756D6E4E616D65223A2022436F6C537263466C6167222C0A20202020202022636F6C756D6E54797065223A2022737472696E67220A202020207D2C0A202020207B0A20202020202022636F6C756D6E4E616D65223A20224D73674964222C0A20202020202022636F6C756D6E54797065223A2022737472696E67220A202020207D2C0A202020207B0A20202020202022636F6C756D6E4E616D65223A202274696D657374616D70222C0A20202020202022636F6C756D6E54797065223A20226C6F6E67220A202020207D2C0A202020207B0A20202020202022636F6C756D6E4E616D65223A2022447467726D526C222C0A20202020202022636F6C756D6E54797065223A2022696E74220A202020207D2C0A202020207B0A20202020202022636F6C756D6E4E616D65223A202252657475726E436F6465222C0A20202020202022636F6C756D6E54797065223A2022737472696E67220A202020207D0A20205D2C0A2020226576656E7454696D65456E61626C6564223A20747275652C0A2020226576656E7454696D654F75747075744669656C64223A2022726F775F74696D65222C0A202022616C6C6F7765644C6174656E657373223A20302C0A20202274696D654669656C644E616D65223A202274696D657374616D70222C0A20202274696D65466F726D6174223A2022554E49585F4D53222C0A2020226576656E7454696D6546726F6D536F75726365223A2066616C73652C0A20202270726F6354696D65456E61626C6564223A2066616C73652C0A2020227461626C654E616D65223A20227265715F72657370222C0A20202277696E646F774F66667365744265694A696E67223A2066616C73650A7D0A6060600A0A53716C4A6F62E58F82E695B0E5A682E4B88BEFBC9A0A0A6060600A7B0A20202273716C223A202273656C656374202A202C20287265737054696D65202D2072657154696D6529206173204475726174696F6E2066726F6D202873656C6563742053455353494F4E5F535441525428726F775F74696D652C20696E74657276616C2027313027207365636F6E642920617320607472616E735F74696D65602C5C6E6D6178286074696D657374616D706029206173206074696D657374616D70602C5C6E6D61782850726F76696465724964292061732050726F766964657249642C5C6E6D617828436F6C537263466C61672920617320436F6C537263466C61672C5C6E4D736749642C5C6E6D61782843415345205748454E20447467726D526C203D2034207468656E2052657475726E436F646520656C736520272720656E64292061732052657475726E436F64652C5C6E6D61782843415345205748454E20447467726D526C203D2034207468656E206074696D657374616D706020656C7365203020656E6429206173207265737054696D652C5C6E6D61782843415345205748454E20447467726D526C203D2031207468656E206074696D657374616D706020656C7365203020656E64292061732072657154696D652C5C6E6D61782843415345205748454E2050726F76696465724964206E6F7420696E202827313030303032272C273130303030332729207468656E20276D617374657227205748454E2050726F76696465724964203D202731303030303227207468656E2027736C6176652720656C736520272720656E642920617320436F7265547970655C6E66726F6D207265715F7265737020776865726520436F6C537263466C6167203D27312720616E642050726F76696465724964206C696B6520273130303025275C6E67726F7570206279204D736749642C2053455353494F4E28726F775F74696D652C20696E74657276616C2027313027207365636F6E64295C6E29222C0A2020227461626C654E616D65223A20226F7574707574220A7D0A6060600A0A5461626C65546F53747265616D4A6F62E697A0E99C80E68C87E5AE9AE58F82E695B0EFBC9B0A0AE8BE93E587BAE8819AE59088E7BB93E69E9CE5A682E4B88BEFBC9A0A0A6060600A7B0A20202250726F76696465724964223A2022313030303032222C0A20202252657475726E436F6465223A202230303031222C0A202022436F6C537263466C6167223A202231222C0A2020227265737054696D65223A20313631303030303338363333392C0A2020227472616E735F74696D65223A20313630393937313538333333392C0A2020224475726174696F6E223A20333030302C0A20202272657154696D65223A20313631303030303338333333392C0A202022436F726554797065223A2022736C61766520222C0A2020224D73674964223A202261222C0A20202274696D657374616D70223A20313631303030303338363333390A7D0A6060600A0A, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313631303036393230323437302220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22323533332220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3132332E373531203430392E313437683235392E3937346331352E383520302032352E3336342D31322E3638322032352E3336342D32352E33363420302D31352E3835342D31322E3638322D32352E3336332D32352E3336342D32352E333633483138332E39396336302E3233362D3132332E363436203138332E3838322D3230392E323438203332362E3535312D3230392E323438203138302E3731332030203333322E383931203133362E333238203335382E323534203331302E3639396835332E383938433839372E333331203235362E393635203732322E3935382039382E343437203531302E3534312039382E343437632D3135352E333520302D3238382E3530362038352E3630322D3336312E343236203231322E343137563132332E38303963302D31322E3638312D392E3530392D32352E3336332D32352E3336342D32352E3336332D31322E36383120302D32352E3336332031322E3638322D32352E3336332032352E333633763235392E39373463302E3030312032352E3336342032352E3336332032352E3336342032352E3336332032352E3336346D3737362E373438203230362E303736682D3235392E3937632D31352E38353420302D32352E3336332031322E3638322D32352E3336332032352E33363420302031352E3834382031322E3638322032352E3336322032352E3336332032352E333632683139362E353633433738302E303235203738392E353932203635332E3231203837322E303236203531302E353431203837322E303236632D3138302E37313320302D3333322E3839312D3133362E3332382D3335382E3235342D3331302E37682D35302E373235433132362E393235203736372E343033203330312E323933203932352E3932203531302E353431203932352E3932633135352E33352030203239312E3637342D38352E353938203336312E3432372D3231322E343137763138372E30353463302031352E3835342031322E3638322032352E3336332032352E3336332032352E3336332031352E38353120302032352E3336332D31322E3638312032352E3336332D32352E333633563634302E35383863332E3136392D32352E3336352D32322E3139352D32352E3336352D32322E3139352D32352E3336356D3020307A222066696C6C3D22233039423642412220702D69643D2232353334223E3C2F706174683E3C2F7376673E, 'flink-job-1_9_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.TimestampConvertJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.TimestampConvertJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]},{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"TimestampConvertJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"数据类型转换\",\"display\":\"时间格式转换\",\"description\":\"按指定输入输出时间格式进行转换\",\"doc\":\"TimestampConvertJob.md\",\"icon\":\"TimestampConvertJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"timestampField\",\"label\":\"输入时间字段\",\"type\":[\"STRING\"],\"description\":\"输入时间字段\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"fromFormat\",\"label\":\"输入时间格式\",\"type\":[\"STRING\"],\"description\":\"支持UNIX_S, UNIX_MS以及通用时间表达格式\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"fromLocale\",\"label\":\"输入时间格式语言\",\"type\":[\"STRING\"],\"description\":\"支持用户设定时间方言,默认的时区为: en-US,可选的时区参见列表: https://www.andiamo.co.uk/resources/iso-language-codes\",\"optional\":true,\"defaultValue\":\"en-US\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"fromTimezone\",\"label\":\"输入时区\",\"type\":[\"STRING\"],\"description\":\"输入时间所在时区, 例如:`Europe/London`,`PST` or `GMT+5`\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"toTimezone\",\"label\":\"输出时区\",\"type\":[\"STRING\"],\"description\":\"输出时间所在时区, 例如:`Europe/London`,`PST` or `GMT+5`\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"outputTimestampField\",\"label\":\"输出时间字段\",\"type\":[\"STRING\"],\"description\":\"默认不填则同输入时间字段名\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"toFormat\",\"label\":\"输出时间格式\",\"type\":[\"STRING\"],\"description\":\"转化后输出的目标格式,支持UNIX_S, UNIX_MS以及通用时间表达格式\",\"optional\":true,\"defaultValue\":\"UNIX_MS\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"toLocale\",\"label\":\"输出时间格式语言\",\"type\":[\"STRING\"],\"description\":\"支持用户设定时间方言,默认的时区为: en-US,可选的时区参见列表: https://www.andiamo.co.uk/resources/iso-language-codes\",\"optional\":true,\"defaultValue\":\"en-US\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'process', '', 0x2320E697B6E997B4E6A0BCE5BC8FE8BDACE68DA20A0AE68C89E68C87E5AE9AE8BE93E585A5E8BE93E587BAE697B6E997B4E6A0BCE5BC8FE8BF9BE8A18CE8BDACE68DA22CE5B9B6E58FAFE8BE93E587BAE588B0E68C87E5AE9AE5AD97E6AEB50A2D20E8BE93E587BA736C6F742030EFBC8CE8BDACE68DA2E68890E58A9FE695B0E68DAE0A2D20E8BE93E587BA736C6F742031EFBC8CE8BDACE68DA2E5A4B1E8B4A5E695B0E68DAEEFBC88E99499E8AFAFE58E9FE59BA0E6B7BBE58AA0E59CA86572726F725F6D7367E5AD97E6AEB5EFBC890A0A0A2323E58F82E695B0E8AFB4E6988E0A0A7C206E616D65207C206C6162656C207C2074797065207C206F7074696F6E616C207C2064656661756C742076616C7565207C206465736372697074696F6E207C0A7C203A2D2D2D207C203A2D2D2D2D207C203A2D2D2D207C203A2D2D2D2D2D2D3A207C203A2D2D2D2D2D2D2D2D2D2D2D3A207C203A2D2D2D2D2D2D2D2D2D2D207C0A7C2074696D657374616D704669656C64207C20E8BE93E585A5E697B6E997B4E5AD97E6AEB5207C20737472696E67207C2066616C7365207C20207C20E8BE93E585A5E697B6E997B4E5AD97E6AEB5E5908D207C0A7C206F757470757454696D657374616D704669656C64207C20E8BE93E587BAE697B6E997B4E5AD97E6AEB5207C20737472696E67207C2074727565207C20E5908CE8BE93E585A5E697B6E997B4E5AD97E6AEB5207C20E8BE93E587BAE697B6E997B4E5AD97E6AEB5E5908D207C0A7C2066726F6D466F726D6174207C20E8BE93E585A5E697B6E997B4E6A0BCE5BC8F207C20737472696E67207C2066616C7365207C20207C20E694AFE68C81554E49585F532C20554E49585F4D53E4BBA5E58F8AE9809AE794A8E697B6E997B4E8A1A8E8BEBEE6A0BCE5BC8F207C0A7C2066726F6D4C6F63616C65207C20E8BE93E585A5E697B6E997B4E6A0BCE5BC8FE697B6E58CBA207C20737472696E67207C2074727565207C20656E2D5553207C20E694AFE68C81E794A8E688B7E8AEBEE5AE9AE697B6E997B4E697B6E58CBAEFBC8CE9BB98E8AEA4E79A84E697B6E58CBAE4B8BA3A20656E2D5553EFBC8CE58FAFE98089E79A84E697B6E58CBAE58F82E8A781E58897E8A1A83A2068747470733A2F2F7777772E616E6469616D6F2E636F2E756B2F7265736F75726365732F69736F2D6C616E67756167652D636F646573207C0A7C2074696D657374616D7054696D657A6F6E65207C20E697B6E58CBA207C20737472696E67207C2074727565207C20207C20E697B6E997B4E68980E59CA8E697B6E58CBA2C20E7A9BAE5AD97E7ACA6E4B8B2E8A1A8E7A4BAE4B88DE99C80E8A681E88083E89991E697B6E58CBA2C20604575726F70652F4C6F6E646F6E602C6050535460206F722060474D542B3560207C0A7C20746F466F726D6174207C20E8BE93E587BAE697B6E997B4E6A0BCE5BC8F207C20737472696E67207C2074727565207C20554E49585F4D53207C20E4B88EE697B6E997B4E5AD97E6AEB5E5AFB9E5BA94E79A84EFBC8CE59CA8E8BDACE58C96E68890E58A9FE5908EEFBC8CE5868DE6ACA1E8BDACE58C96E79A84E79BAEE6A087E6A0BCE5BC8FEFBC8CE694AFE68C81554E49585F532C20554E49585F4D53E4BBA5E58F8AE9809AE794A8E697B6E997B4E8A1A8E8BEBEE6A0BCE5BC8F207C0A7C20746F4C6F63616C65207C20E8BE93E587BAE697B6E997B4E6A0BCE5BC8FE697B6E58CBA207C20737472696E67207C2074727565207C20656E2D5553207C20E694AFE68C81E794A8E688B7E8AEBEE5AE9AE697B6E997B4E697B6E58CBAEFBC8CE9BB98E8AEA4E79A84E697B6E58CBAE4B8BA3A20656E2D5553EFBC8CE58FAFE98089E79A84E697B6E58CBAE58F82E8A781E58897E8A1A83A2068747470733A2F2F7777772E616E6469616D6F2E636F2E756B2F7265736F75726365732F69736F2D6C616E67756167652D636F646573207C0A0A0AE4BE8BE5A682E58F82E695B0E5A682E4B88BEFBC9A0A0A6060600A7B0A20202274696D657374616D704669656C6422203A202274696D65222C0A20202266726F6D466F726D617422203A2022797979792D4D4D2D646427542748483A6D6D3A73732E535353222C0A20202266726F6D4C6F63616C6522203A20227A682D434E222C0A20202274696D657374616D7054696D657A6F6E6522203A2022474D542B30313A3030222C0A202022746F466F726D617422203A2022797979792D4D4D2D646427542748483A6D6D3A73732E5353535A222C0A202022746F4C6F63616C6522203A2022656E2D5553220A7D0A6060600A0AE4BE8BE5A682E8BE93E585A5E79A84E6B688E681AFE5A682E4B88BEFBC9A0A0A6060600A7B2274696D65223A22323032302D31312D32325431323A30303A31302E303030227D0A7B2274696D65223A22323032302D31312D32322031323A30303A3130227D0A6060600A0AE8BE93E587BAE79A84E695B0E68DAEEFBC88736C6F742030EFBC89EFBC9A0A0A6060600A7B2274696D65223A22323032302D31312D32325430353A30303A31302E3030302B30313030227D0A6060600A0AE8BE93E587BAE79A84E99499E8AFAFE695B0E68DAEEFBC88736C6F742031EFBC89EFBC9A0A0A6060600A7B226572726F725F6D7367223A22496E76616C696420666F726D61743A205C22323032302D31312D32322031323A30303A31305C22206973206D616C666F726D6564206174205C222031323A30303A31305C22222C2274696D65223A22323032302D31312D32322031323A30303A3130227D0A606060, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313630373939373237353135372220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22313831342220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3735392E363635363931203531372E323733393836632D3131302E36333032343120302D3230302E3330353634362038392E3637353430362D3230302E333035363437203230302E3330353634372030203131302E3633303234312038392E363735343036203230302E333035363436203230302E333035363437203230302E333035363436733230302E3330353634362D38392E363735343036203230302E3330353634362D3230302E33303536343663302E3033353237382D3131302E3539343936332D38392E3637353430362D3230302E3330353634362D3230302E3330353634362D3230302E3330353634377A206D30203335312E3131363936632D38332E32393031373820302D3135302E3737363033362D36372E3532313133352D3135302E3737363033372D3135302E37373630333620302D38332E3239303137382036372E3532313133352D3135302E373736303336203135302E3737363033372D3135302E3737363033362038332E3239303137382030203135302E3737363033362036372E353231313335203135302E373736303336203135302E37373630333620302E3033353237382038332E3235343930312D36372E343835383538203135302E3737363033362D3135302E373736303336203135302E3737363033367A206D2D3232342E3939393839372D34362E3938393633632D32332E36373132303320352E3936313839382D34382E323539363220392E3438393634382D37332E36393436393820392E3438393634382D3137302E38383432313120302D3330392E39313238342D3134332E3035303236342D3330392E39313238342D3331382E393038363033733133392E3032383632392D3331382E393038363032203330392E39313238342D3331382E393038363032633135372E3032303135342030203238362E383431333535203132302E383935393933203330362E393134323532203237362E3932383337372033312E36343339313820312E3032333034382036312E38343134353820372E37363130352038392E3339333138362031392E3537393031332D31312E34323939312D3231332E3432383837372D3138342E3738333534362D3338332E3533363938332D3339362E3330373433382D3338332E3533363938332D3231382E38393638383920302D3339362E393432343333203138322E3130323435362D3339362E393432343333203430352E393338313935533234322E303734323037203931372E393230353537203436302E393335383138203931372E3932303535376334342E34383439323820302038372E3230353938312D372E3631393934203132372E3137353338392D32312E3438333939382D32322E3232343832352D32312E33303736312D34302E3339323733382D34362E3734323638382D35332E3434353431332D37352E3033353234337A206D2D37332E3732393937362D3538312E343739303337632D32342E30323339373820302D34332E3439373135382031392E34373331382D34332E3439373135372034332E343937313538763232382E353632393234633020332E35363330323820302E353634343420362E39383439343520312E3334303534352031302E32363537353320332E39353130382031392E3933313738382032312E3535343535332033342E39393532382034322E3635303439372033342E3939353238683130392E3231393134316333352E3036353833352D34312E3330393935332038332E3336303733332D37312E303438383836203133382E3339333633342D38322E3434333531382D352E37383535312D322E383232322D31322E3137303733382D342E3535303739382D31392E30343938352D342E353530373938483530342E343638323534563238332E34353437313563302D32342E3035393235352D31392E34373331382D34332E3533323433352D34332E3533323433362D34332E3533323433367A206D3239382E373239383733203335352E383434313435632D36372E313638333620302D3132312E3831333230382035342E3634343834382D3132312E383133323039203132312E3831333230397335342E363434383438203132312E383133323038203132312E383133323039203132312E383133323038203132312E3831333230382D35342E363434383438203132312E3831333230382D3132312E38313332303863302E3033353237382D36372E3133333038332D35342E3634343834382D3132312E3831333230382D3132312E3831333230382D3132312E3831333230397A206D30203230382E383432383032632D34372E3937373420302D38372E3032393539332D33392E3035323139332D38372E3032393539342D38372E3032393539337333392E3035323139332D38372E3032393539332038372E3032393539342D38372E3032393539332038372E3032393539332033392E3035323139332038372E3032393539332038372E3032393539332D33392E3035323139332038372E3032393539332D38372E3032393539332038372E3032393539337A222066696C6C3D22233333333333332220702D69643D2231383135223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.TranslateJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.TranslateJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]},{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"TranslateJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"字段处理\",\"display\":\"字段映射\",\"description\":\"对某个字段进行字典映射\",\"doc\":\"TranslateJob.md\",\"icon\":\"TranslateJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"sourceField\",\"label\":\"输入字段\",\"type\":[\"STRING\"],\"description\":\"需要进行字典替换的列\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"dictionary\",\"label\":\"字典\",\"type\":[\"MAP\"],\"description\":\"典替换所需要的字典,若被替换的值不在字典中,则保留原来的值\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"outputField\",\"label\":\"输出字段\",\"type\":[\"STRING\"],\"description\":\"转化结果输出到指定字段(默认为空)。不设置转化结果输出到原字段上(原字段被替换);否则转化结果输出指定的字段上(原字段保留)\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'process', '', 0x2320E5AD97E6AEB5E698A0E5B0840A0A60E5AD97E6AEB5E698A0E5B08460E7B1BBE4BCBCE4B880E7A78DE59FBAE4BA8EE5AD97E585B8E79A84E69BBFE68DA2EFBC8CE5B8B8E794A8E4BA8EE5AFB9E4B880E4BA9BE4B88DE58FAFE8AFBBEFBC8CE4BD86E58F96E580BCE69C89E99990E79A84E5AD97E6AEB5EFBC8CE59FBAE4BA8EE7BB99E5AE9AE79A84E5AD97E585B8E69BBFE68DA2E68890E58FAFE8AFBBE79A84E5AD97E6AEB5E38082E69BBFE68DA2E4B98BE5908EE79A84E580BCE59D87E4B8BAE5AD97E7ACA6E4B8B2E7B1BBE59E8B0A0A232320E7A4BAE4BE8B310AE4BE8BE5A682E5A682E4B88BEFBC8CE58E9FE5A78BE697A5E5BF97EFBC9A0A0A6060606A736F6E0A7B0A202022726573706F6E7365436F646522203A20223030303030220A7D0A6060600A0AE5B086636F6465E7BFBBE8AF91E4B8BAE58FAFE8AFBBE590ABE4B989EFBC8CE9858DE7BDAEE5A682E4B88BEFBC9A0A0A6060606A736F6E0A7B0A202022736F757263654669656C6422203A2022726573706F6E7365436F6465222C0A20202264696374696F6E61727922203A207B0A2020202022303030303022203A2022E68890E58A9F222C0A2020202022303030303122203A2022E5A4B1E8B4A5222C0A2020202022353535353522203A2022E5BC82E5B8B8220A20207D0A7D0A6060600A0AE7BB93E69E9CE5A682E4B88BEFBC9A0A0A6060606A736F6E0A7B0A202022726573706F6E7365436F646522203A2022E68890E58A9F220A7D0A6060600A0A232320E7A4BAE4BE8B320AE58E9FE5A78BE697A5E5BF97EFBC9A0A0A6060606A736F6E0A7B0A202022726573706F6E7365436F646522203A20223030303030220A7D0A6060600A0AE5B086E7BFBBE8AF91E7BB93E69E9CE7949FE68890E696B0E79A84E5AD97E6AEB50A0A6060606A736F6E0A7B0A202022736F757263654669656C6422203A2022726573706F6E7365436F6465222C0A2020226F75747075744669656C6422203A2022726573706F6E7365537461747573222C0A20202264696374696F6E61727922203A207B0A2020202022303030303022203A2022E68890E58A9F222C0A2020202022303030303122203A2022E5A4B1E8B4A5222C0A2020202022353535353522203A2022E5BC82E5B8B8220A20207D0A7D0A6060600A0AE7BB93E69E9CE5A682E4B88BEFBC9A0A0A6060606A736F6E0A7B0A202022726573706F6E7365436F646522203A20223030303030222C0A202022726573706F6E736553746174757322203A2022E68890E58A9F220A7D0A6060600A0A0A, 0x3C73766720743D22313630393330343535353634382220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D2233313634222077696474683D2232303022206865696768743D22323030223E3C7061746820643D224D3231332E333333333333203634307638352E33333333333363302034342E3937303636372034302E3533333333332038352E3333333333332038352E3333333333342038352E333333333334683132387638352E333333333333483239382E363636363637613137302E363636363637203137302E3636363636372030203020312D3137302E3636363636372D3137302E363636363637762D38352E3333333333336838352E3333333333337A206D3535342E3636363636372D3231332E3333333333336C3138372E373333333333203436392E333333333333682D39312E3934363636366C2D35312E3234323636372D313238682D3137342E3530363636376C2D35312E31353733333320313238682D39312E3930344C3638322E363636363637203432362E3636363636376838352E3333333333337A206D2D34322E363636363637203132332E3039333333334C3637322E313238203638322E363636363637683130362E3332353333334C3732352E333333333333203534392E37367A4D313238203132386832353661313238203132382030203020312039352E3336203231332E333333333333413132382031323820302030203120333834203535342E36363636363748313238563132387A206D32353620323536483231332E3333333333337638352E333333333333683137302E3636363636376134322E3636363636372034322E36363636363720302030203020302D38352E3333333333337A206D3334312E3333333333332D323536613137302E363636363637203137302E363636363637203020302031203137302E363636363637203137302E3636363636377638352E333333333333682D38352E333333333333563239382E3636363636376138352E3333333333332038352E3333333333332030203020302D38352E3333333333342D38352E333333333334682D31323856313238683132387A4D333834203231332E333333333333483231332E3333333333337638352E333333333334683137302E3636363636376134322E3636363636372034322E36363636363720302031203020302D38352E3333333333347A2220702D69643D2233313635223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.TypeConvertJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.TypeConvertJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]},{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"TypeConvertJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"数据类型转换\",\"display\":\"类型转换\",\"description\":\"对指定的字段进行类型转换\",\"doc\":\"TypeConvertJob.md\",\"icon\":\"TypeConvertJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"fields\",\"label\":\"转换字段\",\"type\":[\"LIST\"],\"description\":\"转换字段列表\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":{\"apiVersion\":0,\"name\":null,\"label\":null,\"type\":[\"OBJECT\"],\"description\":null,\"optional\":false,\"defaultValue\":null,\"placeholder\":null,\"candidates\":null,\"inputType\":null,\"range\":null,\"regex\":null,\"order\":0,\"requireCondition\":null,\"availableCondition\":null,\"listParameter\":null,\"objectParameters\":[{\"apiVersion\":2,\"name\":\"field\",\"label\":\"转换字段\",\"type\":[\"STRING\"],\"description\":\"需要转换的字段名\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"type\",\"label\":\"目标类型\",\"type\":[\"STRING\"],\"description\":\"将转换字段的值转化成该类型\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[\"boolean\",\"double\",\"float\",\"long\",\"integer\",\"string\"],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"roundingScale\",\"label\":\"浮点数小数位保留位数\",\"type\":[\"INT\"],\"description\":\"用于截断浮点数小数位长度\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"roundingMode\",\"label\":\"进位模式\",\"type\":[\"STRING\"],\"description\":\"截断浮点数小数位时使用的进位模式\",\"optional\":true,\"defaultValue\":\"HALF_UP\",\"placeholder\":\"\",\"candidates\":[\"UP\",\"DOWN\",\"HALF_UP\",\"HALF_DOWN\",\"CEILING\",\"FLOOR\"],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"output\",\"label\":\"输出字段\",\"type\":[\"STRING\"],\"description\":\"转化结果输出到指定字段(默认为空)。不设置转化结果输出到原字段上(原字段被替换);否则转化结果输出指定的字段上(原字段保留)\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]},\"objectParameters\":null}]}}', 'process', '', 0x2320E7B1BBE59E8BE8BDACE68DA20A0AE5AFB9E68C87E5AE9AE79A84E5AD97E6AEB5E8BF9BE8A18CE7B1BBE59E8BE8BDACE68DA20A2D20E8BE93E587BA736C6F742030EFBC8CE8BDACE68DA2E68890E58A9FE695B0E68DAE0A2D20E8BE93E587BA736C6F742031EFBC8CE8BDACE68DA2E5A4B1E8B4A5E695B0E68DAE0A0A232320E789B9E588ABE58F82E695B0E8AFB4E6988E0A0A2D20726F756E64696E675363616C653A20E6B5AEE782B9E695B0E5B08FE695B0E4BD8DE4BF9DE79599E4BD8DE695B0EFBC8CE794A8E4BA8EE688AAE696ADE6B5AEE782B9E695B0E5B08FE695B0E4BD8DE995BFE5BAA60A2D20726F756E64696E674D6F64653A20E8BF9BE4BD8DE6A8A1E5BC8FEFBC8CE688AAE696ADE6B5AEE782B9E695B0E5B08FE695B0E4BD8DE697B6E4BDBFE794A8E79A84E8BF9BE4BD8DE6A8A1E5BC8F0A0AE8BF9BE4BD8DE6A8A1E5BC8FE8AFB4E6988E3A0A0A7C20E58E9FE580BC207C205550207C20444F574E207C2048414C465F5550207C2048414C465F444F574E207C204345494C494E47207C20464C4F4F52207C0A7C203A2D2D2D207C203A2D2D2D207C203A2D2D2D207C203A2D2D2D207C203A2D2D2D207C203A2D2D2D207C203A2D2D2D207C0A7C20352E3520207C203620207C203520207C203620207C203520207C203620207C203520207C0A7C20322E3520207C203320207C203220207C203320207C203220207C203320207C203220207C0A7C20312E3620207C203220207C203120207C203220207C203220207C203220207C203120207C0A7C20312E3120207C203220207C203120207C203120207C203120207C203220207C203120207C0A7C20312E3020207C203120207C203120207C203120207C203120207C203120207C203120207C0A7C202D312E30207C202D31207C202D31207C202D31207C202D31207C202D31207C202D31207C0A7C202D312E31207C202D32207C202D31207C202D31207C202D31207C202D31207C202D32207C0A7C202D312E36207C202D32207C202D31207C202D32207C202D32207C202D31207C202D32207C0A7C202D322E35207C202D33207C202D32207C202D33207C202D32207C202D32207C202D33207C0A7C202D352E35207C202D36207C202D35207C202D36207C202D35207C202D35207C202D36207C0A0A0A0A232320E7A4BAE4BE8BE4B880EFBC9A0A0AE58F82E695B0E5A682E4B88BEFBC9A0A0A6060600A7B0A2020226669656C6473223A205B7B0A20202020226669656C6422203A202276616C7565222C0A20202020227479706522203A2022646F75626C65220A20207D5D0A7D0A6060600A0AE4BE8BE5A682E8BE93E585A5E79A84E6B688E681AFE5A682E4B88BEFBC9A0A0A6060600A7B2274696D65223A22323032302D31312D32325431323A30303A31302E3030305A222C2276616C7565223A22312E31227D0A7B2274696D65223A22323032302D31312D32325431323A30303A31352E3030305A222C2276616C7565223A22312E32227D0A7B2274696D65223A22323032302D31312D32325431323A30303A32302E3030305A222C2276616C7565223A22616263227D0A6060600A0AE8BE93E587BAE79A84E695B0E68DAEEFBC88736C6F742030EFBC89EFBC9A0A0A6060600A7B2274696D65223A22323032302D31312D32325431323A30303A31302E3030305A222C2276616C7565223A312E317D0A7B2274696D65223A22323032302D31312D32325431323A30303A31352E3030305A222C2276616C7565223A312E327D0A6060600A0AE8BE93E587BAE79A84E99499E8AFAFE695B0E68DAEEFBC88736C6F742031EFBC89EFBC9A0A0A6060600A7B2274696D65223A22323032302D31312D32325431323A30303A32302E3030305A222C2276616C7565223A22616263227D0A6060600A0A232320E7A4BAE4BE8BE4BA8CEFBC9A0A0AE68C87E5AE9AE8BE93E587BAE5AD97E6AEB5EFBC8CE58F82E695B0E5A682E4B88BEFBC9A0A0A6060600A7B0A2020226669656C6473223A205B7B0A20202020226669656C6422203A202276616C7565222C0A20202020227479706522203A2022646F75626C65222C0A20202020226F7570757422203A20226E657756616C7565220A20207D5D0A7D0A6060600A0AE4BE8BE5A682E8BE93E585A5E79A84E6B688E681AFE5A682E4B88BEFBC9A0A0A6060600A7B2274696D65223A22323032302D31312D32325431323A30303A31302E3030305A222C2276616C7565223A22312E31227D0A7B2274696D65223A22323032302D31312D32325431323A30303A31352E3030305A222C2276616C7565223A22312E32227D0A7B2274696D65223A22323032302D31312D32325431323A30303A32302E3030305A222C2276616C7565223A22616263227D0A6060600A0AE8BE93E587BAE79A84E695B0E68DAEEFBC88736C6F742030EFBC89EFBC9A0A0A6060600A7B2274696D65223A22323032302D31312D32325431323A30303A31302E3030305A222C2276616C7565223A22312E31222C226E657756616C7565223A312E317D0A7B2274696D65223A22323032302D31312D32325431323A30303A31352E3030305A222C2276616C7565223A22312E32222C226E657756616C7565223A312E327D0A6060600A0AE8BE93E587BAE79A84E99499E8AFAFE695B0E68DAEEFBC88736C6F742031EFBC89EFBC9A0A0A6060600A7B2274696D65223A22323032302D31312D32325431323A30303A32302E3030305A222C2276616C7565223A22616263227D0A606060, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313630393134303434383233352220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22363338322220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D353132203936633232392E3736203020343136203138362E32342034313620343136732D3138362E3234203431362D34313620343136533936203734312E373620393620353132203238322E3234203936203531322039367A206D302036346133353220333532203020312030203020373034203335322033353220302030203020302D3730347A206D3232392E333736203339312E313638763634682D3334392E34346C33302E37322033302E37322D34352E3232363636372034352E3232363636372D38352E3333333333332D38352E3333333333346133322033322030203020312032322E3631333333332D35342E363133333333683432362E3636363636377A206D2D39342E3736323636372D3231382E3332353333336C38352E3333333333342038352E3333333333336133322033322030203020312D32322E3631333333342035342E363133333333682D3432362E363636363636762D3634683334392E3339373333336C2D33302E37322D33302E37322034352E3232363636372D34352E3232363636367A2220702D69643D2236333833223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.UAParseJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.UAParseJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]},{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"UAParseJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"文本解析\",\"display\":\"User-Agent解析\",\"description\":\"对某个字段进行UserAgent解析\",\"doc\":\"UAParseJob.md\",\"icon\":\"UAParseJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"sourceField\",\"label\":\"输入字段\",\"type\":[\"STRING\"],\"description\":\"需要解析的UserAgent字段名\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"outputField\",\"label\":\"输出字段\",\"type\":[\"STRING\"],\"description\":\"解析结果输出到指定字段下,如果设置了输出字段名,解析结果将作为这个字段的子对象存在。如果不设置,解析结果将放置在最外层\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'process', '', 0x2320557365722D4167656E74E8A7A3E69E900A0A5541E698AFE68C87E8A7A3E69E90776562E8AFB7E6B182E697A5E5BF97E9878CE99DA2E79A84557365722D4167656E74E983A8E58886E380820AE6ADA3E7A1AEE7BB93E69E9CE8BE93E587BAE588B0736C6F742030EFBC8CE5A4B1E8B4A5E8BE93E587BAE588B0736C6F742031E380820A0AE4BE8BE5A682E5A682E4B88BEFBC8CE58E9FE5A78BE697A5E5BF97EFBC9A0A0A6060606A736F6E0A7B0A2020226D65737361676522203A20224D6F7A696C6C612F352E3020284D6163696E746F73683B20496E74656C204D6163204F5320582031305F31325F3129204170706C655765624B69742F3533372E333620284B48544D4C2C206C696B65204765636B6F29204368726F6D652F35352E302E323838332E3935205361666172692F3533372E3336220A7D0A6060600A0A232320E7A4BAE4BE8B310A0AE8A7A3E69E906D657373616765E5AD97E6AEB5E79A84557365722D4167656E74E4BFA1E681AFEFBC8CE9858DE7BDAEE5A682E4B88BEFBC9A0A0A6060606A736F6E0A7B0A202022736F757263654669656C6422203A20226D657373616765220A7D0A6060600A0AE8BE93E587BAEFBC9A0A0A6060606A736F6E0A7B0A20202275615F66616D696C7922203A20224368726F6D65222C0A20202275615F6F735F66616D696C7922203A20224D6163204F532058222C0A20202275615F6465766963655F66616D696C7922203A20224F74686572222C0A20202275615F6D616A6F7222203A20223535222C0A20202275615F6D696E6F7222203A202230222C0A20202275615F6F735F6D616A6F7222203A20223130222C0A20202275615F6F735F6D696E6F7222203A20223132222C0A2020226D65737361676522203A20224D6F7A696C6C612F352E3020284D6163696E746F73683B20496E74656C204D6163204F5320582031305F31325F3129204170706C655765624B69742F3533372E333620284B48544D4C2C206C696B65204765636B6F29204368726F6D652F35352E302E323838332E3935205361666172692F3533372E3336220A7D0A6060600A0A232320E7A4BAE4BE8B320A0AE8A7A3E69E906D657373616765E5AD97E6AEB5E79A84557365722D4167656E74E4BFA1E681AFEFBC8CE5B086E7BB93E69E9CE8BE93E587BAE588B06F7574E5AD97E6AEB5E4B88A0A0A6060606A736F6E0A7B0A202022736F757263654669656C6422203A20226D657373616765222C0A2020226F75747075744669656C6422203A20226F7574220A7D0A6060600A0AE8BE93E587BAEFBC9A0A0A6060606A736F6E0A7B0A2020226F7574223A207B0A202020202275615F66616D696C7922203A20224368726F6D65222C0A202020202275615F6F735F66616D696C7922203A20224D6163204F532058222C0A202020202275615F6465766963655F66616D696C7922203A20224F74686572222C0A202020202275615F6D616A6F7222203A20223535222C0A202020202275615F6D696E6F7222203A202230222C0A202020202275615F6F735F6D616A6F7222203A20223130222C0A202020202275615F6F735F6D696E6F7222203A20223132220A20207D2C0A2020226D65737361676522203A20224D6F7A696C6C612F352E3020284D6163696E746F73683B20496E74656C204D6163204F5320582031305F31325F3129204170706C655765624B69742F3533372E333620284B48544D4C2C206C696B65204765636B6F29204368726F6D652F35352E302E323838332E3935205361666172692F3533372E3336220A7D0A606060, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313631303039363330393436382220636C6173733D2269636F6E222076696577426F783D2230203020313638322031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D2231343333332220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2233353022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3735312E393038353731203130312E323239373134763531342E3932353731356330203233322E3838363835372D3132312E373039373134203334392E3931353432392D3336332E393538383537203334392E3931353432382D3234312E30373838353720302D3336312E3631383238362D3131372E3032383537312D3336312E3631383238352D3334392E393135343238762D3531342E39323537313563302D33392E3738393731342032312E3036353134332D36302E3835343835372036342E3336353731342D36302E3835343835372034342E34373038353720302036362E3730363238362032312E3036353134332036362E3730363238362036302E383534383537563631312E3437343238366330203136312E3439393432392037372E323338383537203234332E343139343239203233302E353436323835203234332E343139343238203135352E3634382030203233322E3838363835372D38312E3932203233322E3838363835372D3234332E343139343238563130312E32323937313463302D33392E3738393731342032312E3036353134332D36302E3835343835372036342E3336353731352D36302E3835343835372034342E34373038353720302036362E3730363238362032312E3036353134332036362E3730363238352036302E3835343835377A206D3634332E303732203537382E313231313433682D3336322E3738383537314C3933362E323238353731203932322E373730323836632D31302E3533323537312032352E3734363238362D33302E3432373432392033372E3434393134332D35352E3030333432382033372E3434393134332D33332E39333832383620302D36392E3034363835372D31392E3839343835372D36392E3034363835372D35352E30303334323920302D392E33363232383620322E3334303537312D31382E37323435373120372E3032313731342D33302E3432373432396C3331372E3134373432392D3737312E3231383238356331372E3535343238362D34322E3133303238362034302E39362D36332E3139353432392037392E3537393432382D36332E3139353432392034322E31333032383620302036362E3730363238362032312E3036353134332038342E3236303537322036332E3139353432396C3331302E313235373134203737302E30343863342E36383131343320392E33363232383620352E3835313432392031372E35353432383620352E3835313432382032352E37343632383520302033322E3736382D32382E3038363835372035392E3638343537312D37302E3231373134322035392E3638343537322D32352E37343632383620302D34362E3831313432392D31302E3533323537312D35372E3334342D33372E3434393134336C2D39332E3632323835382D3234322E3234393134337A206D2D3332322E3939383835372D3130352E333235373134683238352E3534393731356C2D37332E3732382D3139332E30393731343361323238362E30303638353720323238362E3030363835372030203020312D36372E3837363537322D3230322E343539343239632D31382E3732343537312036302E3835343835372D34302E3936203133312E3037322D36392E303436383537203230322E3435393432396C2D37342E383938323836203139332E3039373134337A2220702D69643D223134333334223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.UnionJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.UnionJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]},{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]},{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]},{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"UnionJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"数据流变换\",\"display\":\"数据流合并Job\",\"description\":\"数据流合并Job, 最多支持4个数据流同时合并\",\"doc\":\"UnionJob.md\",\"icon\":\"UnionJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[]}}', 'process', '', 0x2320E695B0E68DAEE6B581E59088E5B9B60A0AE695B0E68DAEE6B581E59088E5B9B64A6F622C20E69C80E5A49AE694AFE68C8134E4B8AAE695B0E68DAEE6B581E5908CE697B6E59088E5B9B60A0A2D20E59CA8706970656C696E65E7BC96E68E92E697B6EFBC8CE58FAFE4BBA5E68A8A32EFBC8C33EFBC8C34E4B8AAE695B0E68DAEE6B581E59088E5B9B6EFBC8CE8BE93E587BAE4B880E4B8AAE695B0E68DAEE59088E5B9B6E5908EE79A84E695B0E68DAEE6B5810A0AE4BE8BE5A6820A0AE69C89E4BBA5E4B88B33E4B8AA536F757263654D617046756E6374696F6E4A6F62E99C80E8A681E59088E5B9B6E695B0E68DAEE6B581EFBC9A0A0A6060600A5B207B0A2020226A6F624E616D6522203A2022636F6D2E656F692E6A61782E666C696E6B2E6A6F622E746573742E7574696C2E536F757263654D617046756E6374696F6E4A6F62222C0A2020226A6F62436F6E66696722203A207B207D2C0A2020226A6F62496422203A202231220A7D2C207B0A2020226A6F624E616D6522203A2022636F6D2E656F692E6A61782E666C696E6B2E6A6F622E70726F636573732E556E696F6E4A6F62222C0A2020226A6F62436F6E66696722203A207B207D2C0A2020226A6F62496422203A202234220A7D2C207B0A2020226A6F624E616D6522203A2022636F6D2E656F692E6A61782E666C696E6B2E6A6F622E746573742E7574696C2E536F757263654D617046756E6374696F6E4A6F62222C0A2020226A6F62436F6E66696722203A207B207D2C0A2020226A6F62496422203A202232220A7D2C207B0A2020226A6F624E616D6522203A2022636F6D2E656F692E6A61782E666C696E6B2E6A6F622E746573742E7574696C2E536F757263654D617046756E6374696F6E4A6F62222C0A2020226A6F62436F6E66696722203A207B207D2C0A2020226A6F62496422203A202233220A7D2C207B0A2020226A6F624E616D6522203A2022636F6D2E656F692E6A61782E666C696E6B2E6A6F622E746573742E7574696C2E4A6F624964436F6C6C6563746F7253696E6B4A6F62222C0A2020226A6F62436F6E66696722203A207B207D2C0A2020226A6F62496422203A202235220A7D205D0A6060600A0AE7BC96E68E92E79A84E697B6E58099E58FAFE4BBA5E59088E5B9B6E588B0E4B880E4B8AA6A6F62E4B88AEFBC8CE4B88DE5908CE79A84E695B0E68DAEE6B581E6B187E8819AE588B0556E696F6E4A6F62E79A84E4B88DE5908CE79A84736C6F74E4B88AEFBC8CE5868DE8BE93E587BAE588B0E4B88BE6B8B8EFBC9A0A0A2D20E585B6E4B8AD20736C6F74203020E5BF85E5A1ABEFBC8C736C6F742031EFBC8C32EFBC8C33E4B8BAE98089E5A1AB0A0A6060600A5B207B0A20202266726F6D536C6F7422203A20302C0A20202266726F6D22203A202231222C0A202022746F22203A202234222C0A202022746F536C6F7422203A20300A7D2C207B0A20202266726F6D536C6F7422203A20302C0A20202266726F6D22203A202232222C0A202022746F22203A202234222C0A202022746F536C6F7422203A20310A7D2C207B0A20202266726F6D536C6F7422203A20302C0A20202266726F6D22203A202233222C0A202022746F22203A202234222C0A202022746F536C6F7422203A20320A7D2C207B0A20202266726F6D536C6F7422203A20302C0A20202266726F6D22203A202234222C0A202022746F22203A202235222C0A202022746F536C6F7422203A20300A7D205D0A606060, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313631303037363131373931342220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22333831302220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3735342E3936203330302E3834386C2D35362E3537362035362E35364C3830342E39373620343634483533352E353638632D32332E3935322D34382D37382E3831362D3134322E3131322D39382E38382D3137372E3932433339352E373932203231332E303536203333362E34333220313736203236302E32383820313736483438763830683231322E3237326334362E39343420302037392E3832342032312E3336203130362E3632342036392E3231362032302E3235362033362E3134342037352E3932203133362E3532382039392E3336203137382E3834386138323234392E3430382038323234392E3430382030203020312D39392E3336203137382E373834433334302E303936203733302E363838203330372E32313620373532203236302E32373220373532483438763830683231322E3237326337362E3134342030203133352E3530342D33372E303234203137362E3433322D3131302E3038433435362E373532203638362E303936203531312E36313620353932203533352E35363820353434683237302E3338346C2D3130372E353638203130372E3536382035362E3537362035362E35364C3935382E363038203530342E3438203735342E3936203330302E3834387A222066696C6C3D22233536354436342220702D69643D2233383131223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.UnPivotJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.UnPivotJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]},{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"UnPivotJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"数据流变换\",\"display\":\"列转行\",\"description\":\"根据指定字段分拆成多行\",\"doc\":\"UnPivotJob.md\",\"icon\":\"UnPivotJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"sourceField\",\"label\":\"输入字段\",\"type\":[\"STRING\"],\"description\":\"需要被拆分的列。如果源数据没有该列,那么目标列也不会生成\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"targetField\",\"label\":\"输出字段\",\"type\":[\"STRING\"],\"description\":\"拆分后的列\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"delimiter\",\"label\":\"分割符\",\"type\":[\"STRING\"],\"description\":\"拆分列的分隔符,分隔符可以是一个正则表达式\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'process', '', 0x2320E58897E8BDACE8A18C0A0AE5AFB9E68C87E5AE9AE79A84E5AD97E6AEB5E8BF9BE8A18CE58897E8BDACE8A18C0A2D20E8BE93E587BA736C6F742030EFBC8CE8BDACE68DA2E68890E58A9FE695B0E68DAE0A2D20E8BE93E587BA736C6F742031EFBC8CE8BDACE68DA2E5A4B1E8B4A5E695B0E68DAE0A0A232320E7A4BAE4BE8BEFBC9A0A0AE58F82E695B0E5A682E4B88BEFBC9A0A0A6060600A7B0A202022736F757263654669656C6422203A20226E616D6573222C0A2020227461726765744669656C6422203A20226E616D65222C0A20202264656C696D6974657222203A20222C220A7D0A6060600A0AE4BE8BE5A682E8BE93E585A5E79A84E6B688E681AFE5A682E4B88BEFBC9A0A0A6060600A7B0A202022636F756E74727922203A2022E7BE8EE59BBD222C0A2020226E616D657322203A20226D696B652C6D6172792C746F6D2C6A65727279222C0A20202269737022203A2022E58AA0E5B79EE5A4A7E5ADA6220A7D0A7B0A202022636F756E74727922203A2022E4B8ADE59BBD222C0A2020226E616D657322203A205B20224A61736F6E222C20224A61636B22205D2C0A20202269737022203A2022E88194E9809A220A7D0A7B0A202022636F756E74727922203A2022E7BE8EE59BBD222C0A20202269737022203A2022E58AA0E5B79EE5A4A7E5ADA6220A7D0A7B0A202022636F756E74727922203A2022E7BE8EE59BBD222C0A2020226E616D657322203A206E756C6C2C0A20202269737022203A2022E58AA0E5B79EE5A4A7E5ADA6220A7D0A7B0A202022636F756E74727922203A2022E7BE8EE59BBD222C0A2020226E616D657322203A2022222C0A20202269737022203A2022E58AA0E5B79EE5A4A7E5ADA6220A7D0A7B0A202022636F756E74727922203A2022E7BE8EE59BBD222C0A2020226E616D657322203A205B205D2C0A20202269737022203A2022E58AA0E5B79EE5A4A7E5ADA6220A7D200A6060600A0AE8BE93E587BAE79A84E695B0E68DAEEFBC88736C6F742030EFBC89EFBC9A0A0A6060600A7B22636F756E747279223A22E7BE8EE59BBD222C226E616D6573223A226D696B652C6D6172792C746F6D2C6A65727279222C22697370223A22E58AA0E5B79EE5A4A7E5ADA6222C226E616D65223A226D696B65227D0A7B22636F756E747279223A22E7BE8EE59BBD222C226E616D6573223A226D696B652C6D6172792C746F6D2C6A65727279222C22697370223A22E58AA0E5B79EE5A4A7E5ADA6222C226E616D65223A226D617279227D0A7B22636F756E747279223A22E7BE8EE59BBD222C226E616D6573223A226D696B652C6D6172792C746F6D2C6A65727279222C22697370223A22E58AA0E5B79EE5A4A7E5ADA6222C226E616D65223A22746F6D227D0A7B22636F756E747279223A22E7BE8EE59BBD222C226E616D6573223A226D696B652C6D6172792C746F6D2C6A65727279222C22697370223A22E58AA0E5B79EE5A4A7E5ADA6222C226E616D65223A226A65727279227D0A7B22636F756E747279223A22E4B8ADE59BBD222C226E616D6573223A5B224A61736F6E222C224A61636B225D2C22697370223A22E88194E9809A222C226E616D65223A224A61736F6E227D0A7B22636F756E747279223A22E4B8ADE59BBD222C226E616D6573223A5B224A61736F6E222C224A61636B225D2C22697370223A22E88194E9809A222C226E616D65223A224A61636B227D0A6060600A0AE8BE93E587BAE79A84E99499E8AFAFE695B0E68DAEEFBC88736C6F742031EFBC89EFBC9A0A0A6060600A7B22636F756E747279223A22E7BE8EE59BBD222C22697370223A22E58AA0E5B79EE5A4A7E5ADA6227D0A7B22636F756E747279223A22E7BE8EE59BBD222C226E616D6573223A6E756C6C2C22697370223A22E58AA0E5B79EE5A4A7E5ADA6227D0A7B22636F756E747279223A22E7BE8EE59BBD222C226E616D6573223A22222C22697370223A22E58AA0E5B79EE5A4A7E5ADA6227D0A7B22636F756E747279223A22E7BE8EE59BBD222C226E616D6573223A5B5D2C22697370223A22E58AA0E5B79EE5A4A7E5ADA6227D0A6060600A, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313631303038353232373630352220636C6173733D2269636F6E222076696577426F783D2230203020313231392031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D223531342220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D223233382E3038353933373522206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3330302E3933303233333935203531322E3035323930363538762D302E303532393036353863302D302E36303834323238362D302E33313734333738372D312E31313130333235322D302E33343338393037342D312E37313934353533386132362E35333235313936362032362E35333235313936362030203020302D312E363636353438382D382E33333237343536342032362E32343135333436372032362E32343135333436372030203020302D342E313533313436382D362E3239353835323338632D302E35353535313632362D302E373134323335322D302E38323030343833372D312E35383731383933332D312E34383133373639382D322E32343835313739356C2D37382E383033393634332D37392E36323430313236376132362E34353331363031392032362E34353331363031392030203120302D33372E36313633393337332033372E32343630343932386C33342E32303339333538352033342E3537343238313134483131362E38363931343531376132362E34353331363031392032362E343533313630313920302030203020302035322E39303633323033376839332E34353930313532316C2D33332E32373830373539372033332E30333939393637336132362E34373936313330362032362E34373936313330362030203020302033372E32373235303239392033372E35363334383739386C37382E383033393634332D37382E323734393031373320302E303236343533372D302E30353239303537366132362E35353839373235332032362E353538393732353320302030203020372E37373732323835362D31382E37323838333734317A4D3838342E3033373234353935203531322E3035323930363538762D302E303532393036353863302D302E363038343232383620302E33313734333738372D312E313131303332353220302E33343338393135362D312E373139343535333820302E31383531373138322D322E383330343837393120302E35383139363931352D352E363630393736363620312E363636353438382D382E333332373435363420302E39373837363733312D322E333534333331313320322E35363539353636332D342E3333383331383620342E31323636393330392D362E323935383532333820302E35353535313632362D302E3731343233353220302E38323030343833372D312E353837313839333320312E35303738323938362D322E32343835313739356C37382E383033393634332D37392E36323430313236376132362E35303630363637372032362E35303630363637372030203020312033372E36313633393435362033372E32343630343932386C2D33342E32303339333636392033342E35373432383131346839342E32323631353639396132362E34353331363031392032362E343533313630313920302030203120302035322E3930363332303337682D39332E34333235363233326C33332E32373830373539372033332E30333939393637336132362E34353331363031392032362E34353331363031392030203020312D33372E32393839353538382033372E35363334383739386C2D37382E38303339363432392D37382E32373439303137332D302E30323634353337312D302E30353239303537366132362E3633383333322032362E3633383333322030203020312D372E38303336383232342D31382E37323838333734317A222066696C6C3D22233737373737382220702D69643D22353135223E3C2F706174683E3C7061746820643D224D3432312E3231323735333738203132382E3136343634343737683334352E3030323131363631763736332E3833353030323334483432312E32313237353337387A222066696C6C3D22234546454545452220702D69643D22353136223E3C2F706174683E3C7061746820643D224D3734382E32303032363831382039302E313235682D3330382E393732393132326135362E35303339353030372035362E35303339353030372030203020302D35362E343531303434332035362E3435313034343332763733302E383437393131333663302033312E31333533363935342032352E33313536373437382035362E34353130343433322035362E343531303434332035362E3435313034343332683330382E393732393132326135362E35303339353030372035362E35303339353030372030203020302035362E343531303433352D35362E3435313034343332563134362E35373630343433324135362E35303339353030372035362E3530333935303037203020302030203734382E32303032363831382039302E3132357A206D2D3330382E393732393132322035322E3930363332303337683330382E3937323931323263312E3935373533333739203020332E353434373233313120312E353837313839333320332E353434373233313320332E3534343732333935763230362E3434303436323435483433352E3638323633323837563134362E353736303434333263302D312E393537353333373920312E35383731383933332D332E353434373233313120332E35343437323331312D332E35343437323339357A206D3331322E3531373633353332203236322E3839313530363737763231302E3531343234393739483433352E3638323633323837762D3231302E3531343234393738683331362E30363233353834347A206D2D332E3534343732333132203437352E3034353835323439682D3330382E3937323931323261332E353434373233313120332E35343437323331312030203020312D332E35343437323331312D332E3534343732333935762D3230382E3038303535383337683331362E3036323335383434763230382E3038303535383337633020312E39353735333337392D312E353837313839333320332E35343437323331312D332E353434373233313320332E35343437323339357A222066696C6C3D22233737373737382220702D69643D22353137223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.WatermarkJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.WatermarkJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"WatermarkJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"窗口操作\",\"display\":\"时间水位线设置\",\"description\":\"在EventTime时间模式下设置watermark,为窗口聚合做准备\",\"doc\":\"WatermarkJob.md\",\"icon\":\"WatermarkJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"watermarkSource\",\"label\":\"获取时间来源\",\"type\":[\"STRING\"],\"description\":\"来源包括:数据内时间字段(time_field)或系统时间(sys_time)\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[\"time_field\",\"sys_time\"],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"timeFieldName\",\"label\":\"时间字段\",\"type\":[\"STRING\"],\"description\":\"通过时间字段设置水位线;watermarkSource为time_field时必填\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"timeFormat\",\"label\":\"时间格式\",\"type\":[\"STRING\"],\"description\":\"支持UNIX_S, UNIX_MS以及通用时间表达格式;watermarkSource为time_field时必填\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"timeLocale\",\"label\":\"输入时间格式方言\",\"type\":[\"STRING\"],\"description\":\"支持用户设定时间方言,默认的时区为: en-US,可选的时区参见列表: https://www.andiamo.co.uk/resources/iso-language-codes\",\"optional\":true,\"defaultValue\":\"en-US\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"lagBehindTime\",\"label\":\"最大可容忍乱序时间(秒)\",\"type\":[\"LONG\"],\"description\":\"生成的watermark等于当前数据时间减去此配置时间,也就是聚合窗口延迟关闭,可容忍数据晚到时间范围\",\"optional\":true,\"defaultValue\":\"0\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"maxGapTime\",\"label\":\"最大可跳跃时间(秒)\",\"type\":[\"LONG\"],\"description\":\"数据时间可超过当前watermark的最大时间,如果超过则不设置watermark,0表示不限制\",\"optional\":true,\"defaultValue\":\"0\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"maxDeviateTime\",\"label\":\"最大可偏离时间(秒)\",\"type\":[\"LONG\"],\"description\":\"数据时间可偏离当前系统时间的最大值,如果超过则不设置watermark,0表示不限制\",\"optional\":true,\"defaultValue\":\"0\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'process', '', 0x2320E8AEBEE7BDAE77617465726D61726B0A0AE59CA84576656E7454696D65E697B6E997B4E6A8A1E5BC8FE4B88BE8AEBEE7BDAE77617465726D61726BEFBC8CE4B8BAE7AA97E58FA3E8819AE59088E5819AE58786E5A487E380820A0A0AE58F82E695B0E8AFB4E6988E0A0A2D2077617465726D61726B536F757263653A20E69DA5E6BA90E58C85E68BACEFBC9AE695B0E68DAEE58685E697B6E997B4E5AD97E6AEB5EFBC8874696D655F6669656C64EFBC89E68896E7B3BBE7BB9FE697B6E997B4EFBC887379735F74696D65EFBC890A2D2074696D654669656C644E616D653A20E697B6E997B4E5AD97E6AEB5EFBC9AE9809AE8BF87E697B6E997B4E5AD97E6AEB5E8AEBEE7BDAEE6B0B4E4BD8DE7BABFEFBC9B77617465726D61726B536F75726365E4B8BA74696D655F6669656C64E697B6E5BF85E5A1AB0A2D2074696D65466F726D61743A20E697B6E997B4E6A0BCE5BC8FEFBC9AE694AFE68C81554E49585F532C20554E49585F4D53E4BBA5E58F8AE9809AE794A8E697B6E997B4E8A1A8E8BEBEE6A0BCE5BC8FEFBC9B77617465726D61726B536F75726365E4B8BA74696D655F6669656C64E697B6E5BF85E5A1AB0A0A232320E69C80E5A4A7E58FAFE5AEB9E5BF8DE4B9B1E5BA8FE697B6E997B4EFBC886C6167426568696E6454696D65EFBC890AE7949FE68890E79A8477617465726D61726BE7AD89E4BA8EE5BD93E5898DE695B0E68DAEE697B6E997B4E5878FE58EBBE6ADA4E9858DE7BDAEE697B6E997B4EFBC8CE4B99FE5B0B1E698AFE8819AE59088E7AA97E58FA3E5BBB6E8BF9FE585B3E997ADEFBC8CE58FAFE5AEB9E5BF8DE695B0E68DAEE6999AE588B0E697B6E997B4E88C83E59BB40A0AE4BE8BE5AD90EFBC9AE8BE93E585A5E695B0E68DAE0A0A6060600A7B22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3039222C2276616C7565223A317D202023E697B6E997B4E5B7B2E8B685E8BF8731323A30303A30300A7B22686F7374223A2261222C2274696D65223A22323032302D31312D32322031313A35393A3030222C2276616C7565223A317D202023E4B88AE4B880E4B8AAE7AA97E58FA3E695B0E68DAE0A7B22686F7374223A2262222C2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A317D0A6060600A0AE9858DE7BDAEE5A682E4B88B0A0A6060600A7B0A20202277617465726D61726B536F7572636522203A202274696D655F6669656C64222C0A20202274696D654669656C644E616D6522203A202274696D65222C0A20202274696D65466F726D617422203A2022797979792D4D4D2D64642048483A6D6D3A7373222C0A2020226C6167426568696E6454696D6522203A2031302023E69C80E5A4A7E58FAFE5AEB9E5BF8DE4B9B1E5BA8FE697B6E997B4E4B8BA3130730A7D0A6060600A0AE8BE93E587BA0A0A6060600A7B224074696D657374616D70223A22323032302D31312D32322031313A35393A3030222C22636F756E74223A312C22686F7374223A2261227D0A7B224074696D657374616D70223A22323032302D31312D32322031323A30303A3030222C22636F756E74223A312C22686F7374223A2262227D0A7B224074696D657374616D70223A22323032302D31312D32322031323A30303A3030222C22636F756E74223A312C22686F7374223A2261227D0A6060600A2D20E69C80E5A4A7E58FAFE5AEB9E5BF8DE4B9B1E5BA8FE697B6E997B4E4B8BA313073EFBC8CE58899E79BB4E588B031323A30303A3130E6898DE4BC9AE585B3E997AD31313A35393A30307E31323A30303A3030E79A84E7AA97E58FA30A2D20E7ACACE4B880E69DA1323032302D31312D32322031323A30303A3039E8BE93E585A5E697B6EFBC8C31313A35393A30307E31323A30303A3030E79A84E7AA97E58FA3E8BF98E6B2A1E69C89E585B3E997ADEFBC8CE68980E4BBA5E58FAFE4BBA5E8A2ABE7BB9FE8AEA1E588B0E380820A2D20E5A682E69E9C6C6167426568696E6454696D65E8AEBEE7BDAEE4B8BA30EFBC8CE58899E7ACACE4B880E69DA1323032302D31312D32322031323A30303A3039E8BE93E585A5E697B6EFBC8C31313A35393A30307E31323A30303A3030E79A84E7AA97E58FA3E4BC9AE8A2ABE585B3E997ADEFBC8CE5AFBCE887B4323032302D31312D32322031313A35393A3030E79A84E7BB9FE8AEA1E7AA97E58FA3E5B0B1E697A0E6B395E8BE93E587BA0A0A232320E69C80E5A4A7E58FAFE8B7B3E8B783E697B6E997B4EFBC886D617847617054696D65EFBC890AE695B0E68DAEE697B6E997B4E58FAFE8B685E8BF87E5BD93E5898D77617465726D61726BE79A84E69C80E5A4A7E697B6E997B4EFBC8CE5A682E69E9CE8B685E8BF87E58899E4B88DE8AEBEE7BDAE77617465726D61726BEFBC8C30E8A1A8E7A4BAE4B88DE99990E588B60A0AE4BE8BE5AD90EFBC9AE8BE93E585A5E695B0E68DAE0A0A6060600A7B22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3039222C2276616C7565223A317D20200A7B22686F7374223A2261222C2274696D65223A22323032302D31312D32322031313A35393A3030222C2276616C7565223A317D20200A7B22686F7374223A2262222C2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A317D0A7B22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30313A3130222C2276616C7565223A317D20232031323A30313A3130E6AF94E4B98BE5898DE69C80E5A4A731323A30303A3039E8B7B3E8B783E8B685E8BF87363073EFBC8CE4B88DE8AEBEE7BDAE77617465726D61726B0A7B22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3539222C2276616C7565223A317D0A6060600A0AE9858DE7BDAEE5A682E4B88B0A0A6060600A7B0A20202277617465726D61726B536F7572636522203A202274696D655F6669656C64222C0A20202274696D654669656C644E616D6522203A202274696D65222C0A20202274696D65466F726D617422203A2022797979792D4D4D2D64642048483A6D6D3A7373222C0A2020226D617847617054696D6522203A203630202320E69C80E5A4A7E58FAFE8B7B3E8B783E697B6E997B43630730A7D0A6060600A0AE8BE93E587BA0A0A6060600A7B224074696D657374616D70223A22323032302D31312D32322031323A30303A3030222C22636F756E74223A322C22686F7374223A2261227D0A7B224074696D657374616D70223A22323032302D31312D32322031323A30303A3030222C22636F756E74223A312C22686F7374223A2262227D0A7B224074696D657374616D70223A22323032302D31312D32322031323A30313A3030222C22636F756E74223A312C22686F7374223A2261227D0A6060600A2D2031323A30313A3130E6AF94E4B98BE5898DE69C80E5A4A731323A30303A3039E8B7B3E8B783E8B685E8BF873630732C20E4B88DE8AEBEE7BDAE77617465726D61726BEFBC8CE4BDBFE5BE9731323A30303A3030207E2031323A30313A3030E7AA97E58FA3E6B2A1E69C89E68F90E5898DE8A7A6E58F91EFBC8CE4BDBFE5BE97E5908EE69DA5E79A8431323A30303A3539E79A8461E58FAFE4BBA5E8A2ABE7BB9FE8AEA1E588B00A0A232320E69C80E5A4A7E58FAFE5818FE7A6BBE697B6E997B4EFBC886D61784465766961746554696D65EFBC890AE695B0E68DAEE697B6E997B4E58FAFE5818FE7A6BBE5BD93E5898DE7B3BBE7BB9FE697B6E997B4E79A84E69C80E5A4A7E580BCEFBC8CE5A682E69E9CE8B685E8BF87E58899E4B88DE8AEBEE7BDAE77617465726D61726BEFBC8C30E8A1A8E7A4BAE4B88DE99990E588B60A0AE4BE8BE5AD90EFBC9AE8BE93E585A5E695B0E68DAE0A2D20E4BE8BE5A682E5BD93E5898DE697B6E997B4E4B8BAEFBC9A313630383138363834323834320A0A6060600A7B22686F7374223A2261222C2274696D65223A313630383138363930333834322C2276616C7565223A317D202320E8B685E8BF87E5BD93E5898DE697B6E997B43631730A7B22686F7374223A2261222C2274696D65223A313630383138363834323834322C2276616C7565223A317D200A0A6060600A0AE9858DE7BDAEE5A682E4B88B0A0A6060600A7B0A20202277617465726D61726B536F7572636522203A202274696D655F6669656C64222C0A20202274696D654669656C644E616D6522203A202274696D65222C0A20202274696D65466F726D617422203A2022797979792D4D4D2D64642048483A6D6D3A7373222C0A2020226D61784465766961746554696D6522203A203630202320E69C80E5A4A7E58FAFE5818FE7A6BBE697B6E997B43630730A7D0A6060600A0AE8BE93E587BA0A0A6060600A7B224074696D657374616D70223A313630383138363834303030302C22636F756E74223A312C22686F7374223A2261227D0A7B224074696D657374616D70223A313630383138363930303030302C22636F756E74223A312C22686F7374223A2261227D0A6060600A2D2031363038313836393033383432E8B685E8BF87E5BD93E5898DE697B6E997B43631732C20E4B88DE8AEBEE7BDAE77617465726D61726BEFBC8CE4BDBFE5BE9731363038313836383430303030207E2031363038313836393030303030E7AA97E58FA3E6B2A1E69C89E68F90E5898DE8A7A6E58F91EFBC8CE4BDBFE5BE97E5908EE69DA5E79A8431363038313836383432383432E79A8461E58FAFE4BBA5E8A2ABE7BB9FE8AEA1E588B00A, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313630373934333331383633322220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D223931392220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3935352E373333333333203233382E393333333333563137302E363636363637682D3130322E34563130322E34682D36382E323636363636763330372E324836382E3236363636377636382E323636363637683731362E38763437372E383636363636683137302E363636363636762D36382E323636363636682D3130322E34762D3137302E3636363636376836382E323636363637762D36382E323636363637682D36382E323636363637762D3137302E363636363636683130322E34762D36382E323636363637682D3130322E34563233382E393333333333683130322E347A206D2D3236322E383236363636203532322E32344C3634382E353333333333203830352E3230353333336C2D34342E3033322D34342E3033326133332E393936382033332E393936382030203020302D34382E31323820304C353132203830352E3230353333336C2D34342E3033322D34342E3033326133332E393936382033332E393936382030203020302D34382E31323820304C3337352E343636363637203830352E323035333333203333312E343334363637203736312E3137333333336133332E393936382033332E393936382030203020302D34382E31323820304C3233382E393333333333203830352E323035333333203139342E393031333333203736312E3137333333336133332E393936382033332E393936382030203120302D34382E3132382034382E3132386C36372E3932353333342036382E3236363636376331332E3331322031332E3331322033342E3831362031332E3331322034382E31323820306C34342E3337333333332D34342E3337333333332034342E3033322034342E3033326331332E3331322031332E3331322033342E3831362031332E3331322034382E31323820306C34342E3337333333332D34342E3033322034342E3033322034342E3033326331332E3331322031332E3331322033342E3831362031332E3331322034382E31323820306C34342E3337333333342D34342E3033322034342E3033322034342E30333263362E38323636363720362E3832363636372031352E33362031302E32342032342E3233343636362031302E32347331372E3430382D332E3431333333332032342E3233343636372D392E3839383636376C36382E3236363636372D36382E3236363636376133332E393936382033332E393936382030203120302D34382E3132382D34382E3132387A206D302D3230342E384C3634382E353333333333203630302E3430353333336C2D34342E3033322D34342E3033326133332E393936382033332E393936382030203020302D34382E31323820304C353132203630302E3430353333336C2D34342E3033322D34342E3033326133332E393936382033332E393936382030203020302D34382E31323820304C3337352E343636363637203630302E343035333333203333312E343334363637203535362E3337333333336133332E393936382033332E393936382030203020302D34382E31323820304C3233382E393333333333203630302E343035333333203139342E393031333333203535362E3337333333336133332E393936382033332E393936382030203120302D34382E3132382034382E3132386C36372E3932353333342036382E3236363636376331332E3331322031332E3331322033342E3831362031332E3331322034382E31323820306C34342E3337333333332D34342E3337333333332034342E3033322034342E3033326331332E3331322031332E3331322033342E3831362031332E3331322034382E31323820306C34342E3337333333332D34342E3033322034342E3033322034342E3033326331332E3331322031332E3331322033342E3831362031332E3331322034382E31323820306C34342E3337333333342D34342E3033322034342E3033322034342E30333263362E38323636363720362E3832363636372031352E33362031302E32342032342E3233343636362031302E32347331372E3430382D332E3431333333332032342E3233343636372D392E3839383636376C36382E3236363636372D36382E3236363636376133332E393936382033332E393936382030203120302D34382E3132382D34382E3132387A2220702D69643D22393230223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.process.WindowAggJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.process.WindowAggJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]},{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"WindowAggJob\",\"type\":\"streaming\",\"role\":\"process\",\"category\":\"窗口操作\",\"display\":\"窗口聚合\",\"description\":\"窗口聚合统计,数值类型支持 `max`,`min`,`avg`,`sum`;所有类型支持 `last`,`first`,`count`,`collect`,`calc`\",\"doc\":\"WindowAggJob.md\",\"icon\":\"WindowAggJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"windowType\",\"label\":\"聚合窗口类型\",\"type\":[\"STRING\"],\"description\":\"flink支持的窗口类型:https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/stream/operators/windows.html\",\"optional\":true,\"defaultValue\":\"tumbling\",\"placeholder\":\"\",\"candidates\":[\"tumbling\",\"sliding\",\"session\",\"global\"],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"triggerType\",\"label\":\"聚合窗口触发自定义类型\",\"type\":[\"STRING\"],\"description\":\"默认按窗口类型的默认trigger触发,可选:default, count,delta,expression\",\"optional\":true,\"defaultValue\":\"default\",\"placeholder\":\"\",\"candidates\":[\"default\",\"count\",\"delta\",\"expression\"],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"triggerResultType\",\"label\":\"聚合窗口触发动作\",\"type\":[\"STRING\"],\"description\":\"窗口触发达到后所触发的动作;CONTINUE: do nothing,\\nFIRE: trigger the computation,\\nPURGE: clear the elements in the window, and\\nFIRE_AND_PURGE: trigger the computation and clear the elements in the window afterwards\",\"optional\":true,\"defaultValue\":\"FIRE\",\"placeholder\":\"\",\"candidates\":[\"CONTINUE\",\"FIRE\",\"PURGE\",\"FIRE_AND_PURGE\"],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"triggerMaxCount\",\"label\":\"窗口触发最大count\",\"type\":[\"LONG\"],\"description\":\"当窗口触发类型为count时必填,窗口内数据count数大于等于此最大值时窗口被触发\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"triggerDeltaValueField\",\"label\":\"窗口触发delta比较值字段\",\"type\":[\"STRING\"],\"description\":\"当窗口触发类型为delta时必填,比较值需为double类型;\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"triggerDeltaExp\",\"label\":\"窗口触发delta阈值计算表达式\",\"type\":[\"STRING\"],\"description\":\"当窗口触发类型为delta时必填,此表达式内可以使用变量为oldValue(上一条数据的delta比较值)和 newValue(本条数据的delta比较值),例如:newValue - oldValue*2.5 ,通过此表达式计算得出delta阈值\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"triggerDeltaThreshold\",\"label\":\"窗口触发delta的阈值\",\"type\":[\"DOUBLE\"],\"description\":\"当窗口触发类型为delta时必填,通过triggerDeltaExp计算值大于此阈值时窗口被触发\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"triggerExpression\",\"label\":\"窗口触发expression表达式\",\"type\":[\"STRING\"],\"description\":\"当窗口触发类型为expression时必填,通过此表达式从map数据中计算得出boolean值,如果为true时窗口被触发\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"windowSize\",\"label\":\"聚合窗口时间(单位毫秒)\",\"type\":[\"LONG\"],\"description\":\"聚合窗口时间(单位毫秒); 只有当窗口类型为global时是可选;\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"slidingSize\",\"label\":\"滑动窗口时间(单位毫秒)\",\"type\":[\"LONG\"],\"description\":\"滑动窗口时间(单位毫秒),windowType为sliding时需指定\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"aggDefs\",\"label\":\"聚合定义\",\"type\":[\"LIST\"],\"description\":\"聚合定义描述,包括聚合字段,聚合统计方法和输出字段\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":{\"apiVersion\":0,\"name\":null,\"label\":null,\"type\":[\"OBJECT\"],\"description\":null,\"optional\":false,\"defaultValue\":null,\"placeholder\":null,\"candidates\":null,\"inputType\":null,\"range\":null,\"regex\":null,\"order\":0,\"requireCondition\":null,\"availableCondition\":null,\"listParameter\":null,\"objectParameters\":[{\"apiVersion\":2,\"name\":\"fieldName\",\"label\":\"聚合字段\",\"type\":[\"STRING\"],\"description\":\"计算`sum`,`max`,`min`,`avg`方法聚合字段为数值类型;其他方法可支持其他类型;\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"fieldExp\",\"label\":\"聚合字段表达式\",\"type\":[\"STRING\"],\"description\":\"使用表达式计算得出参与聚合字段的值\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"AVIATOR_SCRIPT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"aggMethod\",\"label\":\"聚合方法\",\"type\":[\"STRING\"],\"description\":\"支持 `max`,`min`,`avg`,`last`,`first`,`sum`,`count`,`collect`,`calc`;count当字段名为* 则无条件count,否则需要对应字段的值不为null才count;collect收集指定字段为LIST;calc按aviator表达式通过其他聚合结果变量计算新的结果;\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[\"max\",\"min\",\"avg\",\"last\",\"first\",\"sum\",\"count\",\"collect\",\"calc\"],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"calc\",\"label\":\"aviator表达式\",\"type\":[\"STRING\"],\"description\":\"当aggMethod为calc时,通过其他方法的输出字段 或 窗口时间字段 或 分组字段 为变量来指定aviator表达式,计算聚合结果;变量如果包含特殊字符串,需要以 # 符号开始,再使用两个 ` 符号来包围例如: #`@timestamp`;\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"AVIATOR_SCRIPT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"collectFieldNames\",\"label\":\"收集字段白名单\",\"type\":[\"LIST\"],\"description\":\"当aggMethod为collect时,需要指定收集的字段名列表\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":{\"apiVersion\":0,\"name\":null,\"label\":null,\"type\":[\"STRING\"],\"description\":null,\"optional\":false,\"defaultValue\":null,\"placeholder\":null,\"candidates\":null,\"inputType\":null,\"range\":null,\"regex\":null,\"order\":0,\"requireCondition\":null,\"availableCondition\":null,\"listParameter\":null,\"objectParameters\":null},\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"limitCount\",\"label\":\"收集条数限制\",\"type\":[\"INT\"],\"description\":\"当aggMethod为collect时,收集的条数限制\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"collectType\",\"label\":\"收集策略\",\"type\":[\"STRING\"],\"description\":\"定义如何在窗口内收集数据,与limitCount一起使用,取前多少条(top),取后多少条(bottom),随机取多少条(random)\",\"optional\":true,\"defaultValue\":\"top\",\"placeholder\":\"\",\"candidates\":[\"top\",\"bottom\",\"random\"],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"distinct\",\"label\":\"是否去重\",\"type\":[\"BOOL\"],\"description\":\"对于窗口内所有输入数据聚合字段的值,是否去重后聚合\",\"optional\":true,\"defaultValue\":\"false\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"outputFieldName\",\"label\":\"输出字段\",\"type\":[\"STRING\"],\"description\":\"不可重复且命名以字母或下划线开头;\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"filterExp\",\"label\":\"过滤表达式\",\"type\":[\"STRING\"],\"description\":\"表达式aviator格式,只有符合才参与变量聚合计算\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"AVIATOR_SCRIPT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"scale\",\"label\":\"数值精度\",\"type\":[\"INT\"],\"description\":\"聚合后输出平均值的数值精度,如果不填,默认保持原始精度\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]},\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"groupKeys\",\"label\":\"分组字段\",\"type\":[\"LIST\"],\"description\":\"分组字段列表\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":{\"apiVersion\":0,\"name\":null,\"label\":null,\"type\":[\"STRING\"],\"description\":null,\"optional\":false,\"defaultValue\":null,\"placeholder\":null,\"candidates\":null,\"inputType\":null,\"range\":null,\"regex\":null,\"order\":0,\"requireCondition\":null,\"availableCondition\":null,\"listParameter\":null,\"objectParameters\":null},\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"windowTimeColumn\",\"label\":\"输出窗口时间字段\",\"type\":[\"STRING\"],\"description\":\"窗口聚合后,按照窗口对应的时间,生成的时间戳字段名\",\"optional\":true,\"defaultValue\":\"@timestamp\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"windowTimeFormat\",\"label\":\"输出窗口时间格式\",\"type\":[\"STRING\"],\"description\":\"转化后输出的目标格式,支持UNIX_S, UNIX_MS以及通用时间表达格式\",\"optional\":true,\"defaultValue\":\"UNIX_MS\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"windowTimezone\",\"label\":\"输出窗口时间的时区\",\"type\":[\"STRING\"],\"description\":\"窗口时间所在时区, 例如:`Europe/London`,`PST` or `GMT+5`\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"windowTimeOffsetType\",\"label\":\"输出窗口时间类型\",\"type\":[\"STRING\"],\"description\":\"窗口聚合后,按照窗口对应的时间,生成的时间戳时,是按照窗口的开始(start)还是结束(end)生成\",\"optional\":true,\"defaultValue\":\"start\",\"placeholder\":\"\",\"candidates\":[\"start\",\"end\"],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"windowTimeLocale\",\"label\":\"输出时间格式方言\",\"type\":[\"STRING\"],\"description\":\"支持用户设定时间方言,默认的时区为: en-US,可选的时区参见列表: https://www.andiamo.co.uk/resources/iso-language-codes\",\"optional\":true,\"defaultValue\":\"en-US\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"allowedLatenessTime\",\"label\":\"最大可延迟时间\",\"type\":[\"INT\"],\"description\":\"event模式下,在延迟时间内,上一个窗口晚到的数据会使窗口重新触发聚合,请参考:https://ci.apache.org/projects/flink/flink-docs-release-1.12/dev/stream/operators/windows.html#allowed-lateness\",\"optional\":true,\"defaultValue\":\"0\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'process', '', 0x2320E7AA97E58FA3E8819AE59088E7BB9FE8AEA10AE68C89E68C87E5AE9AE58886E7BB84E5928CE7AA97E58FA3E8BF9BE8A18CE8819AE59088E7BB9FE8AEA1EFBC9B0AE695B0E580BCE7B1BBE59E8BE694AFE68C8120606D6178602C606D696E602C60617667602C6073756D60EFBC9BE68980E69C89E7B1BBE59E8BE694AFE68C8120606C617374602C606669727374602C60636F756E74602C60636F6C6C656374602C6063616C63600A0A2D20E8BE93E587BAE6ADA3E5B8B8E8819AE59088E7BB93E69E9CE588B020736C6F7420300A2D20E8BE93E587BAE59BA0E4B8BAE6999AE588B0E695B0E68DAEE8808CE5868DE6ACA1E8A7A6E58F91E7AA97E58FA3E79A84E8819AE59088E7BB93E69E9CE588B0736C6F7420310A0AE5BF85E5A1ABE58F82E695B0E8AFB4E6988E0A2D2077696E646F77547970653A20E8819AE59088E7AA97E58FA3E7B1BBE59E8B3A74756D626C696E672C20736C6964696E672C2073657373696F6E2C20676C6F62616C2CE8AFB7E58F82E88083EFBC9A68747470733A2F2F63692E6170616368652E6F72672F70726F6A656374732F666C696E6B2F666C696E6B2D646F63732D72656C656173652D312E392F6465762F73747265616D2F6F70657261746F72732F77696E646F77732E68746D6C0A2D2077696E646F7753697A653A20E8819AE59088E7AA97E58FA3E697B6E997B428E58D95E4BD8DE6AFABE7A792292C20E58FAAE69C89E5BD93E7AA97E58FA3E7B1BBE59E8BE4B8BA676C6F62616CE697B6E698AFE58FAFE98089EFBC9B0A2D20736C6964696E6753697A65EFBC9A20E6BB91E58AA8E7AA97E58FA3E6BB91E58AA8E697B6E997B428E58D95E4BD8DE6AFABE7A79229EFBC8CE7AA97E58FA3E7B1BBE59E8BE4B8BA736C6964696E67E697B6E99C80E68C87E5AE9AEFBC9B0A2D20616767446566733A20E8819AE59088E5AE9AE4B989EFBC8CE58C85E68BACE8819AE59088E5AD97E6AEB5EFBC8CE8819AE59088E7BB9FE8AEA1E696B9E6B395E5928CE8BE93E587BAE5AD97E6AEB5EFBC9BE585B6E4B8ADE8BE93E587BAE5AD97E6AEB5E4B8BAE5BF85E5A1ABE4B894E4B88DE883BDE9878DE5A48DEFBC9BE8819AE59088E7BB9FE8AEA1E696B9E6B395E4B99FE4B8BAE5BF85E5A1ABEFBC9B0A0A232320E7AA97E58FA3E8A7A6E58F91E599A8EFBC88E9AB98E7BAA7E58F82E695B0EFBC890AE9BB98E8AEA4E698AF64656661756C74EFBC8CE68C89E68C87E5AE9AE7AA97E58FA3E7B1BBE59E8BE79A84E9BB98E8AEA474726967676572E8A7A6E58F91EFBC9B0A0AE58685E7BDAEE4BA86E4B889E7A78DE789B9E6AE8AE79A84E7AA97E58FA3E8A7A6E58F91E599A8EFBC8CE9809AE8BF877472696767657254797065E58F82E695B0E68C87E5AE9AEFBC9B0A2D20312E20636F756E74EFBC8CE68C89636F756E74E8A7A6E58F91EFBC9AE7AA97E58FA3E58685E695B0E68DAE636F756E74E695B0E5A4A7E4BA8EE7AD89E4BA8EE6ADA4E69C80E5A4A7E580BCE697B6E7AA97E58FA3E8A2ABE8A7A6E58F910A2D20322E2064656C7461EFBC8CE68C8964656C7461E8A7A6E58F91EFBC9AE9809AE8BF877472696767657244656C7461457870E8AEA1E7AE97E580BCE5A4A7E4BA8EE6ADA4E99888E580BCE697B6E7AA97E58FA3E8A2ABE8A7A6E58F910A2D20332E2065787072657373696F6EEFBC8CE68C89E8A1A8E8BEBEE5BC8FE8A7A6E58F91EFBC9AE9809AE8BF87E6ADA4E8A1A8E8BEBEE5BC8FE4BB8E6D6170E695B0E68DAEE4B8ADE8AEA1E7AE97E5BE97E587BA626F6F6C65616EE580BCEFBC8CE5A682E69E9CE4B8BA74727565E697B6E7AA97E58FA3E8A2ABE8A7A6E58F910A0A6060600AE5BD93E7AA97E58FA3E7B1BBE59E8BE4B8BA676C6F62616CE697B6EFBC8CE99C80E8A681E887AAE5AE9AE4B989E8A7A6E58F91E599A8EFBC8CE590A6E58899E7AA97E58FA3E6B0B8E8BF9CE4B88DE8A7A6E58F91EFBC9B0AE58FA6E5A496EFBC8CE7AA97E58FA3E7B1BBE59E8BE4B8BA74756D626C696E672C20736C6964696E672C2073657373696F6EE697B6EFBC8CE9BB98E8AEA4E698AFE68C89E7AA97E58FA3E7BB93E69D9FE697B6E997B4E8A7A6E58F91EFBC9B0AE4BD86E4B99FE58FAFE4BBA5E68C87E5AE9AE887AAE5AE9AE4B989E8A7A6E58F91E599A8EFBC8CE794A8E4BA8EE8A686E79B96E58E9FE69C89E79A84E9BB98E8AEA4E8A7A6E58F91E599A8EFBC9B0A6060600A0AE58FAFE887AAE5AE9AE4B989E59B9BE7A78DE8A7A6E58F91E5908EE79A84E58AA8E4BD9CEFBC9A68747470733A2F2F63692E6170616368652E6F72672F70726F6A656374732F666C696E6B2F666C696E6B2D646F63732D72656C656173652D312E392F6465762F73747265616D2F6F70657261746F72732F77696E646F77732E68746D6C2374726967676572730A2D20434F4E54494E55453A20646F206E6F7468696E672C0A2D20464952453A20747269676765722074686520636F6D7075746174696F6E2C0A2D2050555247453A20636C6561722074686520656C656D656E747320696E207468652077696E646F772C20616E640A2D20464952455F414E445F50555247453A20747269676765722074686520636F6D7075746174696F6E20616E6420636C6561722074686520656C656D656E747320696E207468652077696E646F7720616674657277617264732E0A0A0A232320E6A0B7E4BE8B310A0AE8BE93E585A5E695B0E68DAE0A6060600A20207B0A202020202276616C756532223A20322C0A2020202022686F737432223A202263222C0A2020202022686F7374223A202261222C0A202020202274696D65223A2022323032302D31312D32322031323A30303A3030222C0A202020202276616C7565223A20310A20207D2C0A20207B0A202020202276616C756532223A20342C0A2020202022686F737432223A202263222C0A2020202022686F7374223A202261222C0A202020202274696D65223A2022323032302D31312D32322031323A30303A3031222C0A202020202276616C7565223A20320A20207D2C0A20207B0A202020202276616C756532223A20342C0A2020202022686F737432223A202263222C0A2020202022686F7374223A202262222C0A202020202274696D65223A2022323032302D31312D32322031323A30303A3030222C0A202020202276616C7565223A20320A20207D2C0A20207B0A202020202276616C756532223A20362C0A2020202022686F737432223A202263222C0A2020202022686F7374223A202262222C0A202020202274696D65223A2022323032302D31312D32322031323A30303A3031222C0A202020202276616C7565223A20330A20207D0A6060600A0AE9858DE7BDAEE5A682E4B88B0A0A57617465726D61726B4A6F62E9858DE7BDAE0A0A6060600A7B0A20202277617465726D61726B536F75726365223A202274696D655F6669656C64222C0A20202274696D654669656C644E616D65223A202274696D65222C0A20202274696D65466F726D6174223A2022797979792D4D4D2D64642048483A6D6D3A7373220A7D0A6060600A0A57696E646F774167674A6F62E9858DE7BDAE0A0A6060600A7B0A20202277696E646F775479706522203A202274756D626C696E67222C0A20202277696E646F7753697A6522203A2036303030302C0A2020226167674465667322203A205B207B0A20202020226669656C644E616D6522203A202276616C7565222C0A20202020226167674D6574686F6422203A20226D6178222C0A20202020226F75747075744669656C644E616D6522203A20226D6178220A20207D2C207B0A20202020226669656C644E616D6522203A202276616C7565222C0A20202020226167674D6574686F6422203A20226D696E222C0A20202020226F75747075744669656C644E616D6522203A20226D696E220A20207D2C207B0A20202020226669656C644E616D6522203A202276616C756532222C0A20202020226167674D6574686F6422203A2022617667222C0A20202020226F75747075744669656C644E616D6522203A202276616C7565325F617667220A20207D2C207B0A20202020226669656C644E616D6522203A202276616C756532222C0A20202020226167674D6574686F6422203A20226D6178222C0A20202020226F75747075744669656C644E616D6522203A202276325F6D6178220A20207D205D2C0A20202267726F75704B65797322203A205B2022686F7374222C2022686F73743222205D2C0A20202277696E646F7754696D65436F6C756D6E22203A20224074696D657374616D70222C0A20202277696E646F7754696D65466F726D617422203A2022797979792D4D4D2D64642048483A6D6D3A7373222C0A20202277696E646F7754696D654F66667365745479706522203A20227374617274220A7D0A6060600A0AE8BE93E587BA0A6060600A7B2276616C7565325F617667223A332E302C226D696E223A312E302C224074696D657374616D70223A22323032302D31312D32322031323A30303A3030222C226D6178223A322E302C22686F737432223A2263222C2276325F6D6178223A342E302C22686F7374223A2261227D0A7B2276616C7565325F617667223A352E302C226D696E223A322E302C224074696D657374616D70223A22323032302D31312D32322031323A30303A3030222C226D6178223A332E302C22686F737432223A2263222C2276325F6D6178223A362E302C22686F7374223A2262227D0A6060600A0A232320E4BDBFE794A8E8BF87E6BBA4E69DA1E4BBB60A0A2D20E9809AE8BF87E58F82E695B066696C746572457870E68C87E5AE9AE8BF87E6BBA4E69DA1E4BBB6E8A1A8E8BEBEE5BC8FEFBC8CE59FBAE4BA8EE8BE93E585A5E695B0E68DAEE689A7E8A18CE8A1A8E8BEBEE5BC8FE8BF94E59B9E74727565E6889666616C73650A2D20E58FAAE69C89E8BF94E59B9E74727565E79A84E8BE93E585A5E695B0E68DAEE4BC9AE58F82E4B88EE8819AE59088E8AEA1E7AE970A0AE8BE93E585A5E695B0E68DAE0A0A6060600A20207B0A202020202276616C756532223A20322C0A2020202022686F737432223A202263222C0A2020202022686F7374223A202261222C0A202020202274696D65223A2022323032302D31312D32322031323A30303A3030222C0A202020202276616C7565223A20310A20207D2C0A20207B0A202020202276616C756532223A20342C0A2020202022686F737432223A202263222C0A2020202022686F7374223A202261222C0A202020202274696D65223A2022323032302D31312D32322031323A30303A3031222C0A202020202276616C7565223A20320A20207D2C0A20207B0A202020202276616C756532223A20342C0A2020202022686F737432223A202263222C0A2020202022686F7374223A202262222C0A202020202274696D65223A2022323032302D31312D32322031323A30303A3030222C0A202020202276616C7565223A20320A20207D2C0A20207B0A202020202276616C756532223A20362C0A2020202022686F737432223A202263222C0A2020202022686F7374223A202262222C0A202020202274696D65223A2022323032302D31312D32322031323A30303A3031222C0A202020202276616C7565223A20330A20207D0A6060600A0AE9858DE7BDAE0A0A6060600A7B0A20202277696E646F775479706522203A202274756D626C696E67222C0A20202277696E646F7753697A6522203A2036303030302C0A2020226167674465667322203A205B207B0A20202020226669656C644E616D6522203A202276616C7565222C0A20202020226167674D6574686F6422203A202273756D222C0A20202020226F75747075744669656C644E616D6522203A2022765F73756D222C0A202020202266696C74657245787022203A2022686F7374203D3D202761272026262076616C7565203E3D2032222C0A20207D205D2C0A20202267726F75704B65797322203A205B2022686F737422205D2C0A20202277696E646F7754696D65466F726D617422203A2022797979792D4D4D2D64642048483A6D6D3A7373220A7D0A6060600A0AE8BE93E587BA0A0A6060600A7B224074696D657374616D70223A22323032302D31312D32322031323A30303A3030222C22686F7374223A2261222C22765F73756D223A322E307D0A6060600A0A232320E4BDBFE794A8E8A1A8E8BEBEE5BC8FE8AEA1E7AE97E58F98E9878F0A0A2D20E68C87E5AE9A226167674D6574686F6422E4B8BA2263616C6322EFBC8CE5B9B6E5A1ABE585A52263616C6322E8AEA1E7AE97E8A1A8E8BEBEE5BC8FE58F82E695B00A2D20E9809AE8BF87E585B6E4BB96E696B9E6B395E79A84E8BE93E587BAE5AD97E6AEB520E6889620E7AA97E58FA3E697B6E997B4E5AD97E6AEB520E6889620E58886E7BB84E5AD97E6AEB520E4B8BAE58F98E9878FE69DA5E68C87E5AE9A61766961746F72E8A1A8E8BEBEE5BC8FEFBC8CE8AEA1E7AE97E8819AE59088E7BB93E69E9CEFBC9B0A2D20E58F98E9878FE5908DE5A682E69E9CE58C85E590ABE789B9E6AE8AE5AD97E7ACA6E4B8B2EFBC8CE99C80E8A681E4BBA5202320E7ACA6E58FB7E5BC80E5A78B2CE5868DE4BDBFE794A8E4B8A4E4B8AA205C6020E7ACA6E58FB7E69DA5E58C85E59BB4EFBC8CE4BE8BE5A682EFBC9A20235C604074696D657374616D705C60EFBC9B0A0AE8BE93E585A5E695B0E68DAE0A6060600A7B2276616C756532223A312E333333333333332C22686F737432223A2263222C22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A317D0A7B2276616C756532223A312E333333333333332C22686F737432223A2263222C22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A327D0A7B2276616C756532223A312E333333333333332C22686F737432223A2263222C22686F7374223A2262222C2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A327D0A7B2276616C756532223A312E333333333333332C22686F737432223A2263222C22686F7374223A2262222C2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A337D0A6060600A0AE9858DE7BDAE0A0A6060600A7B0A20202277696E646F775479706522203A202274756D626C696E67222C0A20202277696E646F7753697A6522203A2036303030302C0A2020226167674465667322203A205B207B0A20202020226669656C644E616D6522203A202276616C7565222C0A20202020226167674D6574686F6422203A20226D6178222C0A20202020226F75747075744669656C644E616D6522203A20226D6178220A20207D2C207B0A20202020226669656C644E616D6522203A202276616C7565222C0A20202020226167674D6574686F6422203A20226D696E222C0A20202020226F75747075744669656C644E616D6522203A20226D696E220A20207D2C207B0A20202020226669656C644E616D6522203A202276616C756532222C0A20202020226167674D6574686F6422203A2022617667222C0A20202020227363616C6522203A20332C0A20202020226F75747075744669656C644E616D6522203A20225F76616C7565325F61766722200A20207D2C207B0A20202020226669656C644E616D6522203A202276616C756532222C0A20202020226167674D6574686F6422203A202273756D222C0A20202020226F75747075744669656C644E616D6522203A202276325F73756D220A20207D2C207B0A20202020226669656C644E616D6522203A202263616C6331222C0A20202020226167674D6574686F6422203A202263616C63222C0A202020202263616C6322203A20226D6178202B20322A6D696E202B205F76616C7565325F617667222C0A20202020226F75747075744669656C644E616D6522203A202263616C6331220A20207D2C207B0A20202020226669656C644E616D6522203A202263616C6332222C0A20202020226167674D6574686F6422203A202263616C63222C0A202020202263616C6322203A202223604074696D657374616D7060202B20272E3030302B30383A303027222C0A20202020226F75747075744669656C644E616D6522203A202263616C6332220A20207D205D2C0A20202267726F75704B65797322203A205B2022686F7374222C2022686F73743222205D2C0A20202277696E646F7754696D65466F726D617422203A2022797979792D4D4D2D64642048483A6D6D3A7373220A7D0A6060600A0AE8BE93E587BA0A0A6060600A7B2276325F73756D223A322E363636363636362C226D696E223A312E302C224074696D657374616D70223A22323032302D31312D32322031323A30303A3030222C226D6178223A322E302C225F76616C7565325F617667223A312E3333332C22686F737432223A2263222C22686F7374223A2261222C2263616C6331223A352E3333332C2263616C6332223A22323032302D31312D32322031323A30303A30302E3030302B30383A3030227D0A7B2276325F73756D223A322E363636363636362C226D696E223A322E302C224074696D657374616D70223A22323032302D31312D32322031323A30303A3030222C226D6178223A332E302C225F76616C7565325F617667223A312E3333332C22686F737432223A2263222C22686F7374223A2262222C2263616C6331223A382E3333332C2263616C6332223A22323032302D31312D32322031323A30303A30302E3030302B30383A3030227D0A6060600A0A232320E4BDBFE794A8636F6C6C656374E8819AE59088E694B6E99B86E695B0E68DAE0A0A2D20E5BD936167674D6574686F64E4B8BA636F6C6C656374E697B6EFBC8CE99C80E8A681E68C87E5AE9AE694B6E99B86E79A84E5AD97E6AEB5E5908DE58897E8A1A8EFBC88636F6C6C6563744669656C644E616D6573EFBC890A2D20E58FAFE99990E588B6E694B6E99B86E69DA1E695B0EFBC886C696D6974436F756E74EFBC890A2D20E58FAFE68C87E5AE9AE694B6E99B86E7AD96E795A5EFBC88636F6C6C65637454797065EFBC89EFBC8CE4B88E6C696D6974436F756E74E4B880E8B5B7E4BDBFE794A8EFBC8CE58F96E5898DE5A49AE5B091E69DA1EFBC88746F70EFBC89EFBC8CE58F96E5908EE5A49AE5B091E69DA1EFBC88626F74746F6DEFBC89EFBC8CE99A8FE69CBAE58F96E5A49AE5B091E69DA1EFBC8872616E646F6DEFBC890A2D20E6A0B9E68DAEE7AA97E58FA3E58685E695B0E68DAEE9878FE5A4A7E5B08FEFBC8C636F6C6C656374E6938DE4BD9CE58FAFE883BDE4BC9AE6B688E88097E8BE83E5A4A7E58685E5AD98EFBC8CE4BDBFE794A8E697B6E8AFB7E8B0A8E6858EE8AF84E4BCB0E380820A0AE8BE93E585A5E695B0E68DAE0A6060600A7B22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A317D0A7B22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A327D0A7B22686F7374223A2262222C2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A327D0A7B22686F7374223A2262222C2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A337D0A0A6060600A0AE9858DE7BDAE0A0A6060600A7B0A20202277696E646F775479706522203A202274756D626C696E67222C0A20202277696E646F7753697A6522203A2036303030302C0A2020226167674465667322203A205B207B0A20202020226669656C644E616D6522203A2022436F6C6C65637431222C0A20202020226167674D6574686F6422203A2022636F6C6C656374222C0A2020202022636F6C6C6563744669656C644E616D657322203A205B202274696D65222C202276616C756522205D2C0A20202020226F75747075744669656C644E616D6522203A2022436F6C6C65637431220A20207D2C207B0A20202020226669656C644E616D6522203A2022436F6C6C65637432222C0A20202020226167674D6574686F6422203A2022636F6C6C656374222C0A2020202022636F6C6C6563744669656C644E616D657322203A205B202274696D65222C202276616C7565222C2022686F7374222C20226E6F744578697374656422205D2C0A20202020226C696D6974436F756E7422203A20312C0A2020202022636F6C6C6563745479706522203A2022746F70222C0A20202020226F75747075744669656C644E616D6522203A2022436F6C6C65637432220A20207D2C207B0A20202020226669656C644E616D6522203A2022436F6C6C65637433222C0A20202020226167674D6574686F6422203A2022636F6C6C656374222C0A2020202022636F6C6C6563744669656C644E616D657322203A205B202274696D65222C202276616C7565222C2022686F737422205D2C0A20202020226C696D6974436F756E7422203A20312C0A2020202022636F6C6C6563745479706522203A2022626F74746F6D222C0A20202020226F75747075744669656C644E616D6522203A2022436F6C6C65637433220A20207D2C207B0A20202020226669656C644E616D6522203A2022436F6C6C65637434222C0A20202020226167674D6574686F6422203A2022636F6C6C656374222C0A2020202022636F6C6C6563744669656C644E616D657322203A205B202274696D65222C202276616C7565222C2022686F737422205D2C0A20202020226C696D6974436F756E7422203A20332C0A2020202022636F6C6C6563745479706522203A202272616E646F6D222C0A20202020226F75747075744669656C644E616D6522203A2022436F6C6C65637434220A20207D205D2C0A20202267726F75704B65797322203A205B2022686F737422205D2C0A20202277696E646F7754696D65466F726D617422203A2022797979792D4D4D2D64642048483A6D6D3A7373220A7D0A6060600A0AE8BE93E587BA0A0A6060600A7B224074696D657374616D70223A22323032302D31312D32322031323A30303A3030222C22436F6C6C65637434223A5B7B22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A317D2C7B22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A327D5D2C22436F6C6C65637433223A5B7B22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A327D5D2C22436F6C6C65637432223A5B7B226E6F7445786973746564223A6E756C6C2C22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A317D5D2C22436F6C6C65637431223A5B7B2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A317D2C7B2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A327D5D2C22686F7374223A2261227D0A7B224074696D657374616D70223A22323032302D31312D32322031323A30303A3030222C22436F6C6C65637434223A5B7B22686F7374223A2262222C2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A327D2C7B22686F7374223A2262222C2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A337D5D2C22436F6C6C65637433223A5B7B22686F7374223A2262222C2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A337D5D2C22436F6C6C65637432223A5B7B226E6F7445786973746564223A6E756C6C2C22686F7374223A2262222C2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A327D5D2C22436F6C6C65637431223A5B7B2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A327D2C7B2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A337D5D2C22686F7374223A2262227D0A6060600A0A232320E4BDBFE794A8E8A1A8E8BEBEE5BC8FE8AEA1E7AE97E8819AE59088E5AD97E6AEB5E79A84E580BC0A0A2D20E9809AE8BF87E68C87E5AE9AE8819AE59088E5AD97E6AEB5E8A1A8E8BEBEE5BC8FEFBC886669656C64457870EFBC89E8AEA1E7AE97E5BE97E587BAE58F82E4B88EE8819AE59088E5AD97E6AEB5E79A84E580BC0A0AE8BE93E585A5E695B0E68DAE0A0A6060600A7B2276616C756532223A3130302C22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A317D0A7B2276616C756532223A3130302C22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A327D0A7B2276616C756532223A3130302C22686F7374223A2262222C2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A327D0A7B2276616C756532223A3130302C22686F7374223A2262222C2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A337D0A6060600A0AE9858DE7BDAE0A0A6060600A7B0A20202277696E646F775479706522203A202274756D626C696E67222C0A20202277696E646F7753697A6522203A2036303030302C0A202022736C6964696E6753697A6522203A206E756C6C2C0A2020226167674465667322203A205B207B0A20202020226669656C6445787022203A202276616C7565202B2076616C756532222C0A20202020226167674D6574686F6422203A202273756D222C0A202020202266696C74657245787022203A20225F5F76616C756542794578705F5F203E2030222C202F2F20E8BF87E6BBA4E697B6E58FAFE9809AE8BF87E789B9E6AE8AE58F98E9878FEFBC9A5F5F76616C756542794578705F5F20E5BC95E794A8E588B06669656C64457870E8AEA1E7AE97E5BE97E587BAE79A84E580BC0A20202020226F75747075744669656C644E616D6522203A20226678220A20207D205D2C0A20202267726F75704B65797322203A205B2022686F737422205D2C0A20202277696E646F7754696D65466F726D617422203A2022797979792D4D4D2D64642048483A6D6D3A7373220A7D0A6060600A0AE8BE93E587BA0A0A6060600A7B226678223A3230332E302C224074696D657374616D70223A22323032302D31312D32322031323A30303A3030222C22686F7374223A2261227D0A7B226678223A3230352E302C224074696D657374616D70223A22323032302D31312D32322031323A30303A3030222C22686F7374223A2262227D0A6060600A0A0A232320E8819AE59088E5AD97E6AEB5E79A84E580BCE58EBBE9878DE5908EE8819AE590880A0A2D20E8AEBEE7BDAEE698AFE590A6E58EBBE9878DE8AEA1E7AE97EFBC8864697374696E6374EFBC89E4B8BA74727565EFBC8CE5AFB9E4BA8EE7AA97E58FA3E58685E68980E69C89E8BE93E585A5E695B0E68DAEE8819AE59088E5AD97E6AEB5E79A84E580BCEFBC8CE58EBBE9878DE5908EE5868DE8819AE590880A0AE8BE93E585A5E695B0E68DAE0A0A6060600A7B2276616C756532223A3130302C22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A317D0A7B2276616C756532223A3130302C22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A327D0A7B2276616C756532223A3130302C22686F7374223A2262222C2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A327D0A7B2276616C756532223A3130302C22686F7374223A2262222C2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A337D0A6060600A0AE9858DE7BDAE0A0A6060600A7B0A20202277696E646F775479706522203A202274756D626C696E67222C0A20202277696E646F7753697A6522203A2036303030302C0A2020226167674465667322203A205B207B0A20202020226669656C644E616D6522203A202276616C756532222C0A20202020226167674D6574686F6422203A202273756D222C0A202020202264697374696E637422203A20747275652C0A20202020226F75747075744669656C644E616D6522203A202276616C7565325F64697374696E63745F73756D220A20207D2C207B0A20202020226669656C644E616D6522203A202276616C756532222C0A20202020226167674D6574686F6422203A2022636F756E74222C0A202020202264697374696E637422203A20747275652C0A20202020226F75747075744669656C644E616D6522203A202276616C7565325F64697374696E63745F636F756E74220A20207D2C207B0A20202020226669656C644E616D6522203A20226332222C0A20202020226167674D6574686F6422203A2022636F6C6C656374222C0A2020202022636F6C6C6563744669656C644E616D657322203A205B202276616C75653222205D2C0A202020202264697374696E637422203A20747275652C0A20202020226F75747075744669656C644E616D6522203A202276616C7565325F64697374696E63745F636F6C6C656374220A20207D205D2C0A20202267726F75704B65797322203A205B2022686F737422205D2C0A20202277696E646F7754696D65466F726D617422203A2022797979792D4D4D2D64642048483A6D6D3A7373220A7D0A6060600A0AE8BE93E587BA0A0A6060600A7B224074696D657374616D70223A22323032302D31312D32322031323A30303A3030222C2276616C7565325F64697374696E63745F636F6C6C656374223A5B7B2276616C756532223A3130307D5D2C22686F7374223A2261222C2276616C7565325F64697374696E63745F73756D223A3130302E302C2276616C7565325F64697374696E63745F636F756E74223A317D0A7B224074696D657374616D70223A22323032302D31312D32322031323A30303A3030222C2276616C7565325F64697374696E63745F636F6C6C656374223A5B7B2276616C756532223A3130307D5D2C22686F7374223A2262222C2276616C7565325F64697374696E63745F73756D223A3130302E302C2276616C7565325F64697374696E63745F636F756E74223A317D0A6060600A0A232320E8819AE59088E7AA97E58FA3E7B1BBE59E8BE5928CE887AAE5AE9AE4B989E8A7A6E58F91E599A8636F756E740A0A2D20E5BD93E7AA97E58FA3E7B1BBE59E8BE4B8BA676C6F62616CE697B6EFBC8CE99C80E8A681E887AAE5AE9AE4B989E8A7A6E58F91E599A8EFBC8CE590A6E58899E7AA97E58FA3E6B0B8E8BF9CE4B88DE8A7A6E58F910A0AE4B88BE99DA2E6A0B7E4BE8BE4BBA5676C6F62616C2077696E646F7720E58AA020636F756E742074726967676572E4B8BAE4BE8BEFBC9A0A0A2D20747269676765724D6178436F756E74EFBC9A20E7AA97E58FA3E58685E695B0E68DAE636F756E74E695B0E5A4A7E4BA8EE7AD89E4BA8EE6ADA4E69C80E5A4A7E580BCE697B6E7AA97E58FA3E8A2ABE8A7A6E58F910A0AE8BE93E585A5E695B0E68DAE0A0A6060600A7B22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A317D0A7B22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A327D0A7B22686F7374223A2262222C2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A327D0A7B22686F7374223A2262222C2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A337D0A6060600A0AE9858DE7BDAE0A0A6060600A7B0A20202277696E646F775479706522203A2022676C6F62616C222C0A202022747269676765725479706522203A2022636F756E74222C0A20202274726967676572526573756C745479706522203A2022464952455F414E445F5055524745222C0A202022747269676765724D6178436F756E7422203A20312C0A2020226167674465667322203A205B207B0A20202020226669656C644E616D6522203A202276616C7565222C0A20202020226167674D6574686F6422203A2022636F756E74222C0A202020202264697374696E637422203A2066616C73652C0A20202020226F75747075744669656C644E616D6522203A202276616C7565220A20207D205D2C0A20202267726F75704B65797322203A205B2022686F737422205D0A7D0A6060600A0AE8BE93E587BA0A0A6060600A7B22686F7374223A2261222C2276616C7565223A317D0A7B22686F7374223A2261222C2276616C7565223A317D0A7B22686F7374223A2262222C2276616C7565223A317D0A7B22686F7374223A2262222C2276616C7565223A317D0A6060600A0A232320E8819AE59088E7AA97E58FA3E7B1BBE59E8BE5928CE887AAE5AE9AE4B989E8A7A6E58F91E599A864656C74610A0AE4B88BE99DA2E6A0B7E4BE8BE4BBA574756D626C696E672077696E646F7720E58AA02064656C74612074726967676572E4B8BAE4BE8BEFBC9A0A0AE8BE93E585A5E695B0E68DAE0A0A6060600A7B22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A317D0A7B22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A327D0A7B22686F7374223A2262222C2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A327D0A7B22686F7374223A2262222C2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A337D0A6060600A0AE9858DE7BDAE0A0A2D207472696767657244656C746156616C75654669656C6420EFBC9A20E6AF94E8BE83E580BCE5AD97E6AEB5E5908DEFBC8CE99C80E4B8BA646F75626C65E7B1BBE59E8B0A2D207472696767657244656C7461457870EFBC9AE99888E580BCE8AEA1E7AE97E8A1A8E8BEBEE5BC8FEFBC8CE6ADA4E8A1A8E8BEBEE5BC8FE58685E58FAFE4BBA5E4BDBFE794A8E58F98E9878FE4B8BA6F6C6456616C7565EFBC88E4B88AE4B880E69DA1E695B0E68DAEE79A8464656C7461E6AF94E8BE83E580BCEFBC89E5928C206E657756616C7565EFBC88E69CACE69DA1E695B0E68DAEE79A8464656C7461E6AF94E8BE83E580BCEFBC893BE4BE8BE5A682EFBC9A6E657756616C7565202D206F6C6456616C75652A322E3520EFBC8CE9809AE8BF87E6ADA4E8A1A8E8BEBEE5BC8FE8AEA1E7AE97E5BE97E587BA64656C7461E99888E580BC0A2D207472696767657244656C74615468726573686F6C64EFBC9AE8A7A6E58F91E99888E580BCEFBC8CE9809AE8BF877472696767657244656C7461457870E8AEA1E7AE97E580BCE5A4A7E4BA8EE6ADA4E99888E580BCE697B6E7AA97E58FA3E8A2ABE8A7A6E58F910A0A0A6060600A7B0A20202277696E646F775479706522203A202274756D626C696E67222C0A202022747269676765725479706522203A202264656C7461222C0A20202274726967676572526573756C745479706522203A202246495245222C0A2020227472696767657244656C746156616C75654669656C6422203A202276616C7565222C0A2020227472696767657244656C746145787022203A20226E657756616C7565202D206F6C6456616C7565222C0A2020227472696767657244656C74615468726573686F6C6422203A20302E392C0A20202277696E646F7753697A6522203A2036303030302C0A2020226167674465667322203A205B207B0A20202020226669656C644E616D6522203A202276616C7565222C0A20202020226167674D6574686F6422203A2022636F756E74222C0A202020202264697374696E637422203A2066616C73652C0A20202020226F75747075744669656C644E616D6522203A202276616C7565220A20207D205D2C0A20202267726F75704B65797322203A205B2022686F737422205D2C0A20202277696E646F7754696D65466F726D617422203A2022797979792D4D4D2D64642048483A6D6D3A7373220A7D0A6060600A0AE8BE93E587BA0A0A6060600A7B224074696D657374616D70223A22323032302D31312D32322031323A30303A3030222C22686F7374223A2261222C2276616C7565223A327D0A7B224074696D657374616D70223A22323032302D31312D32322031323A30303A3030222C22686F7374223A2262222C2276616C7565223A327D0A6060600A0A232320E8819AE59088E7AA97E58FA3E7B1BBE59E8BE5928CE887AAE5AE9AE4B989E8A7A6E58F91E599A820E8A1A8E8BEBEE5BC8F0A0AE4B88BE99DA2E6A0B7E4BE8BE4BBA574756D626C696E672077696E646F7720E58AA02045787072657373696F6E2074726967676572E4B8BAE4BE8BEFBC9A0A0AE8BE93E585A5E695B0E68DAE0A0A6060600A7B22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A317D0A7B22686F7374223A2261222C2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A327D0A7B22686F7374223A2262222C2274696D65223A22323032302D31312D32322031323A30303A3030222C2276616C7565223A327D0A7B22686F7374223A2262222C2274696D65223A22323032302D31312D32322031323A30303A3031222C2276616C7565223A337D0A6060600A0AE9858DE7BDAE0A0A2D207472696767657245787072657373696F6E20EFBC9AE9809AE8BF87E6ADA4E8A1A8E8BEBEE5BC8FE4BB8E6D6170E695B0E68DAEE4B8ADE8AEA1E7AE97E5BE97E587BA626F6F6C65616EE580BCEFBC8CE5A682E69E9CE4B8BA74727565E697B6E7AA97E58FA3E8A2ABE8A7A6E58F910A0A6060600A7B0A20202277696E646F775479706522203A202274756D626C696E67222C0A202022747269676765725479706522203A202265787072657373696F6E222C0A20202274726967676572526573756C745479706522203A2022464952455F414E445F5055524745222C0A2020227472696767657245787072657373696F6E22203A202276616C7565203E3D2032222C0A20202277696E646F7753697A6522203A2036303030302C0A2020226167674465667322203A205B207B0A20202020226669656C644E616D6522203A202276616C7565222C0A20202020226167674D6574686F6422203A2022636F756E74222C0A202020202264697374696E637422203A2066616C73652C0A20202020226F75747075744669656C644E616D6522203A202276616C7565220A20207D205D2C0A20202267726F75704B65797322203A205B2022686F737422205D2C0A20202277696E646F7754696D65466F726D617422203A2022797979792D4D4D2D64642048483A6D6D3A7373220A7D0A6060600A0AE8BE93E587BA0A0A6060600A7B224074696D657374616D70223A22323032302D31312D32322031323A30303A3030222C22686F7374223A2261222C2276616C7565223A327D0A7B224074696D657374616D70223A22323032302D31312D32322031323A30303A3030222C22686F7374223A2262222C2276616C7565223A317D0A7B224074696D657374616D70223A22323032302D31312D32322031323A30303A3030222C22686F7374223A2262222C2276616C7565223A317D0A6060600A0AE5A682E69E9CE7AA97E58FA3E8A7A6E58F91E58AA8E4BD9CE4BB8E464952455F414E445F5055524745E694B9E4B8BA464952450A0A6060600A2274726967676572526573756C745479706522203A202246495245222C0A6060600A0AE58899E8BE93E587BAE4B8BA0A0A6060600A7B224074696D657374616D70223A22323032302D31312D32322031323A30303A3030222C22686F7374223A2261222C2276616C7565223A327D0A7B224074696D657374616D70223A22323032302D31312D32322031323A30303A3030222C22686F7374223A2262222C2276616C7565223A317D0A7B224074696D657374616D70223A22323032302D31312D32322031323A30303A3030222C22686F7374223A2262222C2276616C7565223A327D0A606060, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313630383038373830383938332220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22343532352220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D35313220323732632D3133322E3520302D323430203130372E352D32343020323430733130372E35203234302032343020323430203234302D3130372E35203234302D3234302D3130372E352D3234302D3234302D3234307A206D3020333336632D353320302D39362D34332D39362D39367334332D39362039362D39362039362034332039362039362D34332039362D39362039367A4D3331362E34203731372E346C2D35342E38203230342E34632D312E3620352E392D3920372E392D31332E3420332E366C2D34302E392D34302E39632D362E322D362E322D31362E342D362E322D32322E3620304C35312E3120313031382E32632D332E3120332E312D382E3220332E312D31312E3320306C2D33342D33332E39632D332E312D332E312D332E312D382E3220302D31312E336C3133332E372D3133332E3763362E322D362E3220362E322D31362E3420302D32322E366C2D34302E392D34302E39632D342E342D342E342D322E342D31312E3820332E362D31332E346C3230342E342D35342E3863362D312E362031312E3420332E3820392E3820392E387A4D313031382E32203938342E336C2D33332E392033332E39632D332E3120332E312D382E3220332E312D31312E3320304C3833392E32203838342E35632D362E322D362E322D31362E342D362E322D32322E3620306C2D34302E392034302E39632D342E3420342E342D31312E3820322E342D31332E342D332E366C2D35342E382D3230342E34632D312E362D352E3920332E382D31312E3420392E382D392E386C3230342E342035342E3863352E3920312E3620372E39203920332E362031332E346C2D34302E392034302E39632D362E3220362E322D362E322031362E3420302032322E364C313031382E312039373363332E3220332E3120332E3220382E3120302E312031312E337A4D39382E36203234382E316C34302E392D34302E3963362E322D362E3220362E322D31362E3420302D32322E364C352E382035302E39632D332E312D332E312D332E312D382E3220302D31312E334C33392E3720352E3763332E312D332E3120382E322D332E312031312E3320306C3133332E37203133332E3763362E3220362E322031362E3420362E322032322E3620306C34302E392D34302E3963342E342D342E342031312E382D322E342031332E3420332E366C35342E38203230342E3463312E3620352E392D332E382031312E342D392E3820392E386C2D3230342E342D35342E37632D352E392D312E372D372E392D392E312D332E362D31332E357A4D3838342E35203230372E336C34302E392034302E3963342E3420342E3420322E342031312E382D332E362031332E346C2D3230342E342035342E37632D352E3920312E362D31312E342D332E382D392E382D392E386C35342E382D3230342E3463312E362D352E3920392D372E392031332E342D332E366C34302E392034302E3963362E3220362E322031362E3420362E322032322E3620304C3937322E3920352E3763332E312D332E3120382E322D332E312031312E3320306C33332E392033332E3963332E3120332E3120332E3120382E3220302031312E334C3838342E35203138342E36632D362E3320362E332D362E332031362E3420302032322E377A2220702D69643D2234353236223E3C2F706174683E3C7061746820643D224D353132203531326D2D3332203061333220333220302031203020363420302033322033322030203120302D363420305A2220702D69643D2234353237223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.sink.ElasticSearchSinkJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.sink.ElasticSearchSinkJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":null,\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"ElasticSearchSinkJob\",\"type\":\"streaming\",\"role\":\"sink\",\"category\":\"\",\"display\":\"Elasticsearch_1.9\",\"description\":\"该job是来配置es写入的flink job\",\"doc\":\"ElasticSearchSinkJob.md\",\"icon\":\"ElasticSearchSinkJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"esNodes\",\"label\":\"es地址列表\",\"type\":[\"LIST\"],\"description\":\"es节点列表,格式为host1:9200。支持前缀schema,如https://host3:port3。\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":{\"apiVersion\":0,\"name\":null,\"label\":null,\"type\":[\"STRING\"],\"description\":null,\"optional\":false,\"defaultValue\":null,\"placeholder\":null,\"candidates\":null,\"inputType\":null,\"range\":null,\"regex\":null,\"order\":0,\"requireCondition\":null,\"availableCondition\":null,\"listParameter\":null,\"objectParameters\":null},\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"indexPattern\",\"label\":\"index pattern\",\"type\":[\"STRING\"],\"description\":\"写入es的索引模式,支持按照时间以及提取数据内的字段作为索引名,例如 jax_%{+yyyy-MM-dd}_%{field}, 动态字段需要以 %{}包含,包含+的为日期,否则为字段提取\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"indexType\",\"label\":\"index type\",\"type\":[\"STRING\"],\"description\":\"针对es7.x版本, 该字段必填, 而且只能为\'_doc\'; 针对es6.x以及以下版本, 该字段必填(不可为_doc), 用户可以自定义\",\"optional\":true,\"defaultValue\":\"_doc\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"bulkActions\",\"label\":\"单批写入最大记录条数\",\"type\":[\"INT\"],\"description\":\"批量提交到es的记录条数条件,注意es的批处理条件包含:记录数,大小,以及时间间隔,三个条件只要有一个满足,就会提交到es。\",\"optional\":true,\"defaultValue\":\"1500\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"bulkSize\",\"label\":\"单批写入最大大小\",\"type\":[\"INT\"],\"description\":\"批量提交到es的记录大小条件(单位MB),注意es的批处理条件包含:记录数,大小,以及时间间隔,三个条件只要有一个满足,就会提交到es。\",\"optional\":true,\"defaultValue\":\"10\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"flushInterval\",\"label\":\"Flush的最大时间间隔(毫秒)\",\"type\":[\"INT\"],\"description\":\"批量提交到es的时间间隔条件(单位毫秒),注意es的批处理条件包含:记录数,大小,以及时间间隔,三个条件只要有一个满足,就会提交到es。\",\"optional\":true,\"defaultValue\":\"1000\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"docIdField\",\"label\":\"Doc ID的字段\",\"type\":[\"STRING\"],\"description\":\"用来实现相同id的doc更新操作\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"header\",\"label\":\"http header\",\"type\":[\"MAP\"],\"description\":\"http header,如果es设定了安全策略,可以利用该参数设定对应的token。如果安全策略选择的是华为平台的kerberos,需要加上connection:close配置\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"requestTimeout\",\"label\":\"请求es超时时间(毫秒)\",\"type\":[\"INT\"],\"description\":\"请求es超时时间,默认为60000\",\"optional\":true,\"defaultValue\":\"60000\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"flushBackOffEnable\",\"label\":\"是否启用Flush backoff\",\"type\":[\"BOOL\"],\"description\":\"根据flink es connector的issue:https://issues.apache.org/jira/browse/FLINK-11046 ,可设置bulk.flush.backoff.enable: false,作为workaround\",\"optional\":true,\"defaultValue\":\"false\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"backoffType\",\"label\":\"Flush backoff类型\",\"type\":[\"STRING\"],\"description\":\"间隔为固定时间(CONSTANT)间隔时间为指数级增长(EXPONENTIAL)\",\"optional\":true,\"defaultValue\":\"CONSTANT\",\"placeholder\":\"\",\"candidates\":[\"CONSTANT\",\"EXPONENTIAL\"],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"flushBackOffEnable == true\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"backoffRetries\",\"label\":\"Flush backoff重试次数\",\"type\":[\"INT\"],\"description\":\"Flush backoff重试次数\",\"optional\":true,\"defaultValue\":\"10000\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"flushBackOffEnable == true\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"backoffDelay\",\"label\":\"Flush backoff延迟\",\"type\":[\"INT\"],\"description\":\"Flush backoff延迟\",\"optional\":true,\"defaultValue\":\"60000\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"flushBackOffEnable == true\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"authEnable\",\"label\":\"是否开启es安全认证机制\",\"type\":[\"BOOL\"],\"description\":\"是否开启es安全认证机制?默认为false,如果设置为true,需要提供auth.user以及auth.password\",\"optional\":true,\"defaultValue\":\"false\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"authUser\",\"label\":\"访问es用户名\",\"type\":[\"STRING\"],\"description\":\"访问es用户名\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"authEnable == true\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"authPassword\",\"label\":\"访问es用户密码\",\"type\":[\"STRING\"],\"description\":\"访问es用户密码\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"PASSWORD\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"authEnable == true\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"shouldThrowExMessages\",\"label\":\"es异常黑名单\",\"type\":[\"LIST\"],\"description\":\"es写入失败的error message包含字符串,则直接报出异常,不继续任务\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":{\"apiVersion\":0,\"name\":null,\"label\":null,\"type\":[\"STRING\"],\"description\":null,\"optional\":false,\"defaultValue\":null,\"placeholder\":null,\"candidates\":null,\"inputType\":null,\"range\":null,\"regex\":null,\"order\":0,\"requireCondition\":null,\"availableCondition\":null,\"listParameter\":null,\"objectParameters\":null},\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"timeFieldName\",\"label\":\"时间字段\",\"type\":[\"STRING\"],\"description\":\"通过时间字段设置带日期的index名;如果index pattern里有日期变量则必填\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"timeFormat\",\"label\":\"时间格式\",\"type\":[\"STRING\"],\"description\":\"支持UNIX_S, UNIX_MS以及通用时间表达格式;如果指定时间字段则必填\",\"optional\":true,\"defaultValue\":\"UNIX_MS\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"timeLocale\",\"label\":\"输入时间格式方言\",\"type\":[\"STRING\"],\"description\":\"支持用户设定时间方言,默认的时区为: en-US,可选的时区参见列表: https://www.andiamo.co.uk/resources/iso-language-codes\",\"optional\":true,\"defaultValue\":\"en-US\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"kerberosKeytab\",\"label\":\"keytab路径\",\"type\":[\"STRING\"],\"description\":\"kerberos认证访问的es的keytab路径\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"kerberosPrincipal\",\"label\":\"principal名称\",\"type\":[\"STRING\"],\"description\":\"kerberos认证访问的es的principal名称,例如tss@HADOOP.COM\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'sink', '', 0x2320E695B0E68DAEE8BE93E587BAE588B0456C61737469637365617263680A0AE9809AE8BF87E9858DE7BDAE456C61737469637365617263682073696E6BE79A84E58F82E695B0EFBC8CE68A8AE695B0E68DAEE8BE93E587BAE588B0E68EA5E585A5E68C87E5AE9A696E6465780A0AE68EA5E585A5E695B0E68DAEE4B8BA604D61703C537472696E672C4F626A6563743E60E7B1BBE59E8B0A0AE4BE8BE5A682E9858DE7BDAEE58F82E695B0E5A682E4B88BEFBC9A0A0A2D20E585B6E4B8AD696E646578E5908DE5AD97EFBC9A656F695F746573745F257B2B797979795F4D4D5F64647DEFBC8C20E697A5E69C9FE58F98E9878FE4BC9AE6A0B9E68DAEE697B6E997B4E5AD97E6AEB5EFBC8874696D654669656C644E616D65EFBC89E69DA5E58AA8E68081E8B58BE580BCEFBC8CE4B99FE7A1AEE4BF9DE697B6E997B4E6A0BCE5BC8FE68C87E5AE9AE6ADA3E7A1AEEFBC8874696D65466F726D6174EFBC890A2D20E5A682E69E9CE68C87E5AE9A646F6349644669656C64EFBC8CE58899E4B8BAE68C89646F634964E69BB4E696B0E6A8A1E5BC8FEFBC8CE6B3A8E6848F656C6173746963736561726368E59CA8E5A4A7E9878FE695B0E68DAEE69BB4E696B0E68385E586B5E4B88BE680A7E883BDE4BC9AE5BFABE9809FE4B88BE9998DE380820A0A6060600A7B0A202022646F6349644669656C6422203A20226964222C0A20202262756C6B53697A6522203A2031302C0A20202265734E6F64657322203A205B20226C6F63616C686F73743A3932303022205D2C0A202022696E6465785479706522203A20225F646F63222C0A20202274696D654669656C644E616D6522203A202274696D65222C0A20202274696D65466F726D617422203A2022797979792D4D4D2D64642048483A6D6D3A7373222C0A20202262756C6B416374696F6E7322203A2031303030302C0A202022696E6465785061747465726E22203A2022656F695F746573745F257B2B797979795F4D4D5F64647D220A7D0A6060600A0AE4BBA5E4B88BE5B8B8E794A8E79A84E9858DE7BDAEE58F82E695B0EFBC9A0A0A7C206E616D65207C206C6162656C207C2074797065207C206F7074696F6E616C207C2064656661756C742076616C7565207C206465736372697074696F6E207C0A7C203A2D2D2D207C203A2D2D2D2D207C203A2D2D2D207C203A2D2D2D2D2D2D3A207C203A2D2D2D2D2D2D2D2D2D2D2D3A207C203A2D2D2D2D2D2D2D2D2D2D207C0A7C20696E6465785061747465726E207C20696E646578207061747465726E207C20737472696E67207C2066616C7365207C20207C20E58699E585A56573E79A84E7B4A2E5BC95E6A8A1E5BC8FEFBC8CE694AFE68C81E68C89E785A7E697B6E997B4E4BBA5E58F8AE68F90E58F96E695B0E68DAEE58685E79A84E5AD97E6AEB5E4BD9CE4B8BAE7B4A2E5BC95E5908DEFBC8CE4BE8BE5A682206A61785F257B2B797979792D4D4D2D64647D5F257B6669656C647D2C20E58AA8E68081E5AD97E6AEB5E99C80E8A681E4BBA520257B7DE58C85E590ABEFBC8CE58C85E590AB2BE79A84E4B8BAE697A5E69C9FEFBC8CE590A6E58899E4B8BAE5AD97E6AEB5E68F90E58F96207C0A7C20696E64657854797065207C20696E6465782074797065207C20737472696E67207C2074727565207C20207C20E99288E5AFB96573372E78E78988E69CAC2C20E8AFA5E5AD97E6AEB5E5BF85E5A1AB2C20E8808CE4B894E58FAAE883BDE4B8BA275F646F63273B20E99288E5AFB96573362E78E4BBA5E58F8AE4BBA5E4B88BE78988E69CAC2C20E8AFA5E5AD97E6AEB5E5BF85E5A1AB2C20E794A8E688B7E58FAFE4BBA5E887AAE5AE9AE4B989207C0A7C2065734E6F646573207C2065732068747470E88A82E782B9E58897E8A1A8207C206C6973742C737472696E67207C2074727565207C206C6F63616C686F73743A39323030207C206573E88A82E782B9E58897E8A1A8EFBC8CE6A0BCE5BC8FE4B8BA686F7374313A393230302C686F7374323A393230302C686F7374333A706F727433EFBC8CE9BB98E8AEA4E4B8BA6C6F63616C686F73743A39323030E38082E694AFE68C81E5898DE7BC80736368656D61EFBC8CE5A68268747470733A2F2F686F7374333A706F727433E38082207C0A7C206D6178416374696F6E73207C20E58D95E689B9E58699E585A5E69C80E5A4A7E8AEB0E5BD95E69DA1E695B0207C20696E74207C2074727565207C2031353030207C20E689B9E9878FE68F90E4BAA4E588B06573E79A84E8AEB0E5BD95E69DA1E695B0E69DA1E4BBB6EFBC8CE6B3A8E6848F6573E79A84E689B9E5A484E79086E69DA1E4BBB6E58C85E590ABEFBC9AE8AEB0E5BD95E695B0EFBC8CE5A4A7E5B08FEFBC8CE4BBA5E58F8AE697B6E997B4E997B4E99A94EFBC8CE4B889E4B8AAE69DA1E4BBB6E58FAAE8A681E69C89E4B880E4B8AAE6BBA1E8B6B3EFBC8CE5B0B1E4BC9AE68F90E4BAA4E588B06573E38082207C0A7C206D617853697A65207C20E58D95E689B9E58699E585A5E69C80E5A4A7E5A4A7E5B08F207C20696E74207C2074727565207C203130207C20E689B9E9878FE68F90E4BAA4E588B06573E79A84E8AEB0E5BD95E5A4A7E5B08FE69DA1E4BBB628E58D95E4BD8D4D4229EFBC8CE6B3A8E6848F6573E79A84E689B9E5A484E79086E69DA1E4BBB6E58C85E590ABEFBC9AE8AEB0E5BD95E695B0EFBC8CE5A4A7E5B08FEFBC8CE4BBA5E58F8AE697B6E997B4E997B4E99A94EFBC8CE4B889E4B8AAE69DA1E4BBB6E58FAAE8A681E69C89E4B880E4B8AAE6BBA1E8B6B3EFBC8CE5B0B1E4BC9AE68F90E4BAA4E588B06573E38082207C0A7C20666C757368496E74657276616C207C20466C757368E79A84E69C80E5A4A7E697B6E997B4E997B4E99A9428E6AFABE7A79229207C20696E74207C2074727565207C2031303030207C20E689B9E9878FE68F90E4BAA4E588B06573E79A84E697B6E997B4E997B4E99A94E69DA1E4BBB628E58D95E4BD8DE6AFABE7A79229EFBC8CE6B3A8E6848F6573E79A84E689B9E5A484E79086E69DA1E4BBB6E58C85E590ABEFBC9AE8AEB0E5BD95E695B0EFBC8CE5A4A7E5B08FEFBC8CE4BBA5E58F8AE697B6E997B4E997B4E99A94EFBC8CE4B889E4B8AAE69DA1E4BBB6E58FAAE8A681E69C89E4B880E4B8AAE6BBA1E8B6B3EFBC8CE5B0B1E4BC9AE68F90E4BAA4E588B06573E38082207C0A7C20666C7573684261636B4F6666456E61626C65207C20E698AFE590A6E590AFE794A8466C757368206261636B6F6666207C20626F6F6C65616E207C2074727565207C2066616C7365207C20E698AFE590A6E590AFE794A8466C757368206261636B6F6666207C0A7C206261636B6F666654797065207C20466C757368206261636B6F6666E7B1BBE59E8B207C20737472696E67207C2074727565207C20434F4E5354414E54207C20466C757368206261636B6F6666E7B1BBE59E8B207C0A7C206261636B6F666652657472696573207C20466C757368206261636B6F6666E9878DE8AF95E6ACA1E695B0207C20696E74207C2074727565207C203130303030207C20466C757368206261636B6F6666E9878DE8AF95E6ACA1E695B0207C0A7C206261636B6F666644656C6179207C20466C757368206261636B6F6666E5BBB6E8BF9F207C20696E74207C2074727565207C203630303030207C20466C757368206261636B6F6666E5BBB6E8BF9F207C0A7C20646F6349644669656C64207C20446F63204944E79A84E5AD97E6AEB5207C20737472696E67207C2074727565207C20207C20446F63204944E79A84E5AD97E6AEB5207C0A7C20686561646572207C206874747020686561646572207C204D4150207C2074727565207C20207C206874747020686561646572EFBC8CE5A682E69E9C6573E8AEBEE5AE9AE4BA86E5AE89E585A8E7AD96E795A5EFBC8CE58FAFE4BBA5E588A9E794A8E8AFA5E58F82E695B0E8AEBEE5AE9AE5AFB9E5BA94E79A84746F6B656E207C0A7C207265717565737454696D656F7574207C20E8AFB7E6B1826573E8B685E697B6E697B6E997B4207C20737472696E67207C2074727565207C203630303030207C20E8AFB7E6B1826573E8B685E697B6E697B6E997B4EFBC8CE9BB98E8AEA4E4B8BA31E58886E9929F207C0A7C2061757468456E61626C65207C20E698AFE590A6E5BC80E590AF6573E5AE89E585A8E8AEA4E8AF81E69CBAE588B6207C20626F6F6C65616E207C2074727565207C2066616C7365207C20E698AFE590A6E5BC80E590AF6573E5AE89E585A8E8AEA4E8AF81E69CBAE588B6EFBC9FE9BB98E8AEA4E4B8BA66616C7365EFBC8CE5A682E69E9CE8AEBEE7BDAEE4B8BA74727565EFBC8CE99C80E8A681E68F90E4BE9B617574682E75736572E4BBA5E58F8A617574682E70617373776F7264207C0A7C206175746855736572207C20E8AEBFE997AE6573E794A8E688B7E5908D207C20737472696E67207C2074727565207C20207C20E8AEBFE997AE6573E794A8E688B7E5908D207C0A7C206175746850617373776F7264207C20E8AEBFE997AE6573E794A8E688B7E5AF86E7A081207C20737472696E67207C2074727565207C20207C20E8AEBFE997AE6573E794A8E688B7E5AF86E7A081207C0A7C2073686F756C645468726F7745784D65737361676573207C206573E5BC82E5B8B8E9BB91E5908DE58D95207C206C697374207C2074727565207C20207C206573E58699E585A5E5A4B1E8B4A5E79A846572726F72206D657373616765E58C85E590ABE5AD97E7ACA6E4B8B2EFBC8CE58899E79BB4E68EA5E68AA5E587BAE5BC82E5B8B8EFBC8CE4B88DE7BBA7E7BBADE4BBBBE58AA1EFBC9B20E5A49AE4B8AAE794A8E98097E58FB7E58886E99A94207C0A7C2074696D654669656C644E616D65207C20E697B6E997B4E5AD97E6AEB5207C20737472696E67207C2074727565207C204074696D657374616D70207C20E9809AE8BF87E697B6E997B4E5AD97E6AEB5E8AEBEE7BDAEE5B8A6E697A5E69C9FE79A84696E646578E5908D3BE5A682E69E9C696E646578207061747465726EE9878CE69C89E697A5E69C9FE58F98E9878FE58899E5BF85E5A1AB207C0A7C2074696D65466F726D6174207C20E697B6E997B4E6A0BCE5BC8F207C20737472696E67207C2074727565207C20554E49585F4D53207C20E694AFE68C81554E49585F532C20554E49585F4D53E4BBA5E58F8AE9809AE794A8E697B6E997B4E8A1A8E8BEBEE6A0BCE5BC8F3BE5A682E69E9CE68C87E5AE9AE697B6E997B4E5AD97E6AEB5E58899E5BF85E5A1AB207C0A7C2074696D654C6F63616C65207C20E697B6E997B4E6A0BCE5BC8FE696B9E8A880207C20737472696E67207C2074727565207C20656E2D5553207C20E694AFE68C81E794A8E688B7E8AEBEE5AE9AE697B6E997B4E696B9E8A880EFBC8CE9BB98E8AEA4E79A84E697B6E58CBAE4B8BA3A20656E2D5553EFBC8CE58FAFE98089E79A84E697B6E58CBAE58F82E8A781E58897E8A1A83A2068747470733A2F2F7777772E616E6469616D6F2E636F2E756B2F7265736F75726365732F69736F2D6C616E67756167652D636F646573207C0A, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313630383031353930303338362220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22323631352220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3438302E383533333333203636342E3734363636374836382E363933333333413530332E383933333333203530332E3839333333332030203020312034352E3635333333332035313263302D35332E33333333333320372E36382D3130342E3533333333332032332E30342D3135322E373436363637683637362E363933333334413135322E3332203135322E3332203020302031203839382E31333333333320353132613135312E383933333333203135312E3839333333332030203020312D3135312E343636363636203135322E3734363636377A206D2D31392E322035312E324838372E343636363637613530332E343636363637203530332E343636363637203020302030203138372E333036363636203232312E303133333333413530332E343636363637203530332E343636363637203020302030203535342E36363636363720313032312E303133333333633137372E3036363636372030203333312E3934363636372D39302E343533333333203432332E36382D3232362E313333333333613235392E343133333333203235392E3431333333332030203020302D3138352E362D37392E33367A206D3333312E3039333333342D3430372E3436363636376337322E3533333333332030203133382E3636363636372D33302E3732203138352E362D37382E393333333333413531302E323933333333203531302E3239333333332030203020302038372E343636363637203330382E3438683337322E3930363636367A2220702D69643D2232363136223E3C2F706174683E3C2F7376673E, 'flink-job-1_9_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.sink.FileSinkJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.sink.FileSinkJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":null,\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"FileSinkJob\",\"type\":\"streaming\",\"role\":\"sink\",\"category\":\"\",\"display\":\"输出文件到HDFS或文件系统_1.9\",\"description\":\"输出json或csv格式文件到HDFS或文件系统\",\"doc\":\"FileSinkJob.md\",\"icon\":\"FileSinkJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"basePath\",\"label\":\"存储路径\",\"type\":[\"STRING\"],\"description\":\"存储进文件的路径,如:hdfs://192.168.31.133:9000/tmp/json\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"bucketFormatString\",\"label\":\"存储文件的周期\",\"type\":[\"STRING\"],\"description\":\"存储文件的周期,在每个周期里会生成一目录, \\n例如:分钟(yyyyMMddHHmm), 小时(yyyyMMddHH), 天(yyyyMMdd), 此处时间为服务器当前时间,并非事件时间\",\"optional\":true,\"defaultValue\":\"yyyyMMddHH\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"fields\",\"label\":\"字段列表\",\"type\":[\"LIST\"],\"description\":\"存储的字段列表\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":{\"apiVersion\":0,\"name\":null,\"label\":null,\"type\":[\"STRING\"],\"description\":null,\"optional\":false,\"defaultValue\":null,\"placeholder\":null,\"candidates\":null,\"inputType\":null,\"range\":null,\"regex\":null,\"order\":0,\"requireCondition\":null,\"availableCondition\":null,\"listParameter\":null,\"objectParameters\":null},\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"dataFormat\",\"label\":\"数据存储格式\",\"type\":[\"STRING\"],\"description\":\"数据存储格式\",\"optional\":true,\"defaultValue\":\"json\",\"placeholder\":\"\",\"candidates\":[\"json\",\"csv\"],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"maxPartSize\",\"label\":\"文件最大size(MB)\",\"type\":[\"LONG\"],\"description\":\"[rolling policy]单位MB\",\"optional\":true,\"defaultValue\":\"128\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"rolloverInterval\",\"label\":\"文件滚动最大时间(毫秒)\",\"type\":[\"LONG\"],\"description\":\"[rolling policy]从文件创建时间开始,超过最大时间就会滚动,单位毫秒\",\"optional\":true,\"defaultValue\":\"60000\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"inactivityInterval\",\"label\":\"文件闲置最大时间(毫秒)\",\"type\":[\"LONG\"],\"description\":\"[rolling policy]从文件更新时间开始,超过最大时间就会滚动,单位毫秒\",\"optional\":true,\"defaultValue\":\"60000\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'sink', '', 0x2320E695B0E68DAEE8BE93E587BAE588B0E69687E4BBB6E7B3BBE7BB9F0A0A2D20E9809AE8BF87E9858DE7BDAE46696C652073696E6BE79A84E58F82E695B0EFBC8CE68A8AE695B0E68DAEE8BE93E587BAE588B0E68EA5E585A5E68C87E5AE9AE69687E4BBB6E7B3BBE7BB9FEFBC9B0A2D20E694AFE68C81E69CACE59CB0E69687E4BBB6E6889668646673EFBC9B0A2D20E58699E585A5E695B0E68DAEE6A0BCE5BC8FE694AFE68C816A736F6EE68896637376E6A0BCE5BC8FEFBC9B0A0A232320E9878DE8A681E68F90E7A4BA0A2D20636865636B706F696E74E5BF85E9A1BBE590AFE794A80A2D20E6ADA3E59CA8E58699E585A5E69CAAE5BD92E6A1A3E79A84E69687E4BBB6E69C892E696E70726F6772657373E5908EE7BC80EFBC8CE58FAAE69C89E59CA8636865636B706F696E74E68890E58A9FE5908EE698AFE6898DE4BC9AE58EBBE68E89E6ADA4E5908EE7BC80EFBC8CE68890E58A9FE5BD92E6A1A3E69687E4BBB60A2D20E6898BE58AA8E588A0E999A42E696E70726F6772657373E69687E4BBB6E4BC9AE5AFBCE887B42046696C6520646F6573206E6F74206578697374E5BC82E5B8B80A0A232320E9858DE7BDAEE58F82E695B0E5A682E4B88B0A0A2D206261736550617468EFBC9A20E69687E4BBB6E8BE93E587BAE79A84E8B7AFE5BE84EFBC8CE5A682EFBC9A686466733A2F2F3139322E3136382E33312E3133333A393030302F746D700A2D206669656C6473EFBC9AE68C87E5AE9AE8BE93E587BAE5AD97E6AEB5E5908DE58897E8A1A80A2D206275636B6574466F726D6174537472696E67EFBC9AE5AD98E582A8E69687E4BBB6E79A84E591A8E69C9FEFBC8CE59CA8E6AF8FE4B8AAE591A8E69C9FE9878CE4BC9AE7949FE68890E4B880E79BAEE5BD952CE4BE8BE5A682EFBC9AE58886E9929F28797979794D4D646448486D6D292C20E5B08FE697B628797979794D4D64644848292C20E5A4A928797979794D4D6464292C20E6ADA4E5A484E697B6E997B4E4B8BAE69C8DE58AA1E599A8E5BD93E5898DE697B6E997B4EFBC8CE5B9B6E99D9EE4BA8BE4BBB6E697B6E997B40A2D2064617461466F726D6174EFBC9AE695B0E68DAEE5AD98E582A8E6A0BCE5BC8FEFBC886A736F6E20E6889620637376EFBC890A2D206D61785061727453697A65EFBC9A5B726F6C6C696E6720706F6C6963795DE69687E4BBB6E69C80E5A4A773697A650A2D20726F6C6C6F766572496E74657276616CEFBC9A5B726F6C6C696E6720706F6C6963795DE69687E4BBB6E6BB9AE58AA8E69C80E5A4A7E697B6E997B40A2D20696E6163746976697479496E74657276616CEFBC9A5B726F6C6C696E6720706F6C6963795DE69687E4BBB6E997B2E7BDAEE69C80E5A4A7E697B6E997B40A0AE4BE8BE5A682EFBC9A0A6060600A7B0A202022696E6163746976697479496E74657276616C22203A202231303030222C0A202022626173655061746822203A2022686466733A2F2F656F694E616D65536572766963652F746D70222C0A202022726F6C6C6F766572496E74657276616C22203A202231303030222C0A2020226D61785061727453697A6522203A202231222C0A2020226669656C647322203A205B202274696D65222C20226964222C202276616C7565222C2022747322205D0A7D0A6060600A, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313631353138383437383037322220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22323331352220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3437312E353339353132203939382E3532343837386D2D32352E34373531323220306132352E3437353132322032352E3437353132322030203120302035302E39353032343420302032352E3437353132322032352E3437353132322030203120302D35302E39353032343420305A2220702D69643D2232333136223E3C2F706174683E3C7061746820643D224D3931332E313038323933203534322E3936393735366D2D32352E34373531323220306132352E3437353132322032352E3437353132322030203120302035302E39353032343420302032352E3437353132322032352E3437353132322030203120302D35302E39353032343420305A2220702D69643D2232333137223E3C2F706174683E3C7061746820643D224D3838382E3633323139352030483331332E3139343134366C2D34312E3935393032342034392E3935313232683539322E3432313436336331332E37383635333720302032342E39373536312031312E3138393037332032342E39373536312032342E393735363039763437322E3533383533376834392E39353132325634392E393531323263302D32372E3537333037332D32322E3337383134362D34392E39353132322D34392E39353132322D34392E39353132327A4D33392E343631343633203933392E30383239323763302036312E3533393930322032322E3337383134362038332E3931383034392034392E39353132322038332E393138303439683338302E363238323933762D34392E3935313232483131342E333838323933632D31332E37383635333720302D32342E39373536312D31312E3138393037332D32342E39373536312D32342E3937353631563235332E3735323139356C2D34372E3935333137312031392E3938303438382220702D69643D2232333138223E3C2F706174683E3C7061746820643D224D3137332E333330373332203134302E3336323932374C3331332E3139343134362030763237332E3733323638334833392E3436313436337A4D3537392E393333363539203539332E343230343838483236312E323434383738632D31332E37383635333720302D32342E39373536312D31312E3138393037332D32342E39373536312D32342E39373536317331312E3138393037332D32342E39373536312032342E39373536312D32342E3937353631683331382E3638383738316331332E37383635333720302032342E39373536312031312E3138393037332032342E3937353630392032342E3937353631732D31312E3138393037332032342E39373536312D32342E3937353630392032342E39373536317A4D3730352E383130373332203338322E363236333431483236312E323434383738632D31332E37383635333720302D32342E39373536312D31312E3138393037332D32342E39373536312D32342E3937353630397331312E3138393037332D32342E39373536312032342E39373536312D32342E3937353631683434342E3536353835346331332E37383635333720302032342E39373536312031312E3138393037332032342E3937353630392032342E3937353631732D31312E3138393037332032342E39373536312D32342E3937353630392032342E3937353630397A4D3735312E323636333431203632312E333933313731632D3131302E33393231393520302D3139392E3830343837382038392E3431323638332D3139392E383034383738203139392E3830343837387338392E343132363833203139392E383034383738203139392E383034383738203139392E383034383738203139392E3830343837382D38392E343132363833203139392E3830343837392D3139392E3830343837382D38392E3431323638332D3139392E3830343837382D3139392E3830343837392D3139392E3830343837387A206D30203334392E363538353336632D38322E373139323220302D3134392E3835333635392D36372E3133343433392D3134392E3835333635382D3134392E3835333635387336372E3133343433392D3134392E383533363539203134392E3835333635382D3134392E383533363539203134392E3835333635392036372E313334343339203134392E383533363539203134392E3835333635392D36372E313334343339203134392E3835333635392D3134392E383533363539203134392E3835333635387A2220702D69643D2232333139223E3C2F706174683E3C7061746820643D224D3834352E363734313436203835392E313630393736483635352E383539353132632D31332E37383635333720302D32342E39373536312D31312E3138393037332D32342E39373536312D32342E39373536317331312E3138393037332D32342E39373536312032342E39373536312D32342E3937353631683138392E3831343633346331332E37383635333720302032342E39373536312031312E3138393037332032342E39373536312032342E3937353631732D31312E3138393037332032342E39373536312D32342E39373536312032342E39373536317A2220702D69643D2232333230223E3C2F706174683E3C7061746820643D224D3832392E303930333431203834372E3137323638334C3735302E373636383239203738362E373331373037632D31302E3838393336362D382E3339313830352D31322E3838373431352D32342E3037363438382D342E3439353630392D33352E30363537353620382E3339313830352D31302E3838393336362032342E3037363438382D31322E3838373431352033352E3036353735362D342E34393536316C37382E3332333531322036302E3434303937366331302E38383933363620382E3339313830352031322E3838373431352032342E30373634383820342E34393536312033352E3036353735362D382E3439313730372031302E3938393236382D32342E31373633392031322E3938373331372D33352E30363537353720342E34393536317A2220702D69643D2232333231223E3C2F706174683E3C7061746820643D224D3836322E343537373536203835312E3336383538354C3738362E393331353132203931312E313130323434632D31302E37383934363320382E35393136312D32362E35373430343920362E3639333436332D33352E3036353735362D342E3039366C2D302E3139393830352D302E313939383035632D382E35393136312D31302E3738393436332D362E3639333436332D32362E35373430343920342E3039362D33352E3036353735366C37352E3632363134372D35392E3734313635396331302E3738393436332D382E35393136312032362E3537343034392D362E3639333436332033352E30363537353620342E3039366C302E31393938303520302E31393938303563382E3439313730372031302E37383934363320362E3639333436332032362E3437343134362D342E3139353930332033352E3036353735367A2220702D69643D2232333232223E3C2F706174683E3C2F7376673E, 'flink-job-1_9_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.sink.JDBCSinkJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.sink.JDBCSinkJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":null,\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"JDBCSinkJob\",\"type\":\"streaming\",\"role\":\"sink\",\"category\":\"\",\"display\":\"输出到JDBC数据库_1.9\",\"description\":\"把数据通过jdbc批量写入到表中\",\"doc\":\"JDBCSinkJob.md\",\"icon\":\"JDBCSinkJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"dataSourceUrl\",\"label\":\"数据库连接字符串\",\"type\":[\"STRING\"],\"description\":\"数据库连接字符串\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"userName\",\"label\":\"用户名\",\"type\":[\"STRING\"],\"description\":\"数据库连接用户\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"password\",\"label\":\"密码\",\"type\":[\"STRING\"],\"description\":\"数据库连接密码\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"PASSWORD\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"schemaName\",\"label\":\"库名\",\"type\":[\"STRING\"],\"description\":\"库名\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"table\",\"label\":\"表名\",\"type\":[\"STRING\"],\"description\":\"表名\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"flushMaxSize\",\"label\":\"批量写入最大数\",\"type\":[\"INT\"],\"description\":\"批量写入最大数\",\"optional\":true,\"defaultValue\":\"1000\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"flushIntervalMills\",\"label\":\"批量写入间隔时间\",\"type\":[\"LONG\"],\"description\":\"批量写入间隔时间(毫秒)\",\"optional\":true,\"defaultValue\":\"1000\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"maxRetryTimes\",\"label\":\"写入失败重试最大数\",\"type\":[\"INT\"],\"description\":\"写入失败重试最大数\",\"optional\":true,\"defaultValue\":\"3\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"columns\",\"label\":\"输出表字段定义\",\"type\":[\"LIST\"],\"description\":\"定义需要哪些字段输出到表\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":{\"apiVersion\":0,\"name\":null,\"label\":null,\"type\":[\"OBJECT\"],\"description\":null,\"optional\":false,\"defaultValue\":null,\"placeholder\":null,\"candidates\":null,\"inputType\":null,\"range\":null,\"regex\":null,\"order\":0,\"requireCondition\":null,\"availableCondition\":null,\"listParameter\":null,\"objectParameters\":[{\"apiVersion\":2,\"name\":\"columnName\",\"label\":\"源字段名\",\"type\":[\"STRING\"],\"description\":\"源数据里的字段名\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"aliasName\",\"label\":\"目标字段名\",\"type\":[\"STRING\"],\"description\":\"定义table里的字段名;不填则默认同源字段名;Event模式下指定时间字段不能重命名。\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"columnType\",\"label\":\"字段类型\",\"type\":[\"STRING\"],\"description\":\"定义table里的字段类型\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[\"string\",\"int\",\"double\",\"float\",\"decimal\",\"boolean\",\"short\",\"long\",\"timestamp\",\"time\",\"date\"],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]},\"objectParameters\":null}]}}', 'sink', '', 0x2320E695B0E68DAEE8BE93E587BAE588B04A444243E695B0E68DAEE5BA930A0AE68A8AE695B0E68DAEE9809AE8BF876A646263E689B9E9878FE58699E585A5E588B0E8A1A8E4B8AD2CE99C80E8A681E9809AE8BF87636F6C756D6E73E58F82E695B0E69DA5E5AE9AE4B989E8A1A8E79A84E5AD97E6AEB5EFBC9B0A0A232320E6A0B7E4BE8B0A0AE4B8BBE8A681E58F82E695B0E5A682E4B88B3A0A0A6060600A7B0A20202270617373776F7264223A202274657374222C0A20202264617461536F7572636555726C223A20226A6462633A6D7973716C3A2F2F6C6F63616C686F73743A35353033372F74657374222C0A202022757365724E616D65223A202274657374222C0A202022636F6C756D6E73223A205B0A202020207B0A20202020202022636F6C756D6E54797065223A2022737472696E67222C0A20202020202022636F6C756D6E4E616D65223A20226A6F625F6E616D65220A202020207D2C0A202020207B0A20202020202022636F6C756D6E54797065223A20226C6F6E67222C0A20202020202022636F6C756D6E4E616D65223A20226372656174655F74696D65220A202020207D0A20205D2C0A2020227461626C65223A202274625F6A6F62220A7D0A6060600A0AE6B3A8E6848FEFBC9A0A2D20E99C80E8A681E68A8A64617461536F7572636555726CE9878CE794A8E588B0E79A846A64626320647269766572E79A846A6172E58C85E694BEE59CA8666C696E6B2F6C6962EFBC8CE4BBA5E7A1AEE4BF9DE8BF90E8A18CE697B6E58FAFE4BBA5E689BEE588B0EFBC9B0A2D20E79BAEE5898DE694AFE68C81E79A846A646263E696B9E8A880E69C89EFBC9A436C69636B486F7573652C566572746963612C44657262792C4D7953514C2C506F7374677265730A, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313631353838383337303630342220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22323535382220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3137302E343936203136342E33353263302036372E303732203135322E353736203132312E383536203334312E353034203132312E383536733334312E3530342D35342E323732203334312E3530342D3132312E38353663302D36372E3037322D3135322E3537362D3132312E3835362D3334312E3530342D3132312E383536533137302E3439362039372E3238203137302E343936203136342E3335327A4D3334372E363438203731302E363536632D36382E3039362D31342E3834382D3133302E3034382D33362E3335322D3137372E3135322D36362E303438763231392E36343863302035352E323936203130362E343936203130322E34203234392E383536203131372E3234382D35312E322D35312E322D38332E3435362D3132312E3334342D38332E3435362D3139382E36353620322E3034382D32352E3620362E3635362D34392E3135322031302E3735322D37322E3139327A4D3137302E343936203330372E32763230362E38343863302035312E322038392E362039362E323536203231352E353532203131332E3135322035312E322D37342E373532203133342E3134342D3132332E393034203233322E3434382D3132332E3930342037322E3730342030203133362E3730342032372E363438203138372E3930342037322E3730342032392E3639362D31362E3839362034372E3130342D33362E3335322034372E3130342D35392E393034563330372E32632D38302E3839362035312E322D3231302E3934342038332E3435362D3334312E3530342038332E343536533235312E393034203335382E34203137302E343936203330372E327A206D3337352E383038203330332E3130346C2D3133302E303438203131372E323438683433372E323438762D35392E393034682D3330372E32762D35372E3334347A206D2D3133302E3536203139342E3034387635372E333434683330352E313532563932312E366C3133322E3039362D3131372E323438483431352E3734347A222066696C6C3D22233242383546422220702D69643D2232353539223E3C2F706174683E3C2F7376673E, 'flink-job-1_9_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.sink.KafkaSinkJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.sink.KafkaSinkJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":null,\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"KafkaSinkJob\",\"type\":\"streaming\",\"role\":\"sink\",\"category\":\"\",\"display\":\"输出到Kafka_1.9\",\"description\":\"使用FlinkKafkaProducer,无需指定版本号, 由Flink自适应.\",\"doc\":\"KafkaSinkJob.md\",\"icon\":\"KafkaSinkJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"autoCreateTopic\",\"label\":\"自动创建topic\",\"type\":[\"BOOL\"],\"description\":\"是否自动创建topic, true: 自动,false:不创建, 默认: false\",\"optional\":true,\"defaultValue\":\"false\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"autoCreateTopicPartitions\",\"label\":\"自动创建topics分区数\",\"type\":[\"INT\"],\"description\":\"autoCreateTopic=true时,自动创建topics分区数,默认1\",\"optional\":true,\"defaultValue\":\"1\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"autoCreateTopic == true\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"autoCreateTopicReplicationFactor\",\"label\":\"自动创建topics副本数\",\"type\":[\"INT\"],\"description\":\"autoCreateTopic=true时,自动创建topics副本数,默认1\",\"optional\":true,\"defaultValue\":\"1\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"autoCreateTopic == true\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"kafkaProducerProperties\",\"label\":\"kafka Producer配置项\",\"type\":[\"MAP\"],\"description\":\"透传kafka Producer配置项;\\n可选填项请参考:https://kafka.apache.org/documentation/#producerconfigs\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"topic\",\"label\":\"topic\",\"type\":[\"STRING\"],\"description\":\"输出到的topic名\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"bootstrapServers\",\"label\":\"Kafka地址列表\",\"type\":[\"LIST\"],\"description\":\"Kafka server 服务器列表\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":{\"apiVersion\":0,\"name\":null,\"label\":null,\"type\":[\"STRING\"],\"description\":null,\"optional\":false,\"defaultValue\":null,\"placeholder\":null,\"candidates\":null,\"inputType\":null,\"range\":null,\"regex\":null,\"order\":0,\"requireCondition\":null,\"availableCondition\":null,\"listParameter\":null,\"objectParameters\":null},\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"semantic\",\"label\":\"FlinkKafkaProducer模式\",\"type\":[\"STRING\"],\"description\":\"支持: EXACTLY_ONCE, AT_LEAST_ONCE, NONE\",\"optional\":true,\"defaultValue\":\"AT_LEAST_ONCE\",\"placeholder\":\"\",\"candidates\":[\"EXACTLY_ONCE\",\"AT_LEAST_ONCE\",\"NONE\"],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"logFailuresOnly\",\"label\":\"是否忽略异常\",\"type\":[\"BOOL\"],\"description\":\"当写kafka失败时,例如消息过大等错误时,是忽略异常只记录日志(true),还是任务失败(false)\",\"optional\":true,\"defaultValue\":\"true\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"writeTimestampToKafka\",\"label\":\"是否把数据的时间作为kafka记录的时间\",\"type\":[\"BOOL\"],\"description\":\"设置为false避免flink把数据event time的时间作为kafka记录时间写入,否则可能会造成历史数据很快过期被自动清理掉\",\"optional\":true,\"defaultValue\":\"false\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"kafkaPartitionType\",\"label\":\"kafka 分区方法\",\"type\":[\"STRING\"],\"description\":\"当生成kafka记录时的分区方法,可设置为FIXED, ROUND_ROBIN, BY_KEY\",\"optional\":true,\"defaultValue\":\"ROUND_ROBIN\",\"placeholder\":\"\",\"candidates\":[\"FIXED\",\"ROUND_ROBIN\",\"BY_KEY\"],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"partitionKey\",\"label\":\"kafka 分区key字段\",\"type\":[\"STRING\"],\"description\":\"当partitionType为BY_KEY时,该字段为必填字段,需要设置采用哪个字段作为kafka record的分区key\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"kafkaPartitionType == \'BY_KEY\'\",\"availableCondition\":\"kafkaPartitionType == \'BY_KEY\'\",\"listParameter\":null,\"objectParameters\":null}]}}', 'sink', '', 0x2320E695B0E68DAEE8BE93E587BAE588B04B61666B610A0AE9809AE8BF87E9858DE7BDAE6B61666B612073696E6BE79A84E58F82E695B0EFBC8CE68A8AE695B0E68DAEE8BE93E587BAE588B0E68EA5E585A5E68C87E5AE9A746F706963EFBC8C0AE58FAFE694AFE68C81E5A4A7E983A8E588866B61666B61E98089E9A1B9E58F82E695B0EFBC8CE5B9B6E694AFE68C8153534CE5AE89E585A8E4BCA0E8BE93E5928C5341534CE5AE89E585A8E8AEA4E8AF81E69CBAE588B6EFBC8CE585B7E4BD93E8AFB7E58F82E88083E79BB8E585B3E58F82E695B0E8AFA6E68385E380820A0AE68EA5E585A5E695B0E68DAEE4B8BA604D61703C537472696E672C4F626A6563743E60E7B1BBE59E8B0A0AE4BE8BE5A682E9858DE7BDAEE58F82E695B0E5A682E4B88BEFBC9A0A0A6060600A7B0A2020226175746F437265617465546F70696322203A20747275652C0A202022626F6F7473747261705365727665727322203A205B20226C6F63616C686F73743A353832373222205D2C0A202022746F70696322203A2022746F70696353696E6B222C0A20202273656D616E74696322203A202241545F4C454153545F4F4E4345222C0A2020226B61666B61506172746974696F6E5479706522203A2022524F554E445F524F42494E222C0A2020226B61666B6150726F647563657250726F7065727469657322203A207B0A20202020226D61782E726571756573742E73697A6522203A20223130323430222C0A202020202262617463682E73697A6522203A2022313030220A20207D0A7D0A6060600A0A6B61666B6150726F647563657250726F70657274696573604D61703C537472696E672C537472696E673E60EFBC8C6B6579E4B8BAE58F82E695B0E5908DEFBC8C76616C7565E7BB9FE4B880E4B8BA537472696E67E7B1BBE59E8BEFBC8C0AE58FAFE6B7BBE58AA0E585B6E4BB96E58E9FE7949F6B61666B612070726F6475636572E9858DE7BDAEE9A1B9EFBC8CE585B7E4BD93E69C89E593AAE4BA9BE58FAFE98089E5A1ABE9A1B9E8AFB7E58F82E88083EFBC9A68747470733A2F2F6B61666B612E6170616368652E6F72672F646F63756D656E746174696F6E2F2370726F6475636572636F6E666967730A0AE4BBA5E4B88BE5B8B8E794A8E79A84E9858DE7BDAEE58F82E695B0E4BBA5E4BE9BE58F82E88083EFBC9A0A0A7C206E616D65207C206C6162656C207C2074797065207C206F7074696F6E616C207C2064656661756C742076616C7565207C206465736372697074696F6E207C0A7C203A2D2D2D207C203A2D2D2D2D207C203A2D2D2D207C203A2D2D2D2D2D2D3A207C203A2D2D2D2D2D2D2D2D2D2D2D3A207C203A2D2D2D2D2D2D2D2D2D2D207C0A7C206D61782E726571756573742E73697A65207C20E69C80E5A4A7E8AFB7E6B182E5A4A7E5B08F207C20696E74207C2074727565207C2031303234303030207C20E69C80E5A4A7E8AFB7E6B182E5A4A7E5B08FEFBC8CE58D95E4BD8DE5AD97E88A82207C0A7C2062617463682E73697A65207C20E58D95E6ACA1E689B9E8AFB7E6B182E5A4A7E5B08F207C20696E74207C2074727565207C20353030207C20E58D95E6ACA1E689B9E8AFB7E6B182E5A4A7E5B08F2CE8BF99E4B8AAE9858DE7BDAEE79A84E580BCE69C80E5A5BDE4B88DE8A681E8B685E8BF8733324D42EFBC8CE69C89E7B3BBE7BB9FE79A84E7A1ACE99990E588B6E59CA8EFBC8CE58D95E4BD8DE5AD97E88A82207C0A7C20636F6D7072657373696F6E2E74797065207C20E58E8BE7BCA9E696B9E5BC8F207C20737472696E67207C2074727565207C206C7A34207C206B61666B6120E6B688E681AFE7949FE4BAA7E58E8BE7BCA9E696B9E5BC8FEFBC8CE694AFE68C81E7B1BBE59E8BE5A682E4B88BEFBC9A6E6F6E653A20E4B88DE58E8BE7BCA92C20677A69703A20677A6970E6A0BCE5BC8FE58E8BE7BCA9EFBC8C736E617070793A20736E61707079E6A0BCE5BC8FE58E8BE7BCA92C206C7A343A206C7A34E6A0BCE5BC8FE58E8BE7BCA92E20207C0A0A0AE4BBA5E4B88BE5B8B8E794A85341534CE8AEA4E8AF81E58F82E695B0E4BBA5E4BE9BE58F82E88083EFBC9A0A0A7C206E616D65207C206C6162656C207C2074797065207C206F7074696F6E616C207C2064656661756C742076616C7565207C206465736372697074696F6E207C0A7C203A2D2D2D207C203A2D2D2D2D207C203A2D2D2D207C203A2D2D2D2D2D2D3A207C203A2D2D2D2D2D2D2D2D2D2D2D3A207C203A2D2D2D2D2D2D2D2D2D2D207C0A7C2073656375726974792E70726F746F636F6C207C20E8AEA4E8AF81E58D8FE8AEAE207C20737472696E67207C2074727565207C20504C41494E54455854207C2050726F746F636F6C207573656420746F20636F6D6D756E696361746520776974682062726F6B6572732E2056616C69642076616C756573206172653A20504C41494E544558542C2053534C2C205341534C5F504C41494E544558542C205341534C5F53534C207C0A7C207361736C2E6B65726265726F732E736572766963652E6E616D65207C20E8AEA4E8AF81E69C8DE58AA1E5908D207C20737472696E67207C2074727565207C206B61666B61207C20546865204B65726265726F73207072696E636970616C206E616D652074686174204B61666B612072756E732061732E20546869732063616E20626520646566696E65642065697468657220696E204B61666B612773204A41415320636F6E666967206F7220696E204B61666B61277320636F6E6669672E207C0A7C207361736C2E6D656368616E69736D207C20E8AEA4E8AF81E7AD96E795A5207C20737472696E67207C2074727565207C20475353415049207C20E794A8E69DA5E68C87E5AE9A5341534CE8AEA4E8AF81E58D8FE8AEAEE79A84E7AD96E795A5EFBC9A47535341504920284B65726265726F7329EFBC8C504C41494EEFBC8C534352414D2D5348412D32353628E69A82E4B88DE694AFE68C8129EFBC8C534352414D2D5348412D35313228E69A82E4B88DE694AFE68C8129EFBC8C4F4155544842454152455228E69A82E4B88DE694AFE68C8129E38082205341534C206D656368616E69736D207573656420666F7220636C69656E7420636F6E6E656374696F6E732E2054686973206D617920626520616E79206D656368616E69736D20666F7220776869636820612073656375726974792070726F766964657220697320617661696C61626C652E20475353415049206973207468652064656661756C74206D656368616E69736D2E207C0A7C207361736C2E6A6161732E636F6E666967207C207361736C2E6A6161732E636F6E666967207C20737472696E67207C2074727565207C20475353415049207C20E794A8E69DA5E68C87E5AE9A5341534CE8AEA4E8AF81E9858DE7BDAEEFBC8CE4BE8BE5A682EFBC9A636F6D2E73756E2E73656375726974792E617574682E6D6F64756C652E4B7262354C6F67696E4D6F64756C65207265717569726564207573654B65795461623D747275652073746F72654B65793D74727565206B65795461623D222F6574632F73656375726974792F6B6579746162732F6B61666B615F636C69656E742E6B657974616222207072696E636970616C3D226B61666B61636C69656E7431404558414D504C452E434F4D223B202020E8AFB4E6988EEFBC9A204A414153206C6F67696E20636F6E7465787420706172616D657465727320666F72205341534C20636F6E6E656374696F6E7320696E2074686520666F726D61742075736564206279204A41415320636F6E66696775726174696F6E2066696C65732E204A41415320636F6E66696775726174696F6E2066696C6520666F726D61742069732064657363726962656420687474703A2F2F646F63732E6F7261636C652E636F6D2F6A61766173652F382F646F63732F746563686E6F7465732F6775696465732F73656375726974792F6A6773732F7475746F7269616C732F4C6F67696E436F6E66696746696C652E68746D6C222E2054686520666F726D617420666F72207468652076616C75652069733A20276C6F67696E4D6F64756C65436C61737320636F6E74726F6C466C616720286F7074696F6E4E616D653D6F7074696F6E56616C7565292A3B272E20466F722062726F6B6572732C2074686520636F6E666967206D7573742062652070726566697865642077697468206C697374656E65722070726566697820616E64205341534C206D656368616E69736D206E616D6520696E206C6F7765722D636173652E20466F72206578616D706C652C206C697374656E65722E6E616D652E7361736C5F73736C2E736372616D2D7368612D3235362E7361736C2E6A6161732E636F6E6669673D636F6D2E6578616D706C652E536372616D4C6F67696E4D6F64756C652072657175697265643B207C0A0AE4BBA5E4B88BE5B8B8E794A853534CE8AEA4E8AF81E58F82E695B0E4BBA5E4BE9BE58F82E88083EFBC9A0A0A7C206E616D65207C206C6162656C207C2074797065207C206F7074696F6E616C207C2064656661756C742076616C7565207C206465736372697074696F6E207C0A7C203A2D2D2D207C203A2D2D2D2D207C203A2D2D2D207C203A2D2D2D2D2D2D3A207C203A2D2D2D2D2D2D2D2D2D2D2D3A207C203A2D2D2D2D2D2D2D2D2D2D207C0A7C2073736C2E747275737473746F72652E6C6F636174696F6E207C2073736C2E747275737473746F72652E6C6F636174696F6E207C20737472696E67207C2074727565207C20207C20546865206C6F636174696F6E206F66207468652074727573742073746F72652066696C652E20207C0A7C2073736C2E747275737473746F72652E70617373776F7264207C2073736C2E747275737473746F72652E70617373776F7264207C20737472696E67207C2074727565207C20207C205468652070617373776F726420666F72207468652074727573742073746F72652066696C652E20496620612070617373776F7264206973206E6F74207365742061636365737320746F2074686520747275737473746F7265206973207374696C6C20617661696C61626C652C2062757420696E7465677269747920636865636B696E672069732064697361626C65642E207C0A7C2073736C2E6B65792E70617373776F7264207C2073736C2E6B65792E70617373776F7264207C20737472696E67207C2074727565207C20207C205468652070617373776F7264206F66207468652070726976617465206B657920696E20746865206B65792073746F72652066696C652E2054686973206973206F7074696F6E616C20666F7220636C69656E742E207C0A7C2073736C2E6B657973746F72652E6C6F636174696F6E207C2073736C2E6B657973746F72652E6C6F636174696F6E207C20737472696E67207C2074727565207C20207C20546865206C6F636174696F6E206F6620746865206B65792073746F72652066696C652E2054686973206973206F7074696F6E616C20666F7220636C69656E7420616E642063616E206265207573656420666F722074776F2D7761792061757468656E7469636174696F6E20666F7220636C69656E742E207C0A7C2073736C2E6B657973746F72652E70617373776F7264207C2073736C2E6B657973746F72652E70617373776F7264207C20737472696E67207C2074727565207C20207C205468652073746F72652070617373776F726420666F7220746865206B65792073746F72652066696C652E2054686973206973206F7074696F6E616C20666F7220636C69656E7420616E64206F6E6C79206E65656465642069662073736C2E6B657973746F72652E6C6F636174696F6E20697320636F6E666967757265642E20207C0A7C2073736C2E6B657973746F72652E74797065207C2073736C2E6B657973746F72652E74797065207C20737472696E67207C2074727565207C204A4B53207C205468652066696C6520666F726D6174206F6620746865206B65792073746F72652066696C652E2054686973206973206F7074696F6E616C20666F7220636C69656E742E207C0A7C2073736C2E747275737473746F72652E74797065207C2073736C2E747275737473746F72652E74797065207C20737472696E67207C2074727565207C204A4B53207C205468652066696C6520666F726D6174206F66207468652074727573742073746F72652066696C652E207C0A7C2073736C2E656E61626C65642E70726F746F636F6C73207C2073736C2E656E61626C65642E70726F746F636F6C73207C20737472696E67207C2074727565207C20544C5376312E322C544C5376312E312C544C537631207C20546865206C697374206F662070726F746F636F6C7320656E61626C656420666F722053534C20636F6E6E656374696F6E732E207C0A7C2073736C2E656E64706F696E742E6964656E74696669636174696F6E2E616C676F726974686D207C2073736C2E656E64706F696E742E6964656E74696669636174696F6E2E616C676F726974686D207C20737472696E67207C2074727565207C206874747073207C2054686520656E64706F696E74206964656E74696669636174696F6E20616C676F726974686D20746F2076616C69646174652073657276657220686F73746E616D65207573696E67207365727665722063657274696669636174652E20207C0A7C206175746F437265617465546F706963207C20E887AAE58AA8E5889BE5BBBA746F70696373207C20626F6F6C65616E207C2074727565207C2066616C7365207C20E698AFE590A6E887AAE58AA8E5889BE5BBBA746F7069632C2020747275653A20E887AAE58AA8EFBC8C66616C73653AE4B88DE5889BE5BBBA2C20E9BB98E8AEA43A2066616C7365207C0A7C206175746F437265617465546F706963506172746974696F6E73207C20E887AAE58AA8E5889BE5BBBA746F70696373E58886E58CBAE695B0207C20696E74207C2074727565207C2031207C206175746F437265617465546F7069633D74727565E697B6EFBC8CE887AAE58AA8E5889BE5BBBA746F70696373E58886E58CBAE695B02CE9BB98E8AEA431207C0A7C206175746F437265617465546F7069635265706C69636174696F6E466163746F72207C20E887AAE58AA8E5889BE5BBBA746F70696373E589AFE69CACE695B0207C20696E74207C2074727565207C2031207C206175746F437265617465546F7069633D74727565E697B6EFBC8CE887AAE58AA8E5889BE5BBBA746F70696373E589AFE69CACE695B02CE9BB98E8AEA431207C0A, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313630373035393733343931332220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D223635332220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3639332E383435333333203536372E313638632D33392E38393333333320302D37352E3630353333332031372E3636342D3130302E3039362034352E3438323636376C2D36322E37322D34342E34313663362E3635362D31382E3334363636372031302E3439362D33382E3031362031302E3439362D35382E36323420302D32302E3236363636372D332E3636393333332D33392E3539343636372D31302E3131322D35372E3638353333346C36322E3539322D34332E393436363636613133322E393932203133322E3939322030203020302039392E3838323636372034352E3232363636366337332E362030203133332E3530342D35392E383631333333203133332E3530342D3133332E353034732D35392E3930342D3133332E3530342D3133332E3530342D3133332E353034613133332E363332203133332E3633322030203020302D3132372E393537333333203137312E3433343636376C2D36322E3633343636372034332E393436363637613137322E353434203137322E3534342030203020302D3130362E3735322D36312E393934363637563236342E313036363637613133332E373137333333203133332E373137333333203020302030203130362E3032363636372D3133302E363032363637433530322E3537303636372035392E383631333333203434322E3636363636372030203336392E3036363636372030533233352E3630353333332035392E383631333333203233352E363035333333203133332E353034613133332E363332203133332E363332203020302030203130332E363337333334203133302E3030353333337637362E343538363637613137322E353836363637203137322E3538363636372030203020302D3134322E353439333334203136392E363432363637203137322E353836363637203137322E353836363637203020302030203134332E373836363637203136392E3835367638302E373235333333613133332E363734363637203133332E3637343636372030203020302D3130342E383332203133302E333034433233352E363035333333203936342E313338363637203239352E3436363636372031303234203336392E3036363636372031303234733133332E3530342D35392E383631333333203133332E3530342D3133332E353034613133332E363332203133332E3633322030203020302D3130342E3833322D3133302E333034762D38302E373235333333613137322E343538363637203137322E343538363637203020302030203130342E39362D36312E3035366C36332E3134363636362034342E373134363636613133322E393036363637203133322E3930363636372030203020302D352E3436313333332033372E35343636363763302037332E362035392E393034203133332E353034203133332E353034203133332E353034733133332E3530342D35392E383631333333203133332E3530342D3133332E3530342D35392E3934363636372D3133332E3530342D3133332E3534363636372D3133332E3530347A206D302D3331322E3134393333336333352E37313220302036342E3732353333332032392E3035362036342E3732353333342036342E373235333333732D32392E3031333333332036342E3732353333332D36342E3732353333342036342E373235333333632D33352E36363933333320302D36342E3732353333332D32392E3035362D36342E3732353333332D36342E3732353333337332392E3035362D36342E3732353333332036342E3732353333332D36342E3732353333337A4D3330342E333431333333203133332E35303463302D33352E3636393333332032392E3031333333332D36342E3732353333332036342E3732353333342D36342E3732353333337336342E3732353333332032392E3035362036342E3732353333332036342E3732353333332D32392E3031333333332036342E3732353333332D36342E3732353333332036342E3732353333332D36342E3732353333332D32392E3035362D36342E3732353333342D36342E3732353333337A206D3132392E343530363637203735362E39393263302033352E3636393333332D32392E3031333333332036342E3732353333332D36342E3732353333332036342E373235333333732D36342E3732353333332D32392E3035362D36342E3732353333342D36342E3732353333332032392E3031333333332D36342E3732353333332036342E3732353333342D36342E3732353333332036342E3732353333332032392E3035362036342E3732353333332036342E3732353333337A4D3336392E303636363637203539392E3839333333336139302E3336382039302E3336382030203020312D39302E3238323636372D39302E32383236363663302D34392E3739322034302E3439303636372D39302E3238323636372039302E3238323636372D39302E3238323636372034392E37393220302039302E3238323636372034302E3439303636372039302E3238323636362039302E3238323636374139302E3336382039302E333638203020302031203336392E303636363637203539392E3839333333337A206D3332342E373738363636203136352E3530346136342E3831303636372036342E3831303636372030203020312D36342E3732353333332D36342E37323533333363302D33352E3636393333332032392E3031333333332D36342E3732353333332036342E3732353333332D36342E3732353333337336342E3732353333332032392E3035362036342E3732353333342036342E37323533333363302033352E3636393333332D32392E3031333333332036342E3732353333332D36342E3732353333342036342E3732353333337A2220702D69643D22363534223E3C2F706174683E3C2F7376673E, 'flink-job-1_9_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.sink.RedisSinkJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.sink.RedisSinkJob\",\"inTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"outTypes\":null,\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"RedisSinkJob\",\"type\":\"streaming\",\"role\":\"sink\",\"category\":\"\",\"display\":\"输出到redis\",\"description\":\"根据redisCommand输出到redis的数据结构中\",\"doc\":\"RedisSinkJob.md\",\"icon\":\"RedisSinkJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"redisCommand\",\"label\":\"redis命令\",\"type\":[\"STRING\"],\"description\":\"redis命令,决定存储redis的数据结构;默认用HSET\",\"optional\":true,\"defaultValue\":\"HSET\",\"placeholder\":\"\",\"candidates\":[\"LPUSH\",\"RPUSH\",\"SADD\",\"SET\",\"PFADD\",\"PUBLISH\",\"ZADD\",\"HSET\"],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"additionKey\",\"label\":\"外层Key\",\"type\":[\"STRING\"],\"description\":\"HSET或ZADD命令时,使用的外层key\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"[\'HSET\',\'ZADD\'].includes(redisCommand)\",\"availableCondition\":\"[\'HSET\',\'ZADD\'].includes(redisCommand)\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"keyField\",\"label\":\"key字段名\",\"type\":[\"STRING\"],\"description\":\"如果不填,默认则是Map的Json md5值\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"redisMode\",\"label\":\"redis的类型\",\"type\":[\"STRING\"],\"description\":\"redis的类型,可选为 single, sentinel, cluster\",\"optional\":true,\"defaultValue\":\"single\",\"placeholder\":\"\",\"candidates\":[\"single\",\"sentinel\",\"cluster\"],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"hosts\",\"label\":\"redis主机地址\",\"type\":[\"LIST\"],\"description\":\"格式为 host1:port1,例如: 192.168.31.46:6379\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":{\"apiVersion\":0,\"name\":null,\"label\":null,\"type\":[\"STRING\"],\"description\":null,\"optional\":false,\"defaultValue\":null,\"placeholder\":null,\"candidates\":null,\"inputType\":null,\"range\":null,\"regex\":null,\"order\":0,\"requireCondition\":null,\"availableCondition\":null,\"listParameter\":null,\"objectParameters\":null},\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"master\",\"label\":\"redis的master名称\",\"type\":[\"STRING\"],\"description\":\"当为sentinel模式时,需要提供redis的master名称\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"redisMode==\'sentinel\'\",\"availableCondition\":\"redisMode==\'sentinel\'\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"password\",\"label\":\"redis的连接密码\",\"type\":[\"STRING\"],\"description\":\"redis的连接密码\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"PASSWORD\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"enableCompress\",\"label\":\"redis存储是否压缩\",\"type\":[\"BOOL\"],\"description\":\"redis存储是否压缩\",\"optional\":true,\"defaultValue\":\"false\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"saveAsJson\",\"label\":\"redis存储是否用json格式\",\"type\":[\"BOOL\"],\"description\":\"redis存储是否用json格式\",\"optional\":true,\"defaultValue\":\"false\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'sink', '', 0x2320E695B0E68DAEE8BE93E587BAE588B0456C61737469637365617263680A0AE6A0B9E68DAE7265646973436F6D6D616E64E8BE93E587BAE588B07265646973E79A84E695B0E68DAEE7BB93E69E84E4B8ADEFBC9B0A0AE585B6E4B8ADE5AFB9E4BA8E48534554E591BDE4BBA4EFBC8CE8BE93E587BAE698AFE590A6E4B8BAE7BAAF6A736F6EE6A0BCE5BC8FE8A681E9809AE8BF877361766541734A736F6EE68C87E5AE9AEFBC8CE585B7E4BD93E8BE93E587BAE6A0BCE5BC8FE8AFB7E58F82E88083E4B88BE99DA2E6A0B7E4BE8BE380820A0A0A232320E6A0B7E4BE8B0A0AE8BE93E585A5E79A844D6170E695B0E68DAEEFBC9A0A0A6060600A7B0A20202274696D6522203A2022323032302D31312D32322031323A30303A3030222C0A202022696422203A202231222C0A20202276616C756522203A20312E322C0A202022747322203A20313630353638393331373030300A7D0A7B0A20202274696D6522203A2022323032302D31312D32322031323A30313A3030222C0A202022696422203A202232222C0A20202276616C756522203A20322E392C0A202022747322203A20313630353638393331373030310A7D0A6060600A0AE9858DE7BDAEE58F82E695B0E5A682E4B88B2C207361766541734A736F6E20E4B8BA66616C73650A0A6060600A7B0A2020226B65794669656C6422203A20226964222C0A20202270617373776F726422203A2022313233343536222C0A202022686F73747322203A205B20223139322E3136382E32312E35343A3633373922205D2C0A2020227361766541734A736F6E22203A2066616C73652C0A20202272656469734D6F646522203A202273696E676C65222C0A2020227265646973436F6D6D616E6422203A202248534554222C0A2020226164646974696F6E4B657922203A2022726564697353696E6B5465737431220A7D0A6060600A0AE8BE93E587BAE588B072656469730A0A6060600A3139322E3136382E32312E35343A363337393E2068676574616C6C20726564697353696E6B5465737431310A3129202274696D65220A32292022323032302D31312D32322031323A30303A3030220A332920226964220A3429202231220A3529202276616C7565220A36292022312E32220A372920227473220A3829202231363035363839333137303030220A3139322E3136382E32312E35343A363337393E2068676574616C6C20726564697353696E6B5465737431320A3129202274696D65220A32292022323032302D31312D32322031323A30313A3030220A332920226964220A3429202232220A3529202276616C7565220A36292022322E39220A372920227473220A3829202231363035363839333137303031220A6060600A0AE9858DE7BDAEE58F82E695B0E5A682E4B88B2C207361766541734A736F6E20E4B8BA747275650A0A6060600A7B0A2020226B65794669656C6422203A20226964222C0A20202270617373776F726422203A2022313233343536222C0A202022686F73747322203A205B20223139322E3136382E32312E35343A3633373922205D2C0A2020227361766541734A736F6E22203A20747275652C0A20202272656469734D6F646522203A202273696E676C65222C0A2020227265646973436F6D6D616E6422203A202248534554222C0A2020226164646974696F6E4B657922203A2022726564697353696E6B5465737431220A7D0A6060600A0AE8BE93E587BAE588B072656469730A0A6060600A3139322E3136382E32312E35343A363337393E2048474554414C4C20726564697353696E6B54657374310A3129202232220A322920227B5C2274696D655C223A5C22323032302D31312D32322031323A30313A30305C222C5C2269645C223A5C22325C222C5C2276616C75655C223A322E392C5C2274735C223A313630353638393331373030317D220A3329202231220A342920227B5C2274696D655C223A5C22323032302D31312D32322031323A30303A30305C222C5C2269645C223A5C22315C222C5C2276616C75655C223A312E322C5C2274735C223A313630353638393331373030307D220A6060600A, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313631303433383237313737372220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22313438392220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3934312E353436203435382E3438632D302E3037322032352E39352D302E3134362035312E3839362D302E3232312037372E3834372D302E30332031302E3933392D372E3231392032312E3836312D32312E35382033302E3230376C302E3232312D37372E3834396331342E33362D382E3334352032312E35352D31392E3236372032312E35382D33302E3230357A4D3130322E343838203533352E3930326C302E3232312D37372E383438632D302E3033312031312E30383220372E3238342032322E31382032312E39332033302E3633366C2D302E3232312037372E383437632D31342E3634372D382E3435352D32312E3936312D31392E3535342D32312E39332D33302E3633357A2220702D69643D2231343930223E3C2F706174683E3C7061746820643D224D3931392E393636203438382E3638366C2D302E3232312037372E3834392D3334342E303136203139392E393220302E3232312D37372E383438203334342E3031362D3139392E3932317A4D3437302E393034203638382E3630366C2D302E3232312037372E3834382D3334362E3236362D3139392E39313720302E3232312D37372E3834376136313533323630342E35392036313533323630342E3539203020302030203334362E323636203139392E3931367A4D3537352E3935203638382E3630366C2D302E3232312037372E383438632D32382E3931352031362E3830332D37352E3934322031362E3830332D3130352E30343620306C302E3232312D37372E3834386332392E3130342031362E3830332037362E3133312031362E383033203130352E30343620307A2220702D69643D2231343931223E3C2F706174683E3C7061746820643D224D3934312E353436203539362E343234632D302E3037322032352E39352D302E3134362035312E3839362D302E3232312037372E3834372D302E30332031302E3933392D372E3231392032312E3836312D32312E35382033302E3230376C302E3232312D37372E3834396331342E33362D382E3334342032312E35352D31392E3236372032312E35382D33302E3230357A4D3130322E343838203637332E3834366C302E3232312D37372E383438632D302E3033312031312E30383120372E3238342032322E31382032312E39332033302E3633356C2D302E3232312037372E383438632D31342E3634372D382E3435362D32312E3936312D31392E3535352D32312E39332D33302E3633357A2220702D69643D2231343932223E3C2F706174683E3C7061746820643D224D3931392E393636203632362E3632396C2D302E3232312037372E3834392D3334342E303136203139392E393220302E3232312D37372E383438203334342E3031362D3139392E3932317A4D3437302E393034203832362E35356C2D302E3232312037372E3834384C3132342E343137203730342E34386C302E3232312D37372E3834384C3437302E393034203832362E35357A4D3537352E3935203832362E35356C2D302E3232312037372E383438632D32382E3931352031362E3830342D37352E3934322031362E3830342D3130352E30343620306C302E3232312D37372E3834386332392E3130342031362E3830342037362E3133312031362E383034203130352E30343620307A2220702D69643D2231343933223E3C2F706174683E3C7061746820643D224D3934302E383535203336312E3333346C2D302E3133362034372E363336632D302E30303120302E322D302E30303420302E342D302E303120302E366C302E3133362D34372E36333763302E3030362D302E3220302E3030392D302E3420302E30312D302E3539392220702D69643D2231343934223E3C2F706174683E3C7061746820643D224D3934302E383436203336312E3933336C2D302E3133362034372E3633376132332E3136362032332E3136362030203020312D302E34343620332E3931316C302E3133352D34372E36333763302E32362D312E32393920302E3430392D322E36303420302E3434372D332E3931314D3934302E333938203336352E3834336C2D302E3133352034372E3633376132342E3932332032342E3932332030203020312D312E31303120332E3833386C302E3133352D34372E3633376132342E37382032342E373820302030203020312E3130312D332E3833382220702D69643D2231343935223E3C2F706174683E3C7061746820643D224D3933392E323938203336392E3638326C2D302E3133352034372E3633376132382E3030332032382E3030332030203020312D312E38313620332E3837356C302E3133322D34372E3633366132372E3537332032372E35373320302030203020312E3831392D332E3837362220702D69643D2231343936223E3C2F706174683E3C7061746820643D224D3933372E343739203337332E353538632D302E3034342031352E3837382D302E3038392033312E3735372D302E3133322034372E3633366133322E3134352033322E3134352030203020312D322E37343420342E3037346C302E3133362D34372E3633376133322E3133342033322E31333420302030203020322E37342D342E3037334D3933342E373338203337372E3633316C2D302E3133362034372E3633376133392E3337352033392E3337352030203020312D342E32323820342E3534366C302E3133352D34372E3633376133392E3034332033392E30343320302030203020342E3232392D342E3534362220702D69643D2231343937223E3C2F706174683E3C7061746820643D224D3933302E3531203338322E3137376C2D302E3133352034372E363337632D322E34343220322E3235362D352E33323220342E342D382E36333220362E3339326C302E3133352D34372E36333763332E33312D312E39393120362E3138372D342E31333620382E3633322D362E3339322220702D69643D2231343938223E3C2F706174683E3C7061746820643D224D3932312E383738203338382E353638632D302E3034352031352E3837392D302E3038382033312E3735382D302E3133352034372E3633372D302E32373420302E3136352D302E353520302E33332D302E38333320302E3439326C302E3133352D34372E36333763302E32382D302E31363220302E3535392D302E33323620302E3833332D302E3439322220702D69643D2231343939223E3C2F706174683E3C7061746820643D224D3132322E313536203338392E3036386C2D302E3133342034372E363337632D31332E3434342D372E3736322D32302E3135382D31372E3934392D32302E3132382D32382E3132316C302E3133342D34372E363336632D302E3032392031302E31373220362E3638352032302E3335382032302E3132382032382E31322220702D69643D2231353030223E3C2F706174683E3C7061746820643D224D3932312E303435203338392E3036316C2D302E3133352034372E3633374C3537302E383137203634302E31356C302E3133362D34372E363338633131362E3639372D36372E383137203233332E3339352D3133352E363333203335302E3039322D3230332E3435317A2220702D69643D2231353031223E3C2F706174683E3C7061746820643D224D3437342E353338203539322E3531366C2D302E3133352034372E3633392D3335322E3338312D3230332E34343920302E3133342D34372E363337203335322E333832203230332E3434377A2220702D69643D2231353032223E3C2F706174683E3C7061746820643D224D3537302E393533203539322E3531336C2D302E3133362034372E363338632D342E353520322E3634322D392E35383420342E3833322D31342E39343220362E3536386C302E3133372D34372E36333563352E3335352D312E3733382031302E3339322D332E3932392031342E3934312D362E3537314D3535362E303132203539392E3038346C2D302E3133372034372E363335632D342E31333720312E3334342D382E34363520322E3431332D31322E39303920332E3231366C302E3133362D34372E3633396139382E3831332039382E3831332030203020302031322E39312D332E3231322220702D69643D2231353033223E3C2F706174683E3C7061746820643D224D3534332E313032203630322E3239366C2D302E3133362034372E363339632D322E38353620302E3531352D352E37363520302E3931382D382E36393520312E32316C302E3133352D34372E36333763322E3933312D302E32393320352E3833382D302E36393520382E3639362D312E3231324D3533342E343035203630332E3530386C2D302E3133352034372E363337632D322E35303520302E32352D352E30323820302E3431382D372E35363120302E3530336C302E3133342D34372E363336613131372E3038203131372E303820302030203020372E3536322D302E3530342220702D69643D2231353034223E3C2F706174683E3C7061746820643D224D3532362E383434203630342E3031326C2D302E3133342034372E363336613131372E38203131372E382030203020312D362E39383320302E3033346C302E3133342D34372E36333763322E33323720302E30353620342E36353920302E30343720362E3938332D302E3033334D3531392E3836203630342E3034356C2D302E3133342034372E363337613132302E393338203132302E3933382030203020312D362E3731342D302E3335396C302E3133342D34372E36333863322E323320302E31383320342E343720302E33303520362E37313420302E33362220702D69643D2231353035223E3C2F706174683E3C7061746820643D224D3531332E313436203630332E3638356C2D302E3133342034372E363338613131352E393839203131352E3938392030203020312D362E3632392D302E3734326C302E3133362D34372E36333863322E31393120302E33313220342E34303320302E35353820362E36323720302E3734322220702D69643D2231353036223E3C2F706174683E3C7061746820643D224D3530362E3532203630322E3934326C2D302E3133362034372E363338613130382E3531203130382E35312030203020312D362E3735382D312E3137346C302E3133352D34372E36333963322E32323320302E34363220342E34373920302E38353420362E37353920312E3137352220702D69643D2231353037223E3C2F706174683E3C7061746820643D224D3439392E373631203630312E3736386C2D302E3133352034372E363339613130312E303535203130312E3035352030203020312D372E31312D312E3734346C302E3133342D34372E36333663322E33323420302E36363120342E36393820312E32343120372E31313120312E3734314D3439322E3635203630302E3032366C2D302E3133342034372E3633366138392E3334312038392E3334312030203020312D382E3237382D322E3739346C302E3133362D34372E3633376138382E3133332038382E31333320302030203020382E32373620322E3739352220702D69643D2231353038223E3C2F706174683E3C7061746820643D224D3438342E333733203539372E323331632D302E3034352031352E3837392D302E3038392033312E3735382D302E3133362034372E3633372D332E3436322D312E3336382D362E3735372D322E3933392D392E3833342D342E3731346C302E3133352D34372E36333963332E30373720312E37373820362E33373120332E33343820392E38333520342E3731362220702D69643D2231353039223E3C2F706174683E3C7061746820643D224D3932302E3733203333332E3231374C3536382E3335203132392E3737632D32362E3731362D31352E3432352D36392E38382D31352E3432352D39362E3431362D302E3030344C3132312E383431203333332E323137632D32362E35342031352E3432342D32362E3339392034302E34323620302E3331342035352E3835316C3335322E333833203230332E3434386332362E3730392031352E3432322036392E3837342031352E3432312039362E3431352D302E303033203131362E3639372D36372E383137203233332E3339362D3133352E363334203335302E3039322D3230332E3435322032362E3533342D31352E3432312032362E3339332D34302E3432342D302E3331352D35352E3834347A4D3435312E323932203139362E3836356C35392E3535342031382E3933382035392E3135372D33342E3935372D31382E3939342034392E3333332035362E3234352032322E3531342D37312E3239332031312E3534332D32342E3339312034382E3837342D32352E3036352D34322E3139382D37312E333220372E3639362035352E3739372D33372E3633322D31392E36392D34342E3131317A206D2D3137342E323639203137322E3735632D31322E3732362D372E3334372D32312E3330322D31372E3139382D32332E3230392D32382E3334392D342E3335372D32352E3439322032372E3737372D34382E3133352037312E3737312D35302E3537372032342E37352D312E3337342034372E39373720332E3933382036342E3334322031332E3338372031322E37323620372E3334382032312E3330332031372E3139392032332E3230382032382E333520342E3335382032352E3439312D32372E3737312034382E3133382D37312E37372035302E3537362D32342E373520312E3337342D34372E3937352D332E3933382D36342E3334322D31332E3338377A206D3235352E373635203136332E3738396C2D3135352E35382D38392E383235203231312E3635322D33322E3837362D35362E303732203132322E3730317A4D3638382E333636203432382E36386C2D3132382E3435342D37342E313633203132372E3631372D37342E313636203132382E3435362037342E3136352D3132372E3631392037342E3136347A2220702D69643D2231353130223E3C2F706174683E3C7061746820643D224D3934312E353436203435382E3438632D302E3037322032352E39352D302E3134362035312E3839362D302E3232312037372E3834372D302E30332031302E3933392D372E3231392032312E3836312D32312E35382033302E3230376C302E3232312D37372E3834396331342E33362D382E3334352032312E35352D31392E3236372032312E35382D33302E3230357A4D3130322E343838203533352E3930326C302E3232312D37372E383438632D302E3033312031312E30383220372E3238342032322E31382032312E39332033302E3633366C2D302E3232312037372E383437632D31342E3634372D382E3435352D32312E3936312D31392E3535342D32312E39332D33302E3633357A2220702D69643D2231353131223E3C2F706174683E3C7061746820643D224D3931392E393636203438382E3638366C2D302E3232312037372E3834392D3334342E303136203139392E393220302E3232312D37372E383438203334342E3031362D3139392E3932317A4D3437302E393034203638382E3630366C2D302E3232312037372E3834382D3334362E3236362D3139392E39313720302E3232312D37372E3834376136313533323630342E35392036313533323630342E3539203020302030203334362E323636203139392E3931367A4D3537352E3935203638382E3630366C2D302E3232312037372E383438632D32382E3931352031362E3830332D37352E3934322031362E3830332D3130352E30343620306C302E3232312D37372E3834386332392E3130342031362E3830332037362E3133312031362E383033203130352E30343620307A2220702D69643D2231353132223E3C2F706174683E3C7061746820643D224D3934312E353436203539362E343234632D302E3037322032352E39352D302E3134362035312E3839362D302E3232312037372E3834372D302E30332031302E3933392D372E3231392032312E3836312D32312E35382033302E3230376C302E3232312D37372E3834396331342E33362D382E3334342032312E35352D31392E3236372032312E35382D33302E3230357A4D3130322E343838203637332E3834366C302E3232312D37372E383438632D302E3033312031312E30383120372E3238342032322E31382032312E39332033302E3633356C2D302E3232312037372E383438632D31342E3634372D382E3435362D32312E3936312D31392E3535352D32312E39332D33302E3633357A2220702D69643D2231353133223E3C2F706174683E3C7061746820643D224D3931392E393636203632362E3632396C2D302E3232312037372E3834392D3334342E303136203139392E393220302E3232312D37372E383438203334342E3031362D3139392E3932317A4D3437302E393034203832362E35356C2D302E3232312037372E3834384C3132342E343137203730342E34386C302E3232312D37372E3834384C3437302E393034203832362E35357A4D3537352E3935203832362E35356C2D302E3232312037372E383438632D32382E3931352031362E3830342D37352E3934322031362E3830342D3130352E30343620306C302E3232312D37372E3834386332392E3130342031362E3830342037362E3133312031362E383034203130352E30343620307A2220702D69643D2231353134223E3C2F706174683E3C7061746820643D224D3934302E383535203336312E3333346C2D302E3133362034372E363336632D302E30303120302E322D302E30303420302E342D302E303120302E366C302E3133362D34372E36333763302E3030362D302E3220302E3030392D302E3420302E30312D302E3539392220702D69643D2231353135223E3C2F706174683E3C7061746820643D224D3934302E383436203336312E3933336C2D302E3133362034372E3633376132332E3136362032332E3136362030203020312D302E34343620332E3931316C302E3133352D34372E36333763302E32362D312E32393920302E3430392D322E36303420302E3434372D332E3931314D3934302E333938203336352E3834336C2D302E3133352034372E3633376132342E3932332032342E3932332030203020312D312E31303120332E3833386C302E3133352D34372E3633376132342E37382032342E373820302030203020312E3130312D332E3833382220702D69643D2231353136223E3C2F706174683E3C7061746820643D224D3933392E323938203336392E3638326C2D302E3133352034372E3633376132382E3030332032382E3030332030203020312D312E38313620332E3837356C302E3133322D34372E3633366132372E3537332032372E35373320302030203020312E3831392D332E3837362220702D69643D2231353137223E3C2F706174683E3C7061746820643D224D3933372E343739203337332E353538632D302E3034342031352E3837382D302E3038392033312E3735372D302E3133322034372E3633366133322E3134352033322E3134352030203020312D322E37343420342E3037346C302E3133362D34372E3633376133322E3133342033322E31333420302030203020322E37342D342E3037334D3933342E373338203337372E3633316C2D302E3133362034372E3633376133392E3337352033392E3337352030203020312D342E32323820342E3534366C302E3133352D34372E3633376133392E3034332033392E30343320302030203020342E3232392D342E3534362220702D69643D2231353138223E3C2F706174683E3C7061746820643D224D3933302E3531203338322E3137376C2D302E3133352034372E363337632D322E34343220322E3235362D352E33323220342E342D382E36333220362E3339326C302E3133352D34372E36333763332E33312D312E39393120362E3138372D342E31333620382E3633322D362E3339322220702D69643D2231353139223E3C2F706174683E3C7061746820643D224D3932312E383738203338382E353638632D302E3034352031352E3837392D302E3038382033312E3735382D302E3133352034372E3633372D302E32373420302E3136352D302E353520302E33332D302E38333320302E3439326C302E3133352D34372E36333763302E32382D302E31363220302E3535392D302E33323620302E3833332D302E3439322220702D69643D2231353230223E3C2F706174683E3C7061746820643D224D3132322E313536203338392E3036386C2D302E3133342034372E363337632D31332E3434342D372E3736322D32302E3135382D31372E3934392D32302E3132382D32382E3132316C302E3133342D34372E363336632D302E3032392031302E31373220362E3638352032302E3335382032302E3132382032382E31322220702D69643D2231353231223E3C2F706174683E3C7061746820643D224D3932312E303435203338392E3036316C2D302E3133352034372E3633374C3537302E383137203634302E31356C302E3133362D34372E363338633131362E3639372D36372E383137203233332E3339352D3133352E363333203335302E3039322D3230332E3435317A2220702D69643D2231353232223E3C2F706174683E3C7061746820643D224D3437342E353338203539322E3531366C2D302E3133352034372E3633392D3335322E3338312D3230332E34343920302E3133342D34372E363337203335322E333832203230332E3434377A2220702D69643D2231353233223E3C2F706174683E3C7061746820643D224D3537302E393533203539322E3531336C2D302E3133362034372E363338632D342E353520322E3634322D392E35383420342E3833322D31342E39343220362E3536386C302E3133372D34372E36333563352E3335352D312E3733382031302E3339322D332E3932392031342E3934312D362E3537314D3535362E303132203539392E3038346C2D302E3133372034372E363335632D342E31333720312E3334342D382E34363520322E3431332D31322E39303920332E3231366C302E3133362D34372E3633396139382E3831332039382E3831332030203020302031322E39312D332E3231322220702D69643D2231353234223E3C2F706174683E3C7061746820643D224D3534332E313032203630322E3239366C2D302E3133362034372E363339632D322E38353620302E3531352D352E37363520302E3931382D382E36393520312E32316C302E3133352D34372E36333763322E3933312D302E32393320352E3833382D302E36393520382E3639362D312E3231324D3533342E343035203630332E3530386C2D302E3133352034372E363337632D322E35303520302E32352D352E30323820302E3431382D372E35363120302E3530336C302E3133342D34372E363336613131372E3038203131372E303820302030203020372E3536322D302E3530342220702D69643D2231353235223E3C2F706174683E3C7061746820643D224D3532362E383434203630342E3031326C2D302E3133342034372E363336613131372E38203131372E382030203020312D362E39383320302E3033346C302E3133342D34372E36333763322E33323720302E30353620342E36353920302E30343720362E3938332D302E3033334D3531392E3836203630342E3034356C2D302E3133342034372E363337613132302E393338203132302E3933382030203020312D362E3731342D302E3335396C302E3133342D34372E36333863322E323320302E31383320342E343720302E33303520362E37313420302E33362220702D69643D2231353236223E3C2F706174683E3C7061746820643D224D3531332E313436203630332E3638356C2D302E3133342034372E363338613131352E393839203131352E3938392030203020312D362E3632392D302E3734326C302E3133362D34372E36333863322E31393120302E33313220342E34303320302E35353820362E36323720302E3734322220702D69643D2231353237223E3C2F706174683E3C7061746820643D224D3530362E3532203630322E3934326C2D302E3133362034372E363338613130382E3531203130382E35312030203020312D362E3735382D312E3137346C302E3133352D34372E36333963322E32323320302E34363220342E34373920302E38353420362E37353920312E3137352220702D69643D2231353238223E3C2F706174683E3C7061746820643D224D3439392E373631203630312E3736386C2D302E3133352034372E363339613130312E303535203130312E3035352030203020312D372E31312D312E3734346C302E3133342D34372E36333663322E33323420302E36363120342E36393820312E32343120372E31313120312E3734314D3439322E3635203630302E3032366C2D302E3133342034372E3633366138392E3334312038392E3334312030203020312D382E3237382D322E3739346C302E3133362D34372E3633376138382E3133332038382E31333320302030203020382E32373620322E3739352220702D69643D2231353239223E3C2F706174683E3C7061746820643D224D3438342E333733203539372E323331632D302E3034352031352E3837392D302E3038392033312E3735382D302E3133362034372E3633372D332E3436322D312E3336382D362E3735372D322E3933392D392E3833342D342E3731346C302E3133352D34372E36333963332E30373720312E37373820362E33373120332E33343820392E38333520342E3731362220702D69643D2231353330223E3C2F706174683E3C7061746820643D224D3932302E3733203333332E3231374C3536382E3335203132392E3737632D32362E3731362D31352E3432352D36392E38382D31352E3432352D39362E3431362D302E3030344C3132312E383431203333332E323137632D32362E35342031352E3432342D32362E3339392034302E34323620302E3331342035352E3835316C3335322E333833203230332E3434386332362E3730392031352E3432322036392E3837342031352E3432312039362E3431352D302E303033203131362E3639372D36372E383137203233332E3339362D3133352E363334203335302E3039322D3230332E3435322032362E3533342D31352E3432312032362E3339332D34302E3432342D302E3331352D35352E3834347A4D3435312E323932203139362E3836356C35392E3535342031382E3933382035392E3135372D33342E3935372D31382E3939342034392E3333332035362E3234352032322E3531342D37312E3239332031312E3534332D32342E3339312034382E3837342D32352E3036352D34322E3139382D37312E333220372E3639362035352E3739372D33372E3633322D31392E36392D34342E3131317A206D2D3137342E323639203137322E3735632D31322E3732362D372E3334372D32312E3330322D31372E3139382D32332E3230392D32382E3334392D342E3335372D32352E3439322032372E3737372D34382E3133352037312E3737312D35302E3537372032342E37352D312E3337342034372E39373720332E3933382036342E3334322031332E3338372031322E37323620372E3334382032312E3330332031372E3139392032332E3230382032382E333520342E3335382032352E3439312D32372E3737312034382E3133382D37312E37372035302E3537362D32342E373520312E3337342D34372E3937352D332E3933382D36342E3334322D31332E3338377A206D3235352E373635203136332E3738396C2D3135352E35382D38392E383235203231312E3635322D33322E3837362D35362E303732203132322E3730317A4D3638382E333636203432382E36386C2D3132382E3435342D37342E313633203132372E3631372D37342E313636203132382E3435362037342E3136352D3132372E3631392037342E3136347A2220702D69643D2231353331223E3C2F706174683E3C7061746820643D224D3934312E353436203435382E3438632D302E3037322032352E39352D302E3134362035312E3839362D302E3232312037372E3834372D302E30332031302E3933392D372E3231392032312E3836312D32312E35382033302E3230376C302E3232312D37372E3834396331342E33362D382E3334352032312E35352D31392E3236372032312E35382D33302E3230357A4D3130322E343838203533352E3930326C302E3232312D37372E383438632D302E3033312031312E30383220372E3238342032322E31382032312E39332033302E3633366C2D302E3232312037372E383437632D31342E3634372D382E3435352D32312E3936312D31392E3535342D32312E39332D33302E3633357A2220702D69643D2231353332223E3C2F706174683E3C7061746820643D224D3931392E393636203438382E3638366C2D302E3232312037372E3834392D3334342E303136203139392E393220302E3232312D37372E383438203334342E3031362D3139392E3932317A4D3437302E393034203638382E3630366C2D302E3232312037372E3834382D3334362E3236362D3139392E39313720302E3232312D37372E3834376136313533323630342E35392036313533323630342E3539203020302030203334362E323636203139392E3931367A4D3537352E3935203638382E3630366C2D302E3232312037372E383438632D32382E3931352031362E3830332D37352E3934322031362E3830332D3130352E30343620306C302E3232312D37372E3834386332392E3130342031362E3830332037362E3133312031362E383033203130352E30343620307A2220702D69643D2231353333223E3C2F706174683E3C7061746820643D224D3934312E353436203539362E343234632D302E3037322032352E39352D302E3134362035312E3839362D302E3232312037372E3834372D302E30332031302E3933392D372E3231392032312E3836312D32312E35382033302E3230376C302E3232312D37372E3834396331342E33362D382E3334342032312E35352D31392E3236372032312E35382D33302E3230357A4D3130322E343838203637332E3834366C302E3232312D37372E383438632D302E3033312031312E30383120372E3238342032322E31382032312E39332033302E3633356C2D302E3232312037372E383438632D31342E3634372D382E3435362D32312E3936312D31392E3535352D32312E39332D33302E3633357A2220702D69643D2231353334223E3C2F706174683E3C7061746820643D224D3931392E393636203632362E3632396C2D302E3232312037372E3834392D3334342E303136203139392E393220302E3232312D37372E383438203334342E3031362D3139392E3932317A4D3437302E393034203832362E35356C2D302E3232312037372E3834384C3132342E343137203730342E34386C302E3232312D37372E3834384C3437302E393034203832362E35357A4D3537352E3935203832362E35356C2D302E3232312037372E383438632D32382E3931352031362E3830342D37352E3934322031362E3830342D3130352E30343620306C302E3232312D37372E3834386332392E3130342031362E3830342037362E3133312031362E383034203130352E30343620307A2220702D69643D2231353335223E3C2F706174683E3C7061746820643D224D3934302E383535203336312E3333346C2D302E3133362034372E363336632D302E30303120302E322D302E30303420302E342D302E303120302E366C302E3133362D34372E36333763302E3030362D302E3220302E3030392D302E3420302E30312D302E3539392220702D69643D2231353336223E3C2F706174683E3C7061746820643D224D3934302E383436203336312E3933336C2D302E3133362034372E3633376132332E3136362032332E3136362030203020312D302E34343620332E3931316C302E3133352D34372E36333763302E32362D312E32393920302E3430392D322E36303420302E3434372D332E3931314D3934302E333938203336352E3834336C2D302E3133352034372E3633376132342E3932332032342E3932332030203020312D312E31303120332E3833386C302E3133352D34372E3633376132342E37382032342E373820302030203020312E3130312D332E3833382220702D69643D2231353337223E3C2F706174683E3C7061746820643D224D3933392E323938203336392E3638326C2D302E3133352034372E3633376132382E3030332032382E3030332030203020312D312E38313620332E3837356C302E3133322D34372E3633366132372E3537332032372E35373320302030203020312E3831392D332E3837362220702D69643D2231353338223E3C2F706174683E3C7061746820643D224D3933372E343739203337332E353538632D302E3034342031352E3837382D302E3038392033312E3735372D302E3133322034372E3633366133322E3134352033322E3134352030203020312D322E37343420342E3037346C302E3133362D34372E3633376133322E3133342033322E31333420302030203020322E37342D342E3037334D3933342E373338203337372E3633316C2D302E3133362034372E3633376133392E3337352033392E3337352030203020312D342E32323820342E3534366C302E3133352D34372E3633376133392E3034332033392E30343320302030203020342E3232392D342E3534362220702D69643D2231353339223E3C2F706174683E3C7061746820643D224D3933302E3531203338322E3137376C2D302E3133352034372E363337632D322E34343220322E3235362D352E33323220342E342D382E36333220362E3339326C302E3133352D34372E36333763332E33312D312E39393120362E3138372D342E31333620382E3633322D362E3339322220702D69643D2231353430223E3C2F706174683E3C7061746820643D224D3932312E383738203338382E353638632D302E3034352031352E3837392D302E3038382033312E3735382D302E3133352034372E3633372D302E32373420302E3136352D302E353520302E33332D302E38333320302E3439326C302E3133352D34372E36333763302E32382D302E31363220302E3535392D302E33323620302E3833332D302E3439322220702D69643D2231353431223E3C2F706174683E3C7061746820643D224D3132322E313536203338392E3036386C2D302E3133342034372E363337632D31332E3434342D372E3736322D32302E3135382D31372E3934392D32302E3132382D32382E3132316C302E3133342D34372E363336632D302E3032392031302E31373220362E3638352032302E3335382032302E3132382032382E31322220702D69643D2231353432223E3C2F706174683E3C7061746820643D224D3932312E303435203338392E3036316C2D302E3133352034372E3633374C3537302E383137203634302E31356C302E3133362D34372E363338633131362E3639372D36372E383137203233332E3339352D3133352E363333203335302E3039322D3230332E3435317A2220702D69643D2231353433223E3C2F706174683E3C7061746820643D224D3437342E353338203539322E3531366C2D302E3133352034372E3633392D3335322E3338312D3230332E34343920302E3133342D34372E363337203335322E333832203230332E3434377A2220702D69643D2231353434223E3C2F706174683E3C7061746820643D224D3537302E393533203539322E3531336C2D302E3133362034372E363338632D342E353520322E3634322D392E35383420342E3833322D31342E39343220362E3536386C302E3133372D34372E36333563352E3335352D312E3733382031302E3339322D332E3932392031342E3934312D362E3537314D3535362E303132203539392E3038346C2D302E3133372034372E363335632D342E31333720312E3334342D382E34363520322E3431332D31322E39303920332E3231366C302E3133362D34372E3633396139382E3831332039382E3831332030203020302031322E39312D332E3231322220702D69643D2231353435223E3C2F706174683E3C7061746820643D224D3534332E313032203630322E3239366C2D302E3133362034372E363339632D322E38353620302E3531352D352E37363520302E3931382D382E36393520312E32316C302E3133352D34372E36333763322E3933312D302E32393320352E3833382D302E36393520382E3639362D312E3231324D3533342E343035203630332E3530386C2D302E3133352034372E363337632D322E35303520302E32352D352E30323820302E3431382D372E35363120302E3530336C302E3133342D34372E363336613131372E3038203131372E303820302030203020372E3536322D302E3530342220702D69643D2231353436223E3C2F706174683E3C7061746820643D224D3532362E383434203630342E3031326C2D302E3133342034372E363336613131372E38203131372E382030203020312D362E39383320302E3033346C302E3133342D34372E36333763322E33323720302E30353620342E36353920302E30343720362E3938332D302E3033334D3531392E3836203630342E3034356C2D302E3133342034372E363337613132302E393338203132302E3933382030203020312D362E3731342D302E3335396C302E3133342D34372E36333863322E323320302E31383320342E343720302E33303520362E37313420302E33362220702D69643D2231353437223E3C2F706174683E3C7061746820643D224D3531332E313436203630332E3638356C2D302E3133342034372E363338613131352E393839203131352E3938392030203020312D362E3632392D302E3734326C302E3133362D34372E36333863322E31393120302E33313220342E34303320302E35353820362E36323720302E3734322220702D69643D2231353438223E3C2F706174683E3C7061746820643D224D3530362E3532203630322E3934326C2D302E3133362034372E363338613130382E3531203130382E35312030203020312D362E3735382D312E3137346C302E3133352D34372E36333963322E32323320302E34363220342E34373920302E38353420362E37353920312E3137352220702D69643D2231353439223E3C2F706174683E3C7061746820643D224D3439392E373631203630312E3736386C2D302E3133352034372E363339613130312E303535203130312E3035352030203020312D372E31312D312E3734346C302E3133342D34372E36333663322E33323420302E36363120342E36393820312E32343120372E31313120312E3734314D3439322E3635203630302E3032366C2D302E3133342034372E3633366138392E3334312038392E3334312030203020312D382E3237382D322E3739346C302E3133362D34372E3633376138382E3133332038382E31333320302030203020382E32373620322E3739352220702D69643D2231353530223E3C2F706174683E3C7061746820643D224D3438342E333733203539372E323331632D302E3034352031352E3837392D302E3038392033312E3735382D302E3133362034372E3633372D332E3436322D312E3336382D362E3735372D322E3933392D392E3833342D342E3731346C302E3133352D34372E36333963332E30373720312E37373820362E33373120332E33343820392E38333520342E3731362220702D69643D2231353531223E3C2F706174683E3C7061746820643D224D3932302E3733203333332E3231374C3536382E3335203132392E3737632D32362E3731362D31352E3432352D36392E38382D31352E3432352D39362E3431362D302E3030344C3132312E383431203333332E323137632D32362E35342031352E3432342D32362E3339392034302E34323620302E3331342035352E3835316C3335322E333833203230332E3434386332362E3730392031352E3432322036392E3837342031352E3432312039362E3431352D302E303033203131362E3639372D36372E383137203233332E3339362D3133352E363334203335302E3039322D3230332E3435322032362E3533342D31352E3432312032362E3339332D34302E3432342D302E3331352D35352E3834347A4D3435312E323932203139362E3836356C35392E3535342031382E3933382035392E3135372D33342E3935372D31382E3939342034392E3333332035362E3234352032322E3531342D37312E3239332031312E3534332D32342E3339312034382E3837342D32352E3036352D34322E3139382D37312E333220372E3639362035352E3739372D33372E3633322D31392E36392D34342E3131317A206D2D3137342E323639203137322E3735632D31322E3732362D372E3334372D32312E3330322D31372E3139382D32332E3230392D32382E3334392D342E3335372D32352E3439322032372E3737372D34382E3133352037312E3737312D35302E3537372032342E37352D312E3337342034372E39373720332E3933382036342E3334322031332E3338372031322E37323620372E3334382032312E3330332031372E3139392032332E3230382032382E333520342E3335382032352E3439312D32372E3737312034382E3133382D37312E37372035302E3537362D32342E373520312E3337342D34372E3937352D332E3933382D36342E3334322D31332E3338377A206D3235352E373635203136332E3738396C2D3135352E35382D38392E383235203231312E3635322D33322E3837362D35362E303732203132322E3730317A4D3638382E333636203432382E36386C2D3132382E3435342D37342E313633203132372E3631372D37342E313636203132382E3435362037342E3136352D3132372E3631392037342E3136347A2220702D69643D2231353532223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.source.JavascriptSimulateMapSourceJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.source.JavascriptSimulateMapSourceJob\",\"inTypes\":null,\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"JavascriptSimulateMapSourceJob\",\"type\":\"streaming\",\"role\":\"source\",\"category\":\"\",\"display\":\"JS数据发生器\",\"description\":\"设置javascript脚本,周期性运行,从而产生json数据\",\"doc\":\"JavascriptSimulateMapSourceJob.md\",\"icon\":\"JavascriptProcessJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"script\",\"label\":\"js脚本\",\"type\":[\"STRING\"],\"description\":\"javascript脚本代码。脚本最后一行就是返回的json对象(不需要return关键字),该对象会被发往下游。可以通过返回数组一次性发送多条数据\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"JAVASCRIPT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"ignoreException\",\"label\":\"忽略异常\",\"type\":[\"BOOL\"],\"description\":\"是否忽略执行脚本过程过的异常。如果异常抛出可能会使得任务失败\",\"optional\":true,\"defaultValue\":\"true\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"interval\",\"label\":\"间隔执行时间(毫秒)\",\"type\":[\"INT\"],\"description\":\"执行脚本的间隔时间,单位为毫秒\",\"optional\":true,\"defaultValue\":\"1000\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'source', '', 0x23204A53E695B0E68DAEE58F91E7949FE599A8286A736F6E290A0AE4BDBFE794A86A617661736372697074E8849AE69CACE69DA5E7949FE68890E6A8A1E68B9FE695B0E68DAEE38082E794B1E4BA8EE8849AE69CACE6AF94E8BE83E781B5E6B4BBEFBC8CE58FAFE4BBA5E696B9E4BEBFE59CA8E7949FE68890E6A8A1E68B9FE695B0E68DAEE79A84E697B6E58099E6A48DE585A5E980BBE8BE91E380820A6A73E4BBA3E7A081E79A84E69C80E5908EE4B880E8A18CE7BB93E69E9CE4BC9AE4BD9CE4B8BAE69C80E7BB88E7BB93E69E9CE8BF94E59B9EEFBC8CE58FAFE4BBA5E698AFE4B880E4B8AAE5AFB9E8B1A1EFBC8CE4B99FE58FAFE4BBA5E698AFE4B880E4B8AAE695B0E7BB84E38082E5A682E69E9CE698AFE695B0E7BB84EFBC8CE6AF8FE6ACA1E4BC9AE4BAA7E7949FE5A49AE69DA1E695B0E68DAEE380820A6A73E5BC95E6938E286E6173686F726E29E5AE8CE585A8E694AFE68C812045434D4153637269707420352E3120E8A784E88C83E4BBA5E58F8AE4B880E4BA9BE689A9E5B195E380820A0AE4BE8BE5A682EFBC8CE4BDBFE794A8E5A682E4B88BE8849AE69CAC0A0A6060606A6176617363726970740A76617220636F6465203D205B22323030222C2022313031222C2022343034222C2022353030222C2022343033225D3B0A7661722061203D207B0A0974696D657374616D703A206E6577204461746528292E67657454696D6528292C200A0962797465733A204D6174682E666C6F6F72284D6174682E72616E646F6D2829202A20313031292C0A09636F64653A20636F64655B4D6174682E666C6F6F72284D6174682E72616E646F6D2829202A2035295D0A7D3B0A610A6060600A0AE5AFB9E5BA94E7949FE68890E5A682E4B88BE7A4BAE4BE8BE695B0E68DAE0A0A6060600A7B22636F6465223A22343033222C226279746573223A36322E302C2274696D657374616D70223A312E3630363230383632373232384531327D0A7B22636F6465223A22343033222C226279746573223A31322E302C2274696D657374616D70223A312E3630363230383632393032384531327D0A7B22636F6465223A22313031222C226279746573223A36362E302C2274696D657374616D70223A312E3630363230383632393534364531327D0A7B22636F6465223A22343034222C226279746573223A33322E302C2274696D657374616D70223A312E3630363230383633303035324531327D0A7B22636F6465223A22353030222C226279746573223A31352E302C2274696D657374616D70223A312E3630363230383633303535374531327D0A7B22636F6465223A22323030222C226279746573223A31352E302C2274696D657374616D70223A312E3630363230383633313036314531327D0A7B22636F6465223A22313031222C226279746573223A36362E302C2274696D657374616D70223A312E3630363230383633313536354531327D0A7B22636F6465223A22323030222C226279746573223A392E302C2274696D657374616D70223A312E36303632303836333230374531327D0A7B22636F6465223A22353030222C226279746573223A38372E302C2274696D657374616D70223A312E3630363230383633323537334531327D0A6060600A0AE4BE8BE5A682EFBC8CE4BDBFE794A8E4B88BE99DA2E4BBA3E7A081E58FAFE4BBA5E4BAA7E7949FE585B7E5A487E4B880E5AE9AE99A8FE69CBAE680A7E79A84E4BAA4E69893E4B8B2E88194E695B0E68DAE0A0A6060600A446174652E70726F746F747970652E466F726D6174203D2066756E6374696F6E2028666D7429207B202F2F617574686F723A206D65697A7A0A20202020766172206F203D207B0A2020202020202020224D2B223A20746869732E6765744D6F6E74682829202B20312C202F2FE69C88E4BBBD0A202020202020202022642B223A20746869732E6765744461746528292C202F2FE697A50A202020202020202022682B223A20746869732E676574486F75727328292C202F2FE5B08FE697B60A2020202020202020226D2B223A20746869732E6765744D696E7574657328292C202F2FE588860A202020202020202022732B223A20746869732E6765745365636F6E647328292C202F2FE7A7920A202020202020202022712B223A204D6174682E666C6F6F722828746869732E6765744D6F6E74682829202B203329202F2033292C202F2FE5ADA3E5BAA60A20202020202020202253223A20746869732E6765744D696C6C697365636F6E64732829202F2FE6AFABE7A7920A202020207D3B0A20202020696620282F28792B292F2E7465737428666D74292920666D74203D20666D742E7265706C616365285265674578702E24312C2028746869732E67657446756C6C596561722829202B202222292E7375627374722834202D205265674578702E24312E6C656E67746829293B0A20202020666F722028766172206B20696E206F290A2020202020202020696620286E65772052656745787028222822202B206B202B20222922292E7465737428666D74292920666D74203D20666D742E7265706C616365285265674578702E24312C20285265674578702E24312E6C656E677468203D3D203129203F20286F5B6B5D29203A20282822303022202B206F5B6B5D292E73756273747228282222202B206F5B6B5D292E6C656E6774682929293B0A2020202072657475726E20666D743B0A7D0A76617220726E645F7069636B203D2066756E6374696F6E2863616E6469646174657329207B2072657475726E2063616E646964617465735B4D6174682E666C6F6F72284D6174682E72616E646F6D2829202A2063616E646964617465732E6C656E677468295D3B207D3B0A766172207431203D206E6577204461746528293B200A766172207432203D206E657720446174652874312E67657454696D652829202B204D6174682E666C6F6F72284D6174682E72616E646F6D2829202A2031303029293B0A7661722070726F7669646572203D205B22313030303032222C2022313030303033222C2022313030303034222C202278787878787878225D3B0A76617220636F6465203D205B2230303032222C202230303031222C202230303030225D3B0A766172207472616E73203D205B22746331222C2022746332222C2022746333222C2022746334222C2022746335222C2022746336225D3B0A76617220666C6167203D205B2230222C202231225D3B0A7661722066203D20726E645F7069636B28666C6167293B0A766172206D6573736167654964203D2074312E67657454696D652829202B2022223B0A5B7B74696D653A2074312E466F726D61742822797979792D4D4D2D64642068683A6D6D3A73732E5322292C206D65737361676549643A206D65737361676549642C20747970653A20227265717565737422202C2070726F76696465723A20726E645F7069636B2870726F7669646572292C207472616E733A20726E645F7069636B287472616E73292C20666C61673A2066207D2C0A7B74696D653A2074322E466F726D61742822797979792D4D4D2D64642068683A6D6D3A73732E5322292C206D65737361676549643A206D65737361676549642C20747970653A2022726573706F6E7365222C2070726F76696465723A20726E645F7069636B2870726F7669646572292C20636F64653A20726E645F7069636B28636F6465292C207472616E733A20726E645F7069636B287472616E73292C20666C61673A2066207D5D0A6060600A0A2D20E4B88AE8BFB0E4BE8BE5AD90E4BDBFE794A86070726F746F7479706560E4B8BA44617465E5A29EE58AA0E4BA86466F726D6174E696B9E6B395EFBC8CE4BBA5E8BE93E587BAE6A0BCE5BC8FE58C96E79A84E697B6E997B40A2D20E99A8FE69CBAE4BAA7E7949F3130306D73E4BBA5E58685E79A84E99A8FE69CBA22E697B6E5BBB6220A2D20E9809AE8BF87E8BF94E59B9EE695B0E7BB84EFBC8CE58FAFE4BBA5E5908CE697B6E4BAA7E7949FE68890E5AFB9E79A84E79A84E8AFB7E6B182E5938DE5BA94E6B688E681AF0A0AE4B88BE99DA2E698AFE6A0B7E4BE8BE8BE93E587BAEFBC9A0A0A6060600A7B22666C6167223A2230222C2270726F7669646572223A2278787878787878222C226D6573736167654964223A2231363036353638373536393636222C2274696D65223A22323032302D31312D32382032313A30353A35362E393636222C2274797065223A2272657175657374222C227472616E73223A22746331227D0A7B22636F6465223A2230303030222C22666C6167223A2230222C2270726F7669646572223A22313030303034222C226D6573736167654964223A2231363036353638373536393636222C2274696D65223A22323032302D31312D32382032313A30353A35362E393834222C2274797065223A22726573706F6E7365222C227472616E73223A22746334227D0A7B22666C6167223A2230222C2270726F7669646572223A2278787878787878222C226D6573736167654964223A2231363036353638373538313439222C2274696D65223A22323032302D31312D32382032313A30353A35382E313439222C2274797065223A2272657175657374222C227472616E73223A22746332227D0A7B22636F6465223A2230303030222C22666C6167223A2230222C2270726F7669646572223A22313030303034222C226D6573736167654964223A2231363036353638373538313439222C2274696D65223A22323032302D31312D32382032313A30353A35382E323030222C2274797065223A22726573706F6E7365222C227472616E73223A22746336227D0A7B22666C6167223A2230222C2270726F7669646572223A2278787878787878222C226D6573736167654964223A2231363036353638373538363635222C2274696D65223A22323032302D31312D32382032313A30353A35382E363635222C2274797065223A2272657175657374222C227472616E73223A22746333227D0A7B22636F6465223A2230303032222C22666C6167223A2230222C2270726F7669646572223A22313030303033222C226D6573736167654964223A2231363036353638373538363635222C2274696D65223A22323032302D31312D32382032313A30353A35382E373037222C2274797065223A22726573706F6E7365222C227472616E73223A22746336227D0A7B22666C6167223A2230222C2270726F7669646572223A22313030303034222C226D6573736167654964223A2231363036353638373539313734222C2274696D65223A22323032302D31312D32382032313A30353A35392E313734222C2274797065223A2272657175657374222C227472616E73223A22746334227D0A7B22636F6465223A2230303031222C22666C6167223A2230222C2270726F7669646572223A22313030303032222C226D6573736167654964223A2231363036353638373539313734222C2274696D65223A22323032302D31312D32382032313A30353A35392E313934222C2274797065223A22726573706F6E7365222C227472616E73223A22746332227D0A7B22666C6167223A2231222C2270726F7669646572223A22313030303032222C226D6573736167654964223A2231363036353638373539363831222C2274696D65223A22323032302D31312D32382032313A30353A35392E363831222C2274797065223A2272657175657374222C227472616E73223A22746335227D0A7B22636F6465223A2230303032222C22666C6167223A2231222C2270726F7669646572223A22313030303032222C226D6573736167654964223A2231363036353638373539363831222C2274696D65223A22323032302D31312D32382032313A30353A35392E373132222C2274797065223A22726573706F6E7365222C227472616E73223A22746334227D0A7B22666C6167223A2230222C2270726F7669646572223A2278787878787878222C226D6573736167654964223A2231363036353638373630313839222C2274696D65223A22323032302D31312D32382032313A30363A30302E313839222C2274797065223A2272657175657374222C227472616E73223A22746333227D0A606060, 0x3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D227574662D38223F3E0D0A3C212D2D2047656E657261746F723A2041646F626520496C6C7573747261746F722031362E302E342C20535647204578706F727420506C75672D496E202E205356472056657273696F6E3A20362E3030204275696C6420302920202D2D3E0D0A3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E0D0A3C7376672076657273696F6E3D22312E31222069643D224C617965725F312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B2220783D223070782220793D22307078220D0A092077696474683D22313236707822206865696768743D223132367078222076696577426F783D2230203020313236203132362220656E61626C652D6261636B67726F756E643D226E65772030203020313236203132362220786D6C3A73706163653D227072657365727665223E0D0A3C7061746820643D224D39382E3237372C33342E343434632D302E3030342D302E3436392D302E3135342D302E39332D302E3437352D312E3239354C37382E3133372C31302E363834632D302E3030362D302E3030362D302E3031322D302E3030382D302E3031362D302E3031340D0A09632D302E3131372D302E3133312D302E3235342D302E32342D302E3339382D302E333334632D302E3034332D302E3032392D302E3038362D302E3035332D302E3133312D302E303738632D302E3132352D302E3036382D302E3235382D302E3132352D302E3339352D302E3136360D0A09632D302E3033372D302E30312D302E30372D302E3032352D302E3130372D302E3033354337362E3934312C31302E3032322C37362E3738372C31302C37362E3633312C31304832382E323939632D322E3230372C302D342C312E3739352D342C3476393463302C322E3230352C312E3739332C342C342C346836360D0A0963322E3230352C302C342D312E3739352C342D345633342E3636374339382E3239392C33342E3539322C39382E3238372C33342E3531382C39382E3237372C33342E3434347A204D34382E3038362C3130362E353038632D312E3238352C302D322E3937332D302E3231392D342E3037342D302E3538360D0A096C302E3632352D342E35313463302E37372C302E3235382C312E37362C302E3434312C322E3836312C302E34343163322E3334382C302C332E3831342D312E3036362C332E3831342D342E3931385638312E33373768352E3537387631352E36323968302E3030310D0A094335362E3839312C3130342E3035312C35332E3531362C3130362E3530382C34382E3038362C3130362E3530387A204D36372E3630342C3130362E343731632D322E3832342C302D352E36312D302E3733342D372E3030352D312E3530346C312E3133372D342E3632330D0A0963312E3530342C302E3737312C332E3831362C312E3534312C362E3230312C312E35343163322E3536382C302C332E3932342D312E3036322C332E3932342D322E36373863302D312E3534312D312E3137342D322E3432322D342E3134352D332E3438340D0A09632D342E3130392D312E3433322D362E3738372D332E3730352D362E3738372D372E33303163302D342E3231392C332E3532312D372E3434372C392E3335342D372E34343763322E3738382C302C342E3834342C302E3538362C362E3331312C312E3234386C2D312E3234352C342E3531320D0A09632D302E3939322D302E3437372D322E3735322D312E3137342D352E3137352D312E313734632D322E34322C302D332E3539362C312E3130332D332E3539362C322E33383563302C312E3537362C312E3339362C322E3237352C342E3538382C332E3438340D0A0963342E3336342C312E3631352C362E34322C332E3838392C362E34322C372E3337334337372E3538342C3130322E3934392C37342E3339312C3130362E3437312C36372E3630342C3130362E3437317A204D39342E3239392C37372E393136682D36365631346834362E3333327632302E3436350D0A0963302C312E3130352C302E3839362C322C322C326831372E3636385637372E3931367A204D37362E35322C35322E373463302E3436312C302E3935362C302E3636352C312E3932332C302E3636352C332E313663302C312E3933382D302E36312C332E3438332D312E3834392C342E3637380D0A09632D312E3136332C312E3132392D322E3636352C312E3739332D342E3636372C322E303735632D302E3739372C302E3130392D322E3335372C302E3131342D332E3138392C30632D332E3138312D302E3432362D352E3533352D312E3931322D372E3034312D342E3434390D0A09632D302E3139332D302E3331362D302E3233322D302E34322D302E3138332D302E34363563302E3037392D302E3037342C332E38352D322E3234392C332E3839352D322E32343963302E30322C302C302E3136332C302E3138382C302E3332322C302E3431360D0A0963312E3135392C312E3731342C322E3630312C322E3530372C342E3533322C322E35303763312E3134352C302C322E3036362D302E3331322C322E36352D302E39303263302E3137342D302E3137332C302E3336362D302E3433312C302E3434312D302E3538340D0A0963302E3338312D302E3739332C302E3231332D312E3832382D302E3339322D322E343737632D302E34392D302E3532352D312E3235392D302E3934372D332E3332342D312E383333632D312E3531372D302E3635342D322E3339332D312E3037352D332E3033372D312E3436320D0A09632D322E3533312D312E3533312D332E3636372D332E3436332D332E3636372D362E32323863302D312E3834382C302E3537352D332E3330342C312E3737382D342E34393863312E3137312D312E3135392C322E3734312D312E3833332C342E3631332D312E3938310D0A0963302E3730392D302E3035352C302E3830382D302E3035352C312E3536312C302E30303563312E3533362C302E3131342C322E372C302E3438352C332E37392C312E32303963302E35392C302E3339322C312E3434372C312E3238332C312E3932322C312E3939360D0A0963302E3232342C302E3333372C302E3430372C302E3632342C302E3430372C302E36343563302C302E3033342D332E3630322C322E3336332D332E37332C322E343138632D302E30342C302E3031342D302E3135342D302E3131392D302E3330382D302E3336320D0A09632D302E3133342D302E3231332D302E3432312D302E3536342D302E3634352D302E373832632D302E3632392D302E3633352D312E3234382D302E3838322D322E3230342D302E383832632D302E3834322D302E3030362D312E3338372C302E3230372D312E3835372C302E3731380D0A09632D302E3332372C302E3335322D302E3437362C302E3731332D302E3531312C312E323438632D302E3033392C302E3637342C302E3134352C312E3231342C302E3537342C312E36373563302E3435312C302E34382C312E3133362C302E3835372C332E3137362C312E3733330D0A0963322E372C312E31362C342E3035332C312E3936322C352E3039382C332E3032324337352E3838372C35312E3634362C37362E3230332C35322E3038352C37362E35322C35322E37347A204D35352E3038382C33382E36393668322E34323876382E3738330D0A0963302C352E3832362D302E30322C382E3932322D302E30352C392E313939632D302E3334322C322E3733392D312E3633342C342E3538322D332E3833392C352E343735632D312E3833382C302E3733372D342E3334352C302E3739382D362E3239372C302E3134380D0A09632D312E3834372D302E3631352D332E3338332D312E3935322D342E32372D332E3732316C2D302E3134392D302E3239376C312E3935372D312E31383963312E3037352D302E3634382C312E3937322D312E3138382C312E3939312D312E3139380D0A0963302E3031362D302E3030362C302E3134352C302E3138382C302E3238382C302E34323663302E3838362C312E3531372C312E3634392C322E3035362C322E3932332C322E30353163302E3839322D302E3030352C312E3432362D302E3137392C312E3834332D302E3539350D0A0963302E3239372D302E3239372C302E3436362D302E3631392C302E3630392D312E3135396C302E3130392D302E3431316C302E3031352D382E3735396C302E30322D382E3735334835352E3038387A222F3E0D0A3C2F7376673E0D0A, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.source.JDBCSourceJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.source.JDBCSourceJob\",\"inTypes\":null,\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"JDBCSourceJob\",\"type\":\"streaming\",\"role\":\"source\",\"category\":\"\",\"display\":\"JDBC数据源\",\"description\":\"通过jdbc定时执行查询sql语句获取源数据\",\"doc\":\"JDBCSourceJob.md\",\"icon\":\"JDBCSourceJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"jdbcDriver\",\"label\":\"jdbc Driver\",\"type\":[\"STRING\"],\"description\":\"jdbc驱动的class name;需要确保对应的驱动jar包已放在 flink/lib 下\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"dataSourceUrl\",\"label\":\"数据库连接字符串\",\"type\":[\"STRING\"],\"description\":\"数据库连接字符串\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"userName\",\"label\":\"用户名\",\"type\":[\"STRING\"],\"description\":\"数据库连接用户\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"password\",\"label\":\"密码\",\"type\":[\"STRING\"],\"description\":\"数据库连接密码\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"PASSWORD\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"querySql\",\"label\":\"sql脚本\",\"type\":[\"STRING\"],\"description\":\"通过sql查询语句获取数据源\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"SQL\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"maximumPoolSize\",\"label\":\"最大连接数\",\"type\":[\"INT\"],\"description\":\"连接池最大连接数\",\"optional\":true,\"defaultValue\":\"5\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"interval\",\"label\":\"间隔查询时间\",\"type\":[\"LONG\"],\"description\":\"间隔查询时间,单位为毫秒\",\"optional\":true,\"defaultValue\":\"60000\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"incrementField\",\"label\":\"自增列\",\"type\":[\"STRING\"],\"description\":\"如果需要增量获取数据,需要指定自增列(数值类型且保持单调自增),每次查询会大于上次获取到的最大值\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"incrementStart\",\"label\":\"自增列起始值\",\"type\":[\"STRING\"],\"description\":\"可覆盖上次获取到的最大值,从指定位置开始获取数据\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'source', '', 0x23204A444243E695B0E68DAEE68EA5E585A50A0AE9809AE8BF876A646263E5AE9AE697B6E689A7E8A18CE69FA5E8AFA273716CE8AFADE58FA5E88EB7E58F96E6BA90E695B0E68DAEEFBC8CE6AF8FE6ACA1E983BDE585A8E9878FE8BF94E59B9EE69FA5E8AFA2E8AFADE58FA5E79A84E8BF94E59B9EE7BB93E69E9CE380820A0AE98082E794A8E59CBAE699AFEFBC9AE98082E794A8E4BA8EE5AD97E585B8E8A1A8E68896E7BBB4E5BAA6E8A1A8E6ADA4E7B1BBE6AF94E8BE83E5B08FE79A84E69FA5E8AFA2E7BB93E69E9CEFBC8CE5AE9AE697B6E8BF94E59B9EE585A8E9878FE695B0E68DAEEFBC9B0A0AE4B88BE6B8B8E58FAFE4BBA5E9809AE8BF87E5B9BFE692AD6A6F62EFBC88456E72696368427942726F6164636173744A6F62EFBC89E69DA5E4B8B0E5AF8CE5AD97E6AEB50A0A232320E585A8E9878FE88EB7E58F960A0AE4BE8BE5A682E9858DE7BDAEE58F82E695B0E5A682E4B88BEFBC9A0A0A6060600A7B0A202022717565727953716C22203A202273656C656374202A2066726F6D202853454C454354202A2046524F4D20696E737065725F6465762E74625F636F6E6669675F74656D706C6174652920612077686572652075706461746554696D65203E2031353737343335393137363236222C0A2020226A64626344726976657222203A2022636F6D2E6D7973716C2E6A6462632E447269766572222C0A20202270617373776F726422203A20225573657240313233222C0A20202264617461536F7572636555726C22203A20226A6462633A6D7973716C3A2F2F3139322E3136382E33312E34363A333330362F696E737065725F6465763F636861726163746572456E636F64696E673D757466382675736553534C3D66616C736526616C6C6F774D756C7469517565726965733D74727565222C0A202022696E74657276616C22203A20313030302C0A2020226D6178696D756D506F6F6C53697A6522203A2031302C0A202022757365724E616D6522203A2022726F6F74220A7D0A6060600A0AE8BE93E587BAE7B1BBE59E8B604D61703C537472696E672C4F626A6563743E60EFBC8CE8BF94E59B9EE69FA5E8AFA2E8AFADE58FA5E68980E69C89E79A8473656C656374E58897E380820A0A232320E5A29EE9878FE88EB7E58F960A0A2D20E5BF85E9A1BBE68C87E5AE9AE887AAE5A29EE58897EFBC88696E6372656D656E744669656C64EFBC8CE695B0E580BCE7B1BBE59E8BE4B894E4BF9DE68C81E58D95E8B083E887AAE5A29EEFBC89EFBC8CE6AF8FE6ACA1E69FA5E8AFA2E4BC9AE5A4A7E4BA8EE4B88AE6ACA1E88EB7E58F96E588B0E79A84E69C80E5A4A7E580BCE380820A2D204A444243536F757263654A6F62E4BC9AE887AAE58AA8E8AEB0E5BD95E88EB7E58F96E4B88AE6ACA1E88EB7E58F96E588B0E79A84E69C80E5A4A7E887AAE5A29EE58897E580BCEFBC8CE9878DE590AFE4BBBBE58AA1E5908EE58FAFE4BBA5E887AAE58AA8E681A2E5A48DE380820A2D20E98089E5A1ABE887AAE5A29EE58897E8B5B7E5A78BE580BCEFBC88696E6372656D656E745374617274EFBC89EFBC8CE58FAFE68C87E5AE9AE4BB8EE5A4A7E4BA8EE8B5B7E5A78BE580BCE5BC80E5A78BE88EB7E58F96E695B0E68DAEE380820A0AE4BE8BE5A682E9858DE7BDAEE58F82E695B0E5A682E4B88BEFBC9A0A0A6060600A7B0A202022717565727953716C22203A202253454C454354202A2046524F4D20696E737065725F6465762E74625F636F6E6669675F74656D706C617465222C0A2020226A64626344726976657222203A2022636F6D2E6D7973716C2E6A6462632E447269766572222C0A20202270617373776F726422203A20225573657240313233222C0A20202264617461536F7572636555726C22203A20226A6462633A6D7973716C3A2F2F3139322E3136382E33312E34363A333330362F696E737065725F6465763F636861726163746572456E636F64696E673D757466382675736553534C3D66616C736526616C6C6F774D756C7469517565726965733D74727565222C0A202022696E6372656D656E744669656C6422203A202275706461746554696D65222C0A202022696E6372656D656E74537461727422203A202231353737343335393137363236222C0A202022696E74657276616C22203A20313030302C0A2020226D6178696D756D506F6F6C53697A6522203A20322C0A202022757365724E616D6522203A2022726F6F74220A7D0A6060600A, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313630393733363933373137392220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22313931302220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3438322E33203338372E356332392E3620302035382E372D312E332038362D332E3820382E392031362E352032362E362032372E342034362E382032362E362032352E382D312E312034372E312D32322E332034382E332D34382E3220312E332D32392D32312E382D35332D35302E362D35332D32352E3120302D34352E392031382E332D34392E392034322E332D32352E3620322E322D35322E3920332E342D38302E3720332E342D35382E3120302D3131332E362D352E312D3135362E332D31342E332D34372D31302E322D36322E322D32322E312D36342E312D32352E38762D333463312E392D332E382031372E312D31352E372036342E312D32352E382034322E372D392E322039382E322D31342E33203135362E332D31342E33733131332E3620352E31203135362E332031342E336334372E312031302E322036322E322032322E312036342E312032352E386C312E332031313663302E3120392E372D352E372031382E362D31342E352032322E322D34352E382031382E382D3131372E312032392E312D3230302E362032392E312D39382E3820302D3138342E322D31352E372D3232382E342D34312E396C2D342E372D322E38632D382E382D352E322D323020312E312D32302031312E3476393963302035362E39203133312E322038322E38203235332E312038322E3820362E3620302031332E322D302E312031392E382D302E32762D33322E37632D362E3520302E312D313320302E322D31392E3820302E322D3134352E3420302D3232302E342D33352E322D3232302E342D35302E32762D36372E326335322032312E39203133302E322033342E32203232302E342033342E322036322030203134392E332D352E35203231332E312D33312E352032312E342D382E372033352E312D32392E352033342E382D35322E386C2D312E332D3131362E3163302D35372E312D3135392E312D37322E332D3235332E312D37322E33732D3235332E312031352E322D3235332E312037322E3376333563302035372E31203135392E312037322E33203235332E312037322E337A222066696C6C3D22233145383845352220702D69643D2231393131223E3C2F706174683E3C7061746820643D224D3832352E33203635342E3463302D38332D36372E332D3135302E322D3135302E322D3135302E32732D3135302E322036372E332D3135302E32203135302E3263302034372032312E362038382E392035352E33203131362E342D34332E382D302E362D38352E372D312E322D39332D312E322D3134342E3420302D3231382E382D33362E312D3231382E382D35312E35762D36382E386335312E372032322E33203132392E332033342E38203231382E382033342E3820372E3220302031342E332D302E312032312E342D302E33762D33322E37632D372E3120302E322D31342E3220302E332D32312E3420302E332D393820302D3138322E372D31362D3232362E362D34322E376C2D382E392D352E34632D372D342E322D31352E3920302E382D31352E3920382E395637313863302035372E38203133302E332038342E32203235312E342038342E322031322E322030203133332032203138312E3820322E3220322E3120302E3120342E3120302E3220362E3220302E322032203020332E392D302E3120352E382D302E3120332E35203020362D302E3120372E322D302E31762D302E346337362E382D362E36203133372E312D3731203133372E312D3134392E367A4D3638312E36203737312E38682D31332E31632D36312E372D332E352D3131302E392D35342E382D3131302E392D3131372E3420302D36342E382035322E372D3131372E36203131372E362D3131372E36733131372E362035322E37203131372E36203131372E36632D302E312036322E372D34392E34203131342D3131312E32203131372E347A222066696C6C3D22233145383845352220702D69643D2231393132223E3C2F706174683E3C7061746820643D224D3734352E33203638382E37682D38352E324C363434203637322E36563537312E316833322E37563635366836382E367633322E377A222066696C6C3D22233145383845352220702D69643D2231393133223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.source.KafkaByteSourceJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.source.KafkaByteSourceJob\",\"inTypes\":null,\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"KafkaByteSourceJob\",\"type\":\"streaming\",\"role\":\"source\",\"category\":\"\",\"display\":\"Kafka数据源接入_1.9\",\"description\":\"Kafka Source 返回`Map`1. kafka message的value数据为byte数组类型,通过参数byteArrayFieldName指定输出字段名(默认为bytes)\\n2. kafka的元数据输出到参数metaFieldName指定字段名(默认为meta)\",\"doc\":\"KafkaByteSourceJob.md\",\"icon\":\"KafkaByteSourceJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"offsetMode\",\"label\":\"offset模式\",\"type\":[\"STRING\"],\"description\":\"支持四种模式读取kafka offset, 分别是: group, earliest, latest, timestamp, 其中group, 需要配置auto.offset.reset,它的值为earliest, 或者 latest, timestamp模式需要配置offsetModeTimestamp,为unix毫秒格式\",\"optional\":true,\"defaultValue\":\"group\",\"placeholder\":\"\",\"candidates\":[\"earliest\",\"latest\",\"timestamp\",\"group\"],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"offsetModeTimestamp\",\"label\":\"消费开始时间\",\"type\":[\"LONG\"],\"description\":\"当offsetMode为timestamp时, 指定的开始时间,格式:unix毫秒时间戳\",\"optional\":true,\"defaultValue\":\"0\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"offsetMode == \'timestamp\'\",\"availableCondition\":\"offsetMode == \'timestamp\'\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"topics\",\"label\":\"topics\",\"type\":[\"LIST\"],\"description\":\"消费的数据源topics列表\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":{\"apiVersion\":0,\"name\":null,\"label\":null,\"type\":[\"STRING\"],\"description\":null,\"optional\":false,\"defaultValue\":null,\"placeholder\":null,\"candidates\":null,\"inputType\":null,\"range\":null,\"regex\":null,\"order\":0,\"requireCondition\":null,\"availableCondition\":null,\"listParameter\":null,\"objectParameters\":null},\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"commitOffsetOnCheckPoint\",\"label\":\"是否要提交offset到checkpoint\",\"type\":[\"BOOL\"],\"description\":\"如果提交offset到checkpoint,异常时可恢复到上一次的checkpoint的offset重新消费,但只有在checkpoint时更新到kafka上\",\"optional\":true,\"defaultValue\":\"true\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"rebalancePartition\",\"label\":\"是否平均分发分区数据\",\"type\":[\"BOOL\"],\"description\":\"确保每个slot数据量基本一致,这样并发度可以大于topic的partition数,便于提高任务整体并发度\",\"optional\":true,\"defaultValue\":\"true\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"groupId\",\"label\":\"消费组\",\"type\":[\"STRING\"],\"description\":\"Kafka 消费数据的消费组\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"bootstrapServers\",\"label\":\"Kafka地址列表\",\"type\":[\"LIST\"],\"description\":\"Kafka server 服务器列表,多个用逗号分隔\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":{\"apiVersion\":0,\"name\":null,\"label\":null,\"type\":[\"STRING\"],\"description\":null,\"optional\":false,\"defaultValue\":null,\"placeholder\":null,\"candidates\":null,\"inputType\":null,\"range\":null,\"regex\":null,\"order\":0,\"requireCondition\":null,\"availableCondition\":null,\"listParameter\":null,\"objectParameters\":null},\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"byteArrayFieldName\",\"label\":\"kafka消息值的byte数组输出字段\",\"type\":[\"STRING\"],\"description\":\"kafka message的value数据为byte数组类型,通过参数byteArrayFieldName指定输出字段名\",\"optional\":true,\"defaultValue\":\"bytes\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"metaFieldName\",\"label\":\"kafka元数据输出字段\",\"type\":[\"STRING\"],\"description\":\"kafka的元数据输出到参数metaFieldName指定字段名\",\"optional\":true,\"defaultValue\":\"meta\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"kafkaConsumerProperties\",\"label\":\"kafka consumer配置项\",\"type\":[\"MAP\"],\"description\":\"透传kafka consumer配置项\\n可选填项请参考:https://kafka.apache.org/documentation/#consumerconfigs\",\"optional\":true,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"autoCreateTopic\",\"label\":\"自动创建topic\",\"type\":[\"BOOL\"],\"description\":\"是否自动创建topic, true: 自动,false:不创建, 默认: false\",\"optional\":true,\"defaultValue\":\"false\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"autoCreateTopicPartitions\",\"label\":\"自动创建topics分区数\",\"type\":[\"INT\"],\"description\":\"autoCreateTopic=true时,自动创建topics分区数,默认1\",\"optional\":true,\"defaultValue\":\"1\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"autoCreateTopic == true\",\"listParameter\":null,\"objectParameters\":null},{\"apiVersion\":2,\"name\":\"autoCreateTopicReplicationFactor\",\"label\":\"自动创建topics副本数\",\"type\":[\"INT\"],\"description\":\"autoCreateTopic=true时,自动创建topics副本数,默认1\",\"optional\":true,\"defaultValue\":\"1\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"autoCreateTopic == true\",\"listParameter\":null,\"objectParameters\":null}]}}', 'source', '', 0x23204B61666B61E695B0E68DAEE68EA5E585A50A0AE9809AE8BF87E9858DE7BDAE6B61666B6120636F6E73756D6572E79A84E58F82E695B0E68EA5E585A5E68C87E5AE9A746F706963E79A84E695B0E68DAEEFBC8C0AE58FAFE694AFE68C81E5A4A7E983A8E588866B61666B61E98089E9A1B9E58F82E695B0EFBC8CE5B9B6E694AFE68C8153534CE5AE89E585A8E4BCA0E8BE93E5928C5341534CE5AE89E585A8E8AEA4E8AF81E69CBAE588B6EFBC8CE585B7E4BD93E8AFB7E58F82E88083E79BB8E585B3E58F82E695B0E8AFA6E68385E380820A0AE8BE93E587BA604D61703C537472696E672C4F626A6563743E60E7B1BBE59E8BEFBC8CE585B6E4B8ADEFBC9A0A312E206B61666B61206D657373616765E79A8476616C7565E695B0E68DAEE4B8BA62797465E695B0E7BB84E7B1BBE59E8BEFBC8CE9809AE8BF87E58F82E695B06279746541727261794669656C644E616D65E68C87E5AE9AE8BE93E587BAE5AD97E6AEB5E5908DEFBC88E9BB98E8AEA4E4B8BA6279746573EFBC890A322E206B61666B61E79A84E58583E695B0E68DAEE8BE93E587BAE588B0E58F82E695B06D6574614669656C644E616D65E68C87E5AE9AE5AD97E6AEB5E5908DEFBC88E9BB98E8AEA4E4B8BA6D657461EFBC890A0AE4BE8BE5A682E9858DE7BDAEE58F82E695B0E5A682E4B88BEFBC9A0A0A6060600A7B0A2020226175746F437265617465546F70696322203A20747275652C0A2020226279746541727261794669656C644E616D6522203A20226279746573222C0A202022626F6F7473747261705365727665727322203A20226C6F63616C686F73743A35323039382C6C6F63616C686F73743A3532303938222C0A202022746F7069637322203A205B2022746F7069635465737422205D2C0A20202267726F7570496422203A20226B737431363037393131383530313634222C0A2020226F66667365744D6F646522203A20226561726C69657374222C0A2020226B61666B61436F6E73756D657250726F7065727469657322203A207B0A2020202022656E61626C652E6175746F2E636F6D6D697422203A202266616C7365222C0A202020202266657463682E6D61782E627974657322203A202239303039303030220A20207D2C0A2020226D6574614669656C644E616D6522203A20226D657461220A7D0A6060600AE585B6E4B8AD62797465E695B0E7BB84E8BE93E587BAE588B06279746573E5AD97E6AEB5EFBC8CE58583E695B0E68DAEE8BE93E587BAE588B06D657461E5AD97E6AEB5EFBC8C0AE58899E8BE93E587BAE79A84E695B0E68DAEE5A682E4B88BEFBC9A0A0A6060600A7B0A2020226279746573223A202265794A304D534936496E517849697769644449694F694A304D694973496E517A496A6F6964444D694C434A416147397A64473568625755694F694A7362324E6862476876633351694C434A41634746306143493649693932595849766247396E4C32356E615735344C32466A5932567A63793573623263694C434A41636D3933626E5674596D5679496A6F784C434A4151476C6B496A6F6961575178496977695145426B5A584E6A636D6C7764476C7662694936496A45334D6934784E6934784D6A67754D6A4D31494330674C5342624D6A5976546D39324C7A49774D546B364D5451364D4455364D544D674B7A41344D4442644945644656434176595842704C326C3062324576626D393061574E6C4C32357664476C6A5A556C75596D39344C324A31596D4A735A556C75596D393449456855564641764D533478494451774D5341304D69426F644852774F6938764D546B794C6A45324F4334794D5334784D7A49766247396E6157342F636D563064584A7556584A7350535579526E4E356333526C62535579526E4E6C64485270626D647A4A544E47644746696157356B5A58676C4D30516C4D6A56464E5355794E5546454A5449314F54676C4D6A56464E5355794E5467794A5449315154676C4D6A56464E5355794E546C444A544931516A416C4D6A56464E5355794E546C454A5449314F44416C4D6A56464E7955794E5546464A5449315154456C4D6A56464E7955794E546B774A5449314F4459675457393661577873595338314C6A41674B45316859326C756447397A61447367535735305A5777675457466A49453954494667674D5442664D5452664D796B6751584277624756585A574A4C615851764E544D334C6A4D324943684C5346524E5443776762476C725A5342485A574E7262796B67513268796232316C4C7A63344C6A41754D7A6B774E4334354E79425459575A68636D6B764E544D334C6A4D32494463334F4467674C534973496B42306157316C63335268625841694F6A45314E6A51334D5451324F4441774D444173496E4E306157316C496A6F694D6A41784F5338344C7A49674D5441364E5467364D434A39222C0A2020226D657461223A207B0A2020202022746F706963223A20226B7374222C0A2020202022706172746974696F6E223A20302C0A20202020226F6666736574223A20302C0A202020202274696D657374616D70223A20313630373537313439373333390A20207D0A7D0A6060600A0A6B61666B61436F6E73756D657250726F70657274696573E7B1BBE59E8BE4B8BA604D61703C537472696E672C537472696E673E60EFBC8C6B6579E4B8BAE58F82E695B0E5908DEFBC8C76616C7565E7BB9FE4B880E4B8BA537472696E67E7B1BBE59E8BEFBC8C0AE58FAFE6B7BBE58AA0E585B6E4BB96E58E9FE7949F6B61666B6120636F6E73756D6572E9858DE7BDAEE9A1B9EFBC8CE585B7E4BD93E69C89E593AAE4BA9BE58FAFE98089E5A1ABE9A1B9E8AFB7E58F82E88083EFBC9A68747470733A2F2F6B61666B612E6170616368652E6F72672F646F63756D656E746174696F6E2F23636F6E73756D6572636F6E666967730A0AE4BBA5E4B88BE5B8B8E794A8E79A84E9858DE7BDAEE58F82E695B0E4BBA5E4BE9BE58F82E88083EFBC9A0A0A7C206E616D65207C206C6162656C207C2074797065207C206F7074696F6E616C207C2064656661756C742076616C7565207C206465736372697074696F6E207C0A7C203A2D2D2D207C203A2D2D2D2D207C203A2D2D2D207C203A2D2D2D2D2D2D3A207C203A2D2D2D2D2D2D2D2D2D2D2D3A207C203A2D2D2D2D2D2D2D2D2D2D207C0A7C206D61782E706F6C6C2E7265636F726473207C20E58D95E6ACA1E68B89E58F96E69C80E5A4A7E69DA1E695B0207C20696E74207C2074727565207C20353030207C204B61666B6120436C69656E7420E4BB8E204B61666B612053657276657220E58D95E6ACA1E68B89E58F96E69C80E5A4A7E69DA1E695B0207C0A7C206D61782E706F6C6C2E696E74657276616C2E6D73207C20E68B89E58F96E695B0E68DAEE8B685E697B6E697B6E995BF207C20696E74207C2074727565207C20333030303030207C204B61666B6120436C69656E7420E4BB8E4B61666B612053657276657220E68B89E58F96E695B0E68DAEE8B685E697B6E697B6E995BF2C20E58D95E4BD8DEFBC9AE6AFABE7A792207C0A7C2073657373696F6E2E74696D656F75742E6D73207C2053657373696F6EE8B685E697B6E697B6E995BF207C20696E74207C2074727565207C203130303030207C20E4B880E4B8AA4B61666B6120E4BC9AE8AF9DE79A84E8B685E697B6E697B6E995BF2C20E58D95E4BD8DEFBC9AE6AFABE7A792207C0A7C206865617274626561742E696E74657276616C2E6D73207C204B61666B61E5BF83E8B7B3E697B6E995BF207C20696E74207C2074727565207C2033303030207C204B61666B6120436C69656E74E588B04B61666B6120536572766572E5BF83E8B7B3E697B6E995BFEFBC8CE58D95E4BD8DEFBC9AE6AFABE7A792207C0A7C20656E61626C652E6175746F2E636F6D6D6974207C20E887AAE58AA8636F6D6D6974E9858DE7BDAE207C20626F6F6C65616E207C2074727565207C2074727565207C20E698AFE590A6E887AAE58AA8436F6D6D6974204B61666B61204F66667365742C20747275653A20E887AAE58AA8636F6D6D6974EFBC8C66616C73653AE4B88DE887AAE58AA8636F6D6D69742C20E99C80E8A681E6898BE5B7A5636F6D6D6974E38082E6B3A8E6848FE5BD93666C696E6BE590AFE794A8636865636B706F696E74E5908EEFBC8C666C696E6BE4BC9AE5BCBAE588B6E68A8AE8BF99E4B8AAE58F82E695B0E8AEBEE7BDAEE4B8BA66616C7365EFBC8C666C696E6BE4BC9AE68EA5E7AEA16F6666736574E79A84E68F90E4BAA4EFBC8CE59CA8E6AF8FE6ACA1636865636B706F696E74E697B6EFBC8CE4BC9AE68F90E4BAA46F6666736574E38082207C0A7C206175746F2E636F6D6D69742E696E74657276616C2E6D73207C20E887AAE58AA8636F6D6D6974E697B6E997B4E995BFE5BAA6207C20696E74207C2074727565207C2035303030207C20E5BD93656E61626C652E6175746F2E636F6D6D69743D74727565E697B6EFBC8C4B61666B61204F6666736574E887AAE58AA8436F6D6D6974E697B6E997B4E995BFE5BAA62CE58D95E4BD8DE6AFABE7A792207C0A7C2066657463682E6D61782E6279746573207C20E58D95E6ACA1E68B89E58F96E69C80E5A4A7E5AD97E88A82E695B0207C20696E74207C2074727565207C203532343238383030207C20E58D95E6ACA1E68B89E58F96E69C80E5A4A7E5AD97E88A82E695B02C20E9BB98E8AEA4EFBC9A35304D42207C0A7C206D61782E706172746974696F6E2E66657463682E6279746573207C20E58D95E58886E58CBAE69C80E5A4A7E69FA5E8AFA2E5AD97E88A82E695B0207C20696E74207C2074727565207C203532343238383030207C20E58D95E58886E58CBAE69C80E5A4A7E69FA5E8AFA2E5AD97E88A82E695B02C20E9BB98E8AEA43A2035304D42207C0A0A0AE4BBA5E4B88BE5B8B8E794A85341534CE8AEA4E8AF81E58F82E695B0E4BBA5E4BE9BE58F82E88083EFBC9A0A0A7C206E616D65207C206C6162656C207C2074797065207C206F7074696F6E616C207C2064656661756C742076616C7565207C206465736372697074696F6E207C0A7C203A2D2D2D207C203A2D2D2D2D207C203A2D2D2D207C203A2D2D2D2D2D2D3A207C203A2D2D2D2D2D2D2D2D2D2D2D3A207C203A2D2D2D2D2D2D2D2D2D2D207C0A7C2073656375726974792E70726F746F636F6C207C20E8AEA4E8AF81E58D8FE8AEAE207C20737472696E67207C2074727565207C20504C41494E54455854207C2050726F746F636F6C207573656420746F20636F6D6D756E696361746520776974682062726F6B6572732E2056616C69642076616C756573206172653A20504C41494E544558542C2053534C2C205341534C5F504C41494E544558542C205341534C5F53534C207C0A7C207361736C2E6B65726265726F732E736572766963652E6E616D65207C20E8AEA4E8AF81E69C8DE58AA1E5908D207C20737472696E67207C2074727565207C206B61666B61207C20546865204B65726265726F73207072696E636970616C206E616D652074686174204B61666B612072756E732061732E20546869732063616E20626520646566696E65642065697468657220696E204B61666B612773204A41415320636F6E666967206F7220696E204B61666B61277320636F6E6669672E207C0A7C207361736C2E6D656368616E69736D207C20E8AEA4E8AF81E7AD96E795A5207C20737472696E67207C2074727565207C20475353415049207C20E794A8E69DA5E68C87E5AE9A5341534CE8AEA4E8AF81E58D8FE8AEAEE79A84E7AD96E795A5EFBC9A47535341504920284B65726265726F7329EFBC8C504C41494EEFBC8C534352414D2D5348412D32353628E69A82E4B88DE694AFE68C8129EFBC8C534352414D2D5348412D35313228E69A82E4B88DE694AFE68C8129EFBC8C4F4155544842454152455228E69A82E4B88DE694AFE68C8129E38082205341534C206D656368616E69736D207573656420666F7220636C69656E7420636F6E6E656374696F6E732E2054686973206D617920626520616E79206D656368616E69736D20666F7220776869636820612073656375726974792070726F766964657220697320617661696C61626C652E20475353415049206973207468652064656661756C74206D656368616E69736D2E207C0A7C207361736C2E6A6161732E636F6E666967207C207361736C2E6A6161732E636F6E666967207C20737472696E67207C2074727565207C20475353415049207C20E794A8E69DA5E68C87E5AE9A5341534CE8AEA4E8AF81E9858DE7BDAEEFBC8CE4BE8BE5A682EFBC9A636F6D2E73756E2E73656375726974792E617574682E6D6F64756C652E4B7262354C6F67696E4D6F64756C65207265717569726564207573654B65795461623D747275652073746F72654B65793D74727565206B65795461623D222F6574632F73656375726974792F6B6579746162732F6B61666B615F636C69656E742E6B657974616222207072696E636970616C3D226B61666B61636C69656E7431404558414D504C452E434F4D223B202020E8AFB4E6988EEFBC9A204A414153206C6F67696E20636F6E7465787420706172616D657465727320666F72205341534C20636F6E6E656374696F6E7320696E2074686520666F726D61742075736564206279204A41415320636F6E66696775726174696F6E2066696C65732E204A41415320636F6E66696775726174696F6E2066696C6520666F726D61742069732064657363726962656420687474703A2F2F646F63732E6F7261636C652E636F6D2F6A61766173652F382F646F63732F746563686E6F7465732F6775696465732F73656375726974792F6A6773732F7475746F7269616C732F4C6F67696E436F6E66696746696C652E68746D6C222E2054686520666F726D617420666F72207468652076616C75652069733A20276C6F67696E4D6F64756C65436C61737320636F6E74726F6C466C616720286F7074696F6E4E616D653D6F7074696F6E56616C7565292A3B272E20466F722062726F6B6572732C2074686520636F6E666967206D7573742062652070726566697865642077697468206C697374656E65722070726566697820616E64205341534C206D656368616E69736D206E616D6520696E206C6F7765722D636173652E20466F72206578616D706C652C206C697374656E65722E6E616D652E7361736C5F73736C2E736372616D2D7368612D3235362E7361736C2E6A6161732E636F6E6669673D636F6D2E6578616D706C652E536372616D4C6F67696E4D6F64756C652072657175697265643B207C0A0AE4BBA5E4B88BE5B8B8E794A853534CE8AEA4E8AF81E58F82E695B0E4BBA5E4BE9BE58F82E88083EFBC9A0A0A7C206E616D65207C206C6162656C207C2074797065207C206F7074696F6E616C207C2064656661756C742076616C7565207C206465736372697074696F6E207C0A7C203A2D2D2D207C203A2D2D2D2D207C203A2D2D2D207C203A2D2D2D2D2D2D3A207C203A2D2D2D2D2D2D2D2D2D2D2D3A207C203A2D2D2D2D2D2D2D2D2D2D207C0A7C2073736C2E747275737473746F72652E6C6F636174696F6E207C2073736C2E747275737473746F72652E6C6F636174696F6E207C20737472696E67207C2074727565207C20207C20546865206C6F636174696F6E206F66207468652074727573742073746F72652066696C652E20207C0A7C2073736C2E747275737473746F72652E70617373776F7264207C2073736C2E747275737473746F72652E70617373776F7264207C20737472696E67207C2074727565207C20207C205468652070617373776F726420666F72207468652074727573742073746F72652066696C652E20496620612070617373776F7264206973206E6F74207365742061636365737320746F2074686520747275737473746F7265206973207374696C6C20617661696C61626C652C2062757420696E7465677269747920636865636B696E672069732064697361626C65642E207C0A7C2073736C2E6B65792E70617373776F7264207C2073736C2E6B65792E70617373776F7264207C20737472696E67207C2074727565207C20207C205468652070617373776F7264206F66207468652070726976617465206B657920696E20746865206B65792073746F72652066696C652E2054686973206973206F7074696F6E616C20666F7220636C69656E742E207C0A7C2073736C2E6B657973746F72652E6C6F636174696F6E207C2073736C2E6B657973746F72652E6C6F636174696F6E207C20737472696E67207C2074727565207C20207C20546865206C6F636174696F6E206F6620746865206B65792073746F72652066696C652E2054686973206973206F7074696F6E616C20666F7220636C69656E7420616E642063616E206265207573656420666F722074776F2D7761792061757468656E7469636174696F6E20666F7220636C69656E742E207C0A7C2073736C2E6B657973746F72652E70617373776F7264207C2073736C2E6B657973746F72652E70617373776F7264207C20737472696E67207C2074727565207C20207C205468652073746F72652070617373776F726420666F7220746865206B65792073746F72652066696C652E2054686973206973206F7074696F6E616C20666F7220636C69656E7420616E64206F6E6C79206E65656465642069662073736C2E6B657973746F72652E6C6F636174696F6E20697320636F6E666967757265642E20207C0A7C2073736C2E6B657973746F72652E74797065207C2073736C2E6B657973746F72652E74797065207C20737472696E67207C2074727565207C204A4B53207C205468652066696C6520666F726D6174206F6620746865206B65792073746F72652066696C652E2054686973206973206F7074696F6E616C20666F7220636C69656E742E207C0A7C2073736C2E747275737473746F72652E74797065207C2073736C2E747275737473746F72652E74797065207C20737472696E67207C2074727565207C204A4B53207C205468652066696C6520666F726D6174206F66207468652074727573742073746F72652066696C652E207C0A7C2073736C2E656E61626C65642E70726F746F636F6C73207C2073736C2E656E61626C65642E70726F746F636F6C73207C20737472696E67207C2074727565207C20544C5376312E322C544C5376312E312C544C537631207C20546865206C697374206F662070726F746F636F6C7320656E61626C656420666F722053534C20636F6E6E656374696F6E732E207C0A7C2073736C2E656E64706F696E742E6964656E74696669636174696F6E2E616C676F726974686D207C2073736C2E656E64706F696E742E6964656E74696669636174696F6E2E616C676F726974686D207C20737472696E67207C2074727565207C206874747073207C2054686520656E64706F696E74206964656E74696669636174696F6E20616C676F726974686D20746F2076616C69646174652073657276657220686F73746E616D65207573696E67207365727665722063657274696669636174652E20207C0A7C206175746F437265617465546F706963207C20E887AAE58AA8E5889BE5BBBA746F70696373207C20626F6F6C65616E207C2074727565207C2066616C7365207C20E698AFE590A6E887AAE58AA8E5889BE5BBBA746F7069632C2020747275653A20E887AAE58AA8EFBC8C66616C73653AE4B88DE5889BE5BBBA2C20E9BB98E8AEA43A2066616C7365207C0A7C206175746F437265617465546F706963506172746974696F6E73207C20E887AAE58AA8E5889BE5BBBA746F70696373E58886E58CBAE695B0207C20696E74207C2074727565207C2031207C206175746F437265617465546F7069633D74727565E697B6EFBC8CE887AAE58AA8E5889BE5BBBA746F70696373E58886E58CBAE695B02CE9BB98E8AEA431207C0A7C206175746F437265617465546F7069635265706C69636174696F6E466163746F72207C20E887AAE58AA8E5889BE5BBBA746F70696373E589AFE69CACE695B0207C20696E74207C2074727565207C2031207C206175746F437265617465546F7069633D74727565E697B6EFBC8CE887AAE58AA8E5889BE5BBBA746F70696373E589AFE69CACE695B02CE9BB98E8AEA431207C0A, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313630373035393733343931332220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D223635332220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3639332E383435333333203536372E313638632D33392E38393333333320302D37352E3630353333332031372E3636342D3130302E3039362034352E3438323636376C2D36322E37322D34342E34313663362E3635362D31382E3334363636372031302E3439362D33382E3031362031302E3439362D35382E36323420302D32302E3236363636372D332E3636393333332D33392E3539343636372D31302E3131322D35372E3638353333346C36322E3539322D34332E393436363636613133322E393932203133322E3939322030203020302039392E3838323636372034352E3232363636366337332E362030203133332E3530342D35392E383631333333203133332E3530342D3133332E353034732D35392E3930342D3133332E3530342D3133332E3530342D3133332E353034613133332E363332203133332E3633322030203020302D3132372E393537333333203137312E3433343636376C2D36322E3633343636372034332E393436363637613137322E353434203137322E3534342030203020302D3130362E3735322D36312E393934363637563236342E313036363637613133332E373137333333203133332E373137333333203020302030203130362E3032363636372D3133302E363032363637433530322E3537303636372035392E383631333333203434322E3636363636372030203336392E3036363636372030533233352E3630353333332035392E383631333333203233352E363035333333203133332E353034613133332E363332203133332E363332203020302030203130332E363337333334203133302E3030353333337637362E343538363637613137322E353836363637203137322E3538363636372030203020302D3134322E353439333334203136392E363432363637203137322E353836363637203137322E353836363637203020302030203134332E373836363637203136392E3835367638302E373235333333613133332E363734363637203133332E3637343636372030203020302D3130342E383332203133302E333034433233352E363035333333203936342E313338363637203239352E3436363636372031303234203336392E3036363636372031303234733133332E3530342D35392E383631333333203133332E3530342D3133332E353034613133332E363332203133332E3633322030203020302D3130342E3833322D3133302E333034762D38302E373235333333613137322E343538363637203137322E343538363637203020302030203130342E39362D36312E3035366C36332E3134363636362034342E373134363636613133322E393036363637203133322E3930363636372030203020302D352E3436313333332033372E35343636363763302037332E362035392E393034203133332E353034203133332E353034203133332E353034733133332E3530342D35392E383631333333203133332E3530342D3133332E3530342D35392E3934363636372D3133332E3530342D3133332E3534363636372D3133332E3530347A206D302D3331322E3134393333336333352E37313220302036342E3732353333332032392E3035362036342E3732353333342036342E373235333333732D32392E3031333333332036342E3732353333332D36342E3732353333342036342E373235333333632D33352E36363933333320302D36342E3732353333332D32392E3035362D36342E3732353333332D36342E3732353333337332392E3035362D36342E3732353333332036342E3732353333332D36342E3732353333337A4D3330342E333431333333203133332E35303463302D33352E3636393333332032392E3031333333332D36342E3732353333332036342E3732353333342D36342E3732353333337336342E3732353333332032392E3035362036342E3732353333332036342E3732353333332D32392E3031333333332036342E3732353333332D36342E3732353333332036342E3732353333332D36342E3732353333332D32392E3035362D36342E3732353333342D36342E3732353333337A206D3132392E343530363637203735362E39393263302033352E3636393333332D32392E3031333333332036342E3732353333332D36342E3732353333332036342E373235333333732D36342E3732353333332D32392E3035362D36342E3732353333342D36342E3732353333332032392E3031333333332D36342E3732353333332036342E3732353333342D36342E3732353333332036342E3732353333332032392E3035362036342E3732353333332036342E3732353333337A4D3336392E303636363637203539392E3839333333336139302E3336382039302E3336382030203020312D39302E3238323636372D39302E32383236363663302D34392E3739322034302E3439303636372D39302E3238323636372039302E3238323636372D39302E3238323636372034392E37393220302039302E3238323636372034302E3439303636372039302E3238323636362039302E3238323636374139302E3336382039302E333638203020302031203336392E303636363637203539392E3839333333337A206D3332342E373738363636203136352E3530346136342E3831303636372036342E3831303636372030203020312D36342E3732353333332D36342E37323533333363302D33352E3636393333332032392E3031333333332D36342E3732353333332036342E3732353333332D36342E3732353333337336342E3732353333332032392E3035362036342E3732353333342036342E37323533333363302033352E3636393333332D32392E3031333333332036342E3732353333332D36342E3732353333342036342E3732353333337A2220702D69643D22363534223E3C2F706174683E3C2F7376673E, 'flink-job-1_9_jars'); +INSERT INTO `tb_job` VALUES ('com.eoi.jax.flink.job.source.WebsocketSourceJob', 'streaming', '{\"jobName\":\"com.eoi.jax.flink.job.source.WebsocketSourceJob\",\"inTypes\":null,\"outTypes\":[{\"raw\":\"org.apache.flink.streaming.api.datastream.DataStream\",\"parameterizedTypes\":[\"java.util.Map\"]}],\"experimantal\":null,\"jobInfo\":{\"apiVersion\":2,\"name\":\"WebsocketDebugSourceJob\",\"type\":\"streaming\",\"role\":\"source\",\"category\":\"\",\"display\":\"Websocket消息源\",\"description\":\"从指定的Websocket服务端处获取输入。连接到Websocket服务端后,该算子接收服务端推送过来的json字符串作为消息。内部采用这个实现调试功能。\",\"doc\":\"WebsocketSourceJob.md\",\"icon\":\"WebsocketSourceJob.svg\",\"internal\":false},\"parameters\":{\"parameters\":[{\"apiVersion\":2,\"name\":\"uri\",\"label\":\"uri\",\"type\":[\"STRING\"],\"description\":\"websocket地址\",\"optional\":false,\"defaultValue\":\"\",\"placeholder\":\"\",\"candidates\":[],\"inputType\":\"TEXT\",\"range\":\"\",\"regex\":\"\",\"order\":0,\"requireCondition\":\"\",\"availableCondition\":\"\",\"listParameter\":null,\"objectParameters\":null}]}}', 'source', '', 0x2320576562736F636B6574E695B0E68DAEE68EA5E585A50A0AE68EA5E694B6576562736F636B6574E695B0E68DAEE38082E99C80E8A681E68C87E5AE9A576562736F636B657420536572766572E59CB0E59D80EFBC8C4A6F62E4BC9AE68EA5E694B6E69DA5E887AAE68C87E5AE9A736572766572E68EA8E98081E8BF87E69DA5E79A84E4BFA1E681AFEFBC8CE6B688E681AFE9A1BBE4B8BA4A736F6EE6A0BCE5BC8FE380820A, 0x3C3F786D6C2076657273696F6E3D22312E3022207374616E64616C6F6E653D226E6F223F3E3C21444F435459504520737667205055424C494320222D2F2F5733432F2F4454442053564720312E312F2F454E222022687474703A2F2F7777772E77332E6F72672F47726170686963732F5356472F312E312F4454442F73766731312E647464223E3C73766720743D22313630383836313039373631302220636C6173733D2269636F6E222076696577426F783D2230203020313032342031303234222076657273696F6E3D22312E312220786D6C6E733D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220702D69643D22313734362220786D6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939392F786C696E6B222077696474683D2232303022206865696768743D22323030223E3C646566733E3C7374796C6520747970653D22746578742F637373223E3C2F7374796C653E3C2F646566733E3C7061746820643D224D3332302034323068313532563235364831323876353132683334345634383448333230563531326C2D39362E3035362D36344C333230203338347633367A206D34343820313932682D36345637363868313932563235364837303476323932683634762D33362E3134346C39362036342E3037322D39362036332E3932563631327A206D2D3132382D313932563230386131362031362030203020312031362D313668323838613136203136203020302031203136203136763630386131362031362030203020312D3136203136483635366131362031362030203020312D31362D31365636313248353336563831366131362031362030203020312D31362031364838306131362031362030203020312D31362D3136563230386131362031362030203020312031362D31366834343061313620313620302030203120313620313676323132683130347A206D302036344835333676363468313034762D36347A2220702D69643D2231373437223E3C2F706174683E3C2F7376673E, 'flink-job_jars'); + + +INSERT INTO tb_pipeline (pipeline_name,cluster_name,opts_name,pipeline_type,pipeline_source,pipeline_config,start_cmd,pipeline_ui,pipeline_status,internal_status,pipe_description,flink_save_point,flink_check_point,flink_job_id,spark_rest_url,spark_submission_id,spark_app_id,yarn_app_id,track_url,flink_save_point_incompatible,flink_save_point_disable,deleting,processing,process_time,trigger_by,create_time,create_by,update_time,update_by) VALUES + ('AccessLogTransform_Demo','flink_19_standalone_cluster',NULL,'streaming',NULL,'{"jobs":[{"jobId":"source1609903041037","jobName":"com.eoi.jax.flink.job.source.JavascriptSimulateMapSourceJob","jobConfig":{"interval":200,"ignoreException":false,"script":"var ipList = [\\"192.168.1.1\\",\\"220.248.44.62\\",\\"169.235.24.133\\"];\\nvar respList = [\\"200\\",\\"200\\",\\"200\\",\\"302\\",\\"401\\",\\"403\\",\\"500\\",\\"502\\"];\\nvar bytesList = [100,10240,1024*10240];\\n\\nvar log = ipList[Math.floor(Math.random() * 3)] + \\" - - [30/Apr/1998:22:01:53 +0000] \\\\\\"GET /english/venues/cities/images/montpellier/19.gif HTTP/1.0\\\\\\" \\" + respList[Math.floor(Math.random() * 8)] + \\" \\" + Math.random() * bytesList[Math.floor(Math.random() * 3)];\\nvar line = {\\n\\tmessage: log\\n};\\nline"},"jobOpts":{}},{"jobId":"dissectNode1609903041038","jobName":"com.eoi.jax.flink.job.process.DissectJob","jobConfig":{"sourceField":"message","dissectPattern":"%{ip} %{ident} %{auth} [%{timestamp}] \\"%{verb} %{request} HTTP/%{httpversion}\\" %{response} %{bytes}"},"jobOpts":{}},{"jobId":"GeoIPJob","jobName":"com.eoi.jax.flink.job.process.GeoIPJob","jobConfig":{"ipField":"ip","outputPrefix":"eoi_"},"jobOpts":{}},{"jobId":"convertNode","jobName":"com.eoi.jax.flink.job.process.TypeConvertJob","jobConfig":{"fields":[{"type":"float","field":"bytes","roundingScale":2,"roundingMode":"HALF_UP"}]},"jobOpts":{}},{"jobId":"AddFieldsJob1609903041152","jobName":"com.eoi.jax.flink.job.process.AddFieldsJob","jobConfig":{"fields":[{"expression":"let val = bytes/1.0;\\nlet dw = ''bytes'';\\nif bytes >= 1024*1024 {\\n dw = ''mb'';\\n val = bytes / (1024.0*1024.0);\\n}\\nelsif bytes >= 1024 {\\n dw = ''kb'';\\n val = bytes / 1024.0;\\n}\\n''#{math.round(val*1000)/1000.0}#{dw}''","key":"dw","isReplace":false,"keyIsExp":false},{"expression":"let resp = '''';\\nif string.startsWith(response, ''1'') {\\n resp = ''服务器收到请求'';\\n}\\nelsif string.startsWith(response, ''2'') {\\n resp = ''请求成功'';\\n}\\nelsif string.startsWith(response, ''3'') {\\n resp = ''重定向'';\\n}\\nelsif string.startsWith(response, ''4'') {\\n resp = ''客户端错误'';\\n}\\nelsif string.startsWith(response, ''5'') {\\n resp = ''服务器错误'';\\n}\\nresp","key":"response","isReplace":true,"keyIsExp":false}]},"jobOpts":{}},{"jobId":"TumblingWindowAggJob1609903041158","jobName":"com.eoi.jax.flink.job.process.WindowAggJob","jobConfig":{"aggDefs":[{"outputFieldName":"totalCount","aggMethod":"count","distinct":false,"fieldName":"*"},{"outputFieldName":"_200Count","aggMethod":"count","filterExp":"response == ''请求成功''","distinct":false,"fieldName":"*"},{"outputFieldName":"_400Count","aggMethod":"count","filterExp":"response == ''客户端错误''","distinct":false,"fieldName":"*"},{"outputFieldName":"_500Count","aggMethod":"count","filterExp":"response == ''服务器错误''","distinct":false,"fieldName":"*"},{"outputFieldName":"_200Rate","aggMethod":"calc","distinct":false,"fieldName":"_200Rate","calc":"_200Count * 1.0 / totalCount"},{"outputFieldName":"_400Rate","aggMethod":"calc","distinct":false,"fieldName":"_400Rate","calc":"_400Count * 1.0 / totalCount"},{"outputFieldName":"_500Rate","aggMethod":"calc","distinct":false,"fieldName":"_500Rate","calc":"_500Count * 1.0 / totalCount"},{"outputFieldName":"intranetCount","aggMethod":"count","filterExp":"string.startsWith(ip,''192.168'')","distinct":false,"fieldName":"*"},{"outputFieldName":"internetCount","aggMethod":"count","filterExp":"!string.startsWith(ip,''192.168'')","distinct":false,"fieldName":"*"},{"outputFieldName":"internetRate","aggMethod":"calc","distinct":false,"fieldName":"internetRate","calc":"internetCount * 1.0 / (intranetCount + internetCount)"},{"outputFieldName":"intranetRate","aggMethod":"calc","distinct":false,"fieldName":"intranetRate","calc":"intranetCount * 1.0 / (intranetCount + internetCount)"}],"windowSize":5000,"windowType":"tumbling","windowTimeFormat":"UNIX_MS"},"jobOpts":{}},{"jobId":"kafkaSink1609824456742","jobName":"com.eoi.jax.flink.job.sink.KafkaSinkJob","jobConfig":{"bootstrapServers":["kafka:9092"],"topic":"sinkTopic","autoCreateTopic":true,"kafkaProducerProperties":{"batch.size":"131072"}},"jobOpts":null}],"edges":[{"from":"source1609903041037","to":"dissectNode1609903041038","fromSlot":0,"toSlot":0,"enableMock":null,"mockId":null},{"from":"dissectNode1609903041038","to":"GeoIPJob","fromSlot":0,"toSlot":0,"enableMock":null,"mockId":null},{"from":"GeoIPJob","to":"convertNode","fromSlot":0,"toSlot":0,"enableMock":null,"mockId":null},{"from":"convertNode","to":"AddFieldsJob1609903041152","fromSlot":0,"toSlot":0,"enableMock":null,"mockId":null},{"from":"AddFieldsJob1609903041152","to":"TumblingWindowAggJob1609903041158","fromSlot":0,"toSlot":0,"enableMock":null,"mockId":null},{"from":"TumblingWindowAggJob1609903041158","to":"kafkaSink1609824456742","fromSlot":0,"toSlot":0,"enableMock":null,"mockId":null}],"opts":{}}',NULL,'{"source1609903041037":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.source.JavascriptSimulateMapSourceJob/document","hasDoc":true,"description":"设置javascript脚本,周期性运行,从而产生json数据","display":"JS数据发生器","x":153,"y":157},"dissectNode1609903041038":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.process.DissectJob/document","hasDoc":true,"description":"用于对指定的字段进行模式匹配和内容提取,能快速对文本进行结构化提取,比正则解析易于理解,且高效","display":"文本解构","x":154,"y":265},"GeoIPJob":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.process.GeoIPJob/document","hasDoc":true,"description":"通过IPv4地址查询地理信息,可输出国家、省、市、乡镇、运营商","display":"IP地址反查地理信息","x":150,"y":368},"convertNode":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.process.TypeConvertJob/document","hasDoc":true,"description":"对指定的字段进行类型转换","display":"类型转换","x":158,"y":481.00000000000006},"AddFieldsJob1609903041152":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.process.AddFieldsJob/document","hasDoc":true,"description":"根据aviator表达式计算新增列","display":"列操作新增","x":151,"y":580},"TumblingWindowAggJob1609903041158":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.process.WindowAggJob/document","hasDoc":true,"description":"窗口聚合统计,数值类型支持 `max`,`min`,`avg`,`sum`;所有类型支持 `last`,`first`,`count`,`collect`,`calc`","display":"窗口聚合","x":150,"y":702},"kafkaSink1609824456742":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.sink.KafkaSinkJob/document","hasDoc":true,"description":"使用FlinkKafkaProducer,无需指定版本号, 由Flink自适应.","display":"输出到Kafka","x":146,"y":805}}','DRAFT',NULL,NULL,NULL,NULL,'9411e9a11a5b2faaad1c80baaeb127e5',NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,1652888984021,NULL,1652888964567,NULL,1652888983335,NULL), + ('StreamSQL_Map2Table_Demo','flink_19_standalone_cluster',NULL,'streaming',NULL,'{"jobs":[{"jobId":"source","jobName":"com.eoi.jax.flink.job.source.JavascriptSimulateMapSourceJob","jobConfig":{"interval":1000,"ignoreException":false,"script":"var providerIdList = [\\"100002\\", \\"100003\\", \\"100004\\", \\"other\\"];\\nvar colSrcFlagList = [\\"1\\",\\"1\\",\\"1\\",\\"1\\",\\"1\\",\\"other\\"];\\nvar returnCodeList = [\\"0002\\", \\"0001\\", \\"0000\\"];\\n\\nvar now = new Date().getTime();\\nvar providerId = providerIdList[Math.floor(Math.random() * 4)]\\nvar colSrcFlag = colSrcFlagList[Math.floor(Math.random() * 6)];\\nvar returnCode = returnCodeList[Math.floor(Math.random() * 3)];\\n\\nvar req = {\\n\\tProviderId : providerId,\\n\\tColSrcFlag : colSrcFlag,\\n\\tMsgId : now.toString(),\\n\\ttimestamp : now,\\n\\tReturnCode : \\"\\",\\n\\tDtgrmRl : 1\\n\\n};\\n\\nvar resp = {\\n\\tProviderId : providerId,\\n\\tColSrcFlag : colSrcFlag,\\n\\tMsgId : now.toString(),\\n\\ttimestamp : now + Math.floor(Math.random() * 1000),\\n\\tDtgrmRl : 4,\\n\\tReturnCode : returnCode\\n};[req,resp]"},"jobOpts":{}},{"jobId":"convertNode","jobName":"com.eoi.jax.flink.job.process.TypeConvertJob","jobConfig":{"fields":[{"type":"long","field":"timestamp"}]},"jobOpts":{}},{"jobId":"stream2TableNode","jobName":"com.eoi.jax.flink.job.process.StreamToTableJob","jobConfig":{"columns":[{"columnName":"ProviderId","columnType":"string"},{"columnName":"ColSrcFlag","columnType":"string"},{"columnName":"MsgId","columnType":"string"},{"columnName":"timestamp","columnType":"long"},{"columnName":"DtgrmRl","columnType":"int"},{"columnName":"ReturnCode","columnType":"string"}],"eventTimeEnabled":true,"eventTimeOutputField":"row_time","allowedLateness":0,"timeFieldName":"timestamp","timeFormat":"UNIX_MS","eventTimeFromSource":false,"procTimeEnabled":false,"tableName":"req_resp","windowOffsetBeiJing":false},"jobOpts":{}},{"jobId":"sqlNode","jobName":"com.eoi.jax.flink.job.process.SqlJob","jobConfig":{"sql":"select * , (respTime - reqTime) as Duration from (select SESSION_START(row_time, interval ''10'' second) as `trans_time`,\\nmax(`timestamp`) as `timestamp`,\\nmax(ProviderId) as ProviderId,\\nmax(ColSrcFlag) as ColSrcFlag,\\nMsgId,\\nmax(CASE WHEN DtgrmRl = 4 then ReturnCode else '''' end) as ReturnCode,\\nmax(CASE WHEN DtgrmRl = 4 then `timestamp` else 0 end) as respTime,\\nmax(CASE WHEN DtgrmRl = 1 then `timestamp` else 0 end) as reqTime,\\nmax(CASE WHEN ProviderId not in (''100002'',''100003'') then ''master'' WHEN ProviderId = ''100002'' then ''slave'' else '''' end) as CoreType\\nfrom req_resp where ColSrcFlag =''1'' and ProviderId like ''1000%''\\ngroup by MsgId, SESSION(row_time, interval ''10'' second)\\n)","tableName":"output"},"jobOpts":{}},{"jobId":"table2StreamNode","jobName":"com.eoi.jax.flink.job.process.TableToStreamJob","jobConfig":{},"jobOpts":{}},{"jobId":"kafkaSink1609824456742","jobName":"com.eoi.jax.flink.job.sink.KafkaSinkJob","jobConfig":{"bootstrapServers":["kafka:9092"],"topic":"sinkTopic","autoCreateTopic":true,"kafkaProducerProperties":{"batch.size":"131072"}},"jobOpts":null}],"edges":[{"from":"source","to":"convertNode","fromSlot":0,"toSlot":0,"enableMock":null,"mockId":null},{"from":"convertNode","to":"stream2TableNode","fromSlot":0,"toSlot":0,"enableMock":null,"mockId":null},{"from":"stream2TableNode","to":"sqlNode","fromSlot":0,"toSlot":0,"enableMock":null,"mockId":null},{"from":"sqlNode","to":"table2StreamNode","fromSlot":0,"toSlot":0,"enableMock":null,"mockId":null},{"from":"table2StreamNode","to":"kafkaSink1609824456742","fromSlot":0,"toSlot":0,"enableMock":null,"mockId":null}],"opts":{"parallelism":"1","yarnSlots":"1","yarnJobManagerMemory":"512M","yarnTaskManagerMemory":"2048MB","timeCharacteristic":"event"}}',NULL,'{"source":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.source.JavascriptSimulateMapSourceJob/document","hasDoc":true,"description":"设置javascript脚本,周期性运行,从而产生json数据","display":"JS数据发生器","x":100,"y":70},"convertNode":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.process.TypeConvertJob/document","hasDoc":true,"description":"对指定的字段进行类型转换","display":"类型转换","x":100,"y":260},"stream2TableNode":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.process.StreamToTableJob/document","hasDoc":true,"description":"按指定schema转成Table,下游可以用SqlJob进行数据操作","display":"Map转Table","x":100,"y":450},"sqlNode":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.process.SqlJob/document","hasDoc":true,"description":"上游StreamToTable转为table后,再执行sql; 下游可以通过TableToStreamJob再转回DataStream","display":"执行sql","x":100,"y":640},"table2StreamNode":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.process.TableToStreamJob/document","hasDoc":true,"description":"Table转Map流","display":"Table转Map流","x":100,"y":830},"kafkaSink1609824456742":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.sink.KafkaSinkJob/document","hasDoc":true,"description":"使用FlinkKafkaProducer,无需指定版本号, 由Flink自适应.","display":"输出到Kafka","x":100,"y":1020}}','DRAFT',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1652888964633,NULL,1652888964633,NULL), + ('StreamWatermarkWinAgg_Demo','flink_19_standalone_cluster',NULL,'streaming',NULL,'{"jobs":[{"jobId":"source1609824456705","jobName":"com.eoi.jax.flink.job.source.JavascriptSimulateMapSourceJob","jobConfig":{"interval":1000,"ignoreException":false,"script":"var providerIdList = [\\"100002\\", \\"100003\\", \\"100004\\", \\"other\\"];\\nvar colSrcFlagList = [\\"1\\",\\"1\\",\\"1\\",\\"1\\",\\"1\\",\\"other\\"];\\nvar returnCodeList = [\\"0002\\", \\"0001\\", \\"0000\\"];\\n\\nvar now = new Date().getTime();\\nvar providerId = providerIdList[Math.floor(Math.random() * 4)]\\nvar colSrcFlag = colSrcFlagList[Math.floor(Math.random() * 6)];\\nvar returnCode = returnCodeList[Math.floor(Math.random() * 3)];\\n\\nvar req = {\\n\\tProviderId : providerId,\\n\\tColSrcFlag : colSrcFlag,\\n\\tMsgId : now.toString(),\\n\\ttimestamp : now,\\n\\tDtgrmRl : 1\\n\\n};\\n\\nvar resp = {\\n\\tProviderId : providerId,\\n\\tColSrcFlag : colSrcFlag,\\n\\tMsgId : now.toString(),\\n\\ttimestamp : now + Math.floor(Math.random() * 1000),\\n\\tDtgrmRl : 4,\\n\\tReturnCode : returnCode\\n};[req,resp]"},"jobOpts":null},{"jobId":"filterJob1609824456706","jobName":"com.eoi.jax.flink.job.process.FilterJob","jobConfig":{"rule":"ColSrcFlag==''1'' && string.startsWith(ProviderId, ''1000'')"},"jobOpts":null},{"jobId":"addFieldNodeJob1609824456733","jobName":"com.eoi.jax.flink.job.process.AddFieldsJob","jobConfig":{"fields":[{"key":"CoreType","keyIsExp":false,"expression":"(ProviderId == ''100002'' || ProviderId == ''100003'') ? ''slave'' : ''master''","isReplace":false}]},"jobOpts":null},{"jobId":"WatermarkJob1609824456733timestamp","jobName":"com.eoi.jax.flink.job.process.WatermarkJob","jobConfig":{"watermarkSource":"time_field","timeFieldName":"timestamp","timeFormat":"UNIX_MS"},"jobOpts":null},{"jobId":"sessionWindowAggJob1609824456734","jobName":"com.eoi.jax.flink.job.process.WindowAggJob","jobConfig":{"windowType":"session","windowSize":10000,"aggDefs":[{"fieldName":"timestamp","aggMethod":"last","distinct":false,"outputFieldName":"reqTime","filterExp":"DtgrmRl == 1"},{"fieldName":"timestamp","aggMethod":"last","distinct":false,"outputFieldName":"respTime","filterExp":"DtgrmRl == 4"},{"fieldName":"CoreType","aggMethod":"last","distinct":false,"outputFieldName":"CoreType"},{"fieldName":"Duration","aggMethod":"calc","calc":"respTime - reqTime","distinct":false,"outputFieldName":"Duration"},{"fieldName":"ReturnCode","aggMethod":"first","distinct":false,"outputFieldName":"ReturnCode","filterExp":"DtgrmRl == 4"}],"groupKeys":["MsgId"]},"jobOpts":null},{"jobId":"EnrichByBroadcastJob1609824456739","jobName":"com.eoi.jax.flink.job.process.EnrichByBroadcastJob","jobConfig":{"key":"ReturnCode"},"jobOpts":null},{"jobId":"dictSource1609824456706","jobName":"com.eoi.jax.flink.job.source.JavascriptSimulateMapSourceJob","jobConfig":{"interval":60000,"ignoreException":false,"script":"[{\\n\\tReturnCode : \\"0000\\",\\n\\tfailure_type : \\"nil\\"\\n},\\n{\\n\\tReturnCode : \\"0001\\",\\n\\tfailure_type : \\"tec\\"\\n},\\n{\\n\\tReturnCode : \\"0002\\",\\n\\tfailure_type : \\"tec\\"\\n}]"},"jobOpts":null},{"jobId":"addFailTypeNodeJob1609824456741","jobName":"com.eoi.jax.flink.job.process.AddFieldsJob","jobConfig":{"fields":[{"key":"FailFlag","keyIsExp":false,"expression":"failure_type == ''tec'' ? 1 : 0","isReplace":false}]},"jobOpts":null},{"jobId":"WatermarkJob1609824456741@timestamp","jobName":"com.eoi.jax.flink.job.process.WatermarkJob","jobConfig":{"watermarkSource":"time_field","timeFieldName":"@timestamp","timeFormat":"UNIX_MS"},"jobOpts":null},{"jobId":"TumblingWindowAggJob1609824456741","jobName":"com.eoi.jax.flink.job.process.WindowAggJob","jobConfig":{"windowType":"tumbling","windowSize":5000,"aggDefs":[{"fieldName":"*","aggMethod":"count","distinct":false,"outputFieldName":"totalCount"},{"fieldName":"Duration","aggMethod":"sum","distinct":false,"outputFieldName":"totalDuration"},{"fieldName":"FailFlag","aggMethod":"sum","distinct":false,"outputFieldName":"failCount"},{"aggMethod":"calc","calc":"totalDuration/totalCount","distinct":false,"outputFieldName":"avgDuration"},{"aggMethod":"calc","calc":"(totalCount-failCount)/totalCount","distinct":false,"outputFieldName":"successRate"}],"groupKeys":["CoreType"],"windowTimeFormat":"yyyy-MM-dd HH:mm:ss"},"jobOpts":null},{"jobId":"kafkaSink1609824456742","jobName":"com.eoi.jax.flink.job.sink.KafkaSinkJob","jobConfig":{"bootstrapServers":["kafka:9092"],"esNodes":["192.168.21.41:9200"],"topic":"pufa_poc1","autoCreateTopic":true,"kafkaProducerProperties":{"batch.size":"131072"}},"jobOpts":null}],"edges":[{"from":"source1609824456705","to":"filterJob1609824456706","fromSlot":0,"toSlot":0,"enableMock":null,"mockId":null},{"from":"filterJob1609824456706","to":"addFieldNodeJob1609824456733","fromSlot":0,"toSlot":0,"enableMock":null,"mockId":null},{"from":"addFieldNodeJob1609824456733","to":"WatermarkJob1609824456733timestamp","fromSlot":0,"toSlot":0,"enableMock":null,"mockId":null},{"from":"WatermarkJob1609824456733timestamp","to":"sessionWindowAggJob1609824456734","fromSlot":0,"toSlot":0,"enableMock":null,"mockId":null},{"from":"sessionWindowAggJob1609824456734","to":"EnrichByBroadcastJob1609824456739","fromSlot":0,"toSlot":0,"enableMock":null,"mockId":null},{"from":"dictSource1609824456706","to":"EnrichByBroadcastJob1609824456739","fromSlot":0,"toSlot":1,"enableMock":null,"mockId":null},{"from":"EnrichByBroadcastJob1609824456739","to":"addFailTypeNodeJob1609824456741","fromSlot":0,"toSlot":0,"enableMock":null,"mockId":null},{"from":"addFailTypeNodeJob1609824456741","to":"WatermarkJob1609824456741@timestamp","fromSlot":0,"toSlot":0,"enableMock":null,"mockId":null},{"from":"WatermarkJob1609824456741@timestamp","to":"TumblingWindowAggJob1609824456741","fromSlot":0,"toSlot":0,"enableMock":null,"mockId":null},{"from":"TumblingWindowAggJob1609824456741","to":"kafkaSink1609824456742","fromSlot":0,"toSlot":0,"enableMock":null,"mockId":null}],"opts":{"parallelism":"1","yarnSlots":"1","yarnJobManagerMemory":"512M","yarnTaskManagerMemory":"2048MB","timeCharacteristic":"event"}}',NULL,'{"source1609824456705":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.source.JavascriptSimulateMapSourceJob/document","hasDoc":true,"description":"设置javascript脚本,周期性运行,从而产生json数据","display":"JS数据发生器","x":100,"y":70},"filterJob1609824456706":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.process.FilterJob/document","hasDoc":true,"description":"使用aviator表达式指定过滤规则,返回boolean值;如果为true,输出到slot 0;如果为false,输出到slot 1; ","display":"过滤器","x":100,"y":260},"addFieldNodeJob1609824456733":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.process.AddFieldsJob/document","hasDoc":true,"description":"根据aviator表达式计算新增列","display":"列操作新增","x":100,"y":450},"WatermarkJob1609824456733timestamp":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.process.WatermarkJob/document","hasDoc":true,"description":"在EventTime时间模式下设置watermark,为窗口聚合做准备","display":"时间水位线设置","x":100,"y":640},"sessionWindowAggJob1609824456734":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.process.WindowAggJob/document","hasDoc":true,"description":"窗口聚合统计,数值类型支持 `max`,`min`,`avg`,`sum`;所有类型支持 `last`,`first`,`count`,`collect`,`calc`","display":"窗口聚合","x":100,"y":830},"EnrichByBroadcastJob1609824456739":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.process.EnrichByBroadcastJob/document","hasDoc":true,"description":"通过key反查字典数据流,如果找到则把字典里其他字段拼到原始数据上;如果字典里没有找到则不添加字段。","display":"字段丰富(数据流广播)","x":240,"y":1020},"dictSource1609824456706":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.source.JavascriptSimulateMapSourceJob/document","hasDoc":true,"description":"设置javascript脚本,周期性运行,从而产生json数据","display":"JS数据发生器","x":380,"y":830},"addFailTypeNodeJob1609824456741":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.process.AddFieldsJob/document","hasDoc":true,"description":"根据aviator表达式计算新增列","display":"列操作新增","x":240,"y":1210},"WatermarkJob1609824456741@timestamp":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.process.WatermarkJob/document","hasDoc":true,"description":"在EventTime时间模式下设置watermark,为窗口聚合做准备","display":"时间水位线设置","x":240,"y":1400},"TumblingWindowAggJob1609824456741":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.process.WindowAggJob/document","hasDoc":true,"description":"窗口聚合统计,数值类型支持 `max`,`min`,`avg`,`sum`;所有类型支持 `last`,`first`,`count`,`collect`,`calc`","display":"窗口聚合","x":240,"y":1590},"kafkaSink1609824456742":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.sink.KafkaSinkJob/document","hasDoc":true,"description":"使用FlinkKafkaProducer,无需指定版本号, 由Flink自适应.","display":"输出到Kafka_1.9","x":240,"y":1780}}','DRAFT',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1652888964673,NULL,1652888964673,NULL), + ('WarnLogParse_Join_Demo','flink_19_standalone_cluster',NULL,'streaming',NULL,'{"jobs":[{"jobId":"source1610353261723","jobName":"com.eoi.jax.flink.job.source.JavascriptSimulateMapSourceJob","jobConfig":{"interval":200,"ignoreException":false,"script":"var emailList = \\"a@eoi.com;b@eoi.com;c@eoi.com\\";\\nvar warnLevel = [\\"1\\",\\"2\\",\\"3\\",\\"4\\"];\\nvar warnContent = [\\"warn1\\",\\"warn2\\",\\"warn3\\",\\"warn4\\"];\\n\\nvar log = warnLevel[Math.floor(Math.random() * 4)] + \\" \\" + emailList + \\" \\" + warnContent[Math.floor(Math.random() * 4)];\\nvar line = {\\n\\tmessage:log\\n};\\nline"},"jobOpts":null},{"jobId":"grokNode","jobName":"com.eoi.jax.flink.job.process.GrokParseJob","jobConfig":{"sourceField":"message","matches":["^(?.+?) (?.+?) (?.+?)$"]},"jobOpts":null},{"jobId":"UnPivotJob","jobName":"com.eoi.jax.flink.job.process.UnPivotJob","jobConfig":{"sourceField":"emails","targetField":"email","delimiter":";"},"jobOpts":null},{"jobId":"EnrichByBroadcastJob1610353261742","jobName":"com.eoi.jax.flink.job.process.EnrichByBroadcastJob","jobConfig":{"key":"email"},"jobOpts":null},{"jobId":"dictSource1610353261723","jobName":"com.eoi.jax.flink.job.source.JavascriptSimulateMapSourceJob","jobConfig":{"interval":60000,"ignoreException":false,"script":"[{\\n\\temail : \\"a@eoi.com\\",\\n\\tposition : \\"总监\\",\\n\\tdept : \\"it部门\\"\\n},\\n{\\n\\temail : \\"b@eoi.com\\",\\n\\tposition : \\"运维\\",\\n\\tdept : \\"it部门\\"\\n},\\n{\\n\\temail : \\"c@eoi.com\\",\\n\\tposition : \\"处长\\",\\n\\tdept : \\"行政部\\"\\n}\\n]"},"jobOpts":null},{"jobId":"kafkaSink1609824456742","jobName":"com.eoi.jax.flink.job.sink.KafkaSinkJob","jobConfig":{"bootstrapServers":["kafka:9092"],"topic":"sinkTopic","autoCreateTopic":true,"kafkaProducerProperties":{"batch.size":"131072"}},"jobOpts":null}],"edges":[{"from":"source1610353261723","to":"grokNode","fromSlot":0,"toSlot":0,"enableMock":null,"mockId":null},{"from":"grokNode","to":"UnPivotJob","fromSlot":0,"toSlot":0,"enableMock":null,"mockId":null},{"from":"UnPivotJob","to":"EnrichByBroadcastJob1610353261742","fromSlot":0,"toSlot":0,"enableMock":null,"mockId":null},{"from":"dictSource1610353261723","to":"EnrichByBroadcastJob1610353261742","fromSlot":0,"toSlot":1,"enableMock":null,"mockId":null},{"from":"EnrichByBroadcastJob1610353261742","to":"kafkaSink1609824456742","fromSlot":0,"toSlot":0,"enableMock":null,"mockId":null}],"opts":{}}',NULL,'{"source1610353261723":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.source.JavascriptSimulateMapSourceJob/document","hasDoc":true,"description":"设置javascript脚本,周期性运行,从而产生json数据","display":"JS数据发生器","x":100,"y":70},"grokNode":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.process.GrokParseJob/document","hasDoc":true,"description":"对指定的字段进行正则解析,从而提取需要的字段。支持使用%{xxx}来引用预先定义的正则规则","display":"正则解析","x":100,"y":260},"UnPivotJob":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.process.UnPivotJob/document","hasDoc":true,"description":"根据指定字段分拆成多行","display":"列转行","x":100,"y":450},"EnrichByBroadcastJob1610353261742":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.process.EnrichByBroadcastJob/document","hasDoc":true,"description":"通过key反查字典数据流,如果找到则把字典里其他字段拼到原始数据上;如果字典里没有找到则不添加字段。","display":"字段丰富(数据流广播)","x":240,"y":640},"dictSource1610353261723":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.source.JavascriptSimulateMapSourceJob/document","hasDoc":true,"description":"设置javascript脚本,周期性运行,从而产生json数据","display":"JS数据发生器","x":380,"y":450},"kafkaSink1609824456742":{"docUrl":"/api/v1/job/com.eoi.jax.flink.job.sink.KafkaSinkJob/document","hasDoc":true,"description":"使用FlinkKafkaProducer,无需指定版本号, 由Flink自适应.","display":"输出到Kafka","x":240,"y":830}}','DRAFT',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1652888964711,NULL,1652888964711,NULL); + +INSERT INTO tb_pipeline_job (pipeline_name,job_id,job_name,job_config,opts) VALUES + ('AccessLogTransform_Demo','source1609903041037','com.eoi.jax.flink.job.source.JavascriptSimulateMapSourceJob','{"interval":200,"ignoreException":false,"script":"var ipList = [\\"192.168.1.1\\",\\"220.248.44.62\\",\\"169.235.24.133\\"];\\nvar respList = [\\"200\\",\\"200\\",\\"200\\",\\"302\\",\\"401\\",\\"403\\",\\"500\\",\\"502\\"];\\nvar bytesList = [100,10240,1024*10240];\\n\\nvar log = ipList[Math.floor(Math.random() * 3)] + \\" - - [30/Apr/1998:22:01:53 +0000] \\\\\\"GET /english/venues/cities/images/montpellier/19.gif HTTP/1.0\\\\\\" \\" + respList[Math.floor(Math.random() * 8)] + \\" \\" + Math.random() * bytesList[Math.floor(Math.random() * 3)];\\nvar line = {\\n\\tmessage: log\\n};\\nline"}','{}'), + ('AccessLogTransform_Demo','dissectNode1609903041038','com.eoi.jax.flink.job.process.DissectJob','{"sourceField":"message","dissectPattern":"%{ip} %{ident} %{auth} [%{timestamp}] \\"%{verb} %{request} HTTP/%{httpversion}\\" %{response} %{bytes}"}','{}'), + ('AccessLogTransform_Demo','GeoIPJob','com.eoi.jax.flink.job.process.GeoIPJob','{"ipField":"ip","outputPrefix":"eoi_"}','{}'), + ('AccessLogTransform_Demo','convertNode','com.eoi.jax.flink.job.process.TypeConvertJob','{"fields":[{"type":"float","field":"bytes","roundingScale":2,"roundingMode":"HALF_UP"}]}','{}'), + ('AccessLogTransform_Demo','AddFieldsJob1609903041152','com.eoi.jax.flink.job.process.AddFieldsJob','{"fields":[{"expression":"let val = bytes/1.0;\\nlet dw = ''bytes'';\\nif bytes >= 1024*1024 {\\n dw = ''mb'';\\n val = bytes / (1024.0*1024.0);\\n}\\nelsif bytes >= 1024 {\\n dw = ''kb'';\\n val = bytes / 1024.0;\\n}\\n''#{math.round(val*1000)/1000.0}#{dw}''","key":"dw","isReplace":false,"keyIsExp":false},{"expression":"let resp = '''';\\nif string.startsWith(response, ''1'') {\\n resp = ''服务器收到请求'';\\n}\\nelsif string.startsWith(response, ''2'') {\\n resp = ''请求成功'';\\n}\\nelsif string.startsWith(response, ''3'') {\\n resp = ''重定向'';\\n}\\nelsif string.startsWith(response, ''4'') {\\n resp = ''客户端错误'';\\n}\\nelsif string.startsWith(response, ''5'') {\\n resp = ''服务器错误'';\\n}\\nresp","key":"response","isReplace":true,"keyIsExp":false}]}','{}'), + ('AccessLogTransform_Demo','TumblingWindowAggJob1609903041158','com.eoi.jax.flink.job.process.WindowAggJob','{"aggDefs":[{"outputFieldName":"totalCount","aggMethod":"count","distinct":false,"fieldName":"*"},{"outputFieldName":"_200Count","aggMethod":"count","filterExp":"response == ''请求成功''","distinct":false,"fieldName":"*"},{"outputFieldName":"_400Count","aggMethod":"count","filterExp":"response == ''客户端错误''","distinct":false,"fieldName":"*"},{"outputFieldName":"_500Count","aggMethod":"count","filterExp":"response == ''服务器错误''","distinct":false,"fieldName":"*"},{"outputFieldName":"_200Rate","aggMethod":"calc","distinct":false,"fieldName":"_200Rate","calc":"_200Count * 1.0 / totalCount"},{"outputFieldName":"_400Rate","aggMethod":"calc","distinct":false,"fieldName":"_400Rate","calc":"_400Count * 1.0 / totalCount"},{"outputFieldName":"_500Rate","aggMethod":"calc","distinct":false,"fieldName":"_500Rate","calc":"_500Count * 1.0 / totalCount"},{"outputFieldName":"intranetCount","aggMethod":"count","filterExp":"string.startsWith(ip,''192.168'')","distinct":false,"fieldName":"*"},{"outputFieldName":"internetCount","aggMethod":"count","filterExp":"!string.startsWith(ip,''192.168'')","distinct":false,"fieldName":"*"},{"outputFieldName":"internetRate","aggMethod":"calc","distinct":false,"fieldName":"internetRate","calc":"internetCount * 1.0 / (intranetCount + internetCount)"},{"outputFieldName":"intranetRate","aggMethod":"calc","distinct":false,"fieldName":"intranetRate","calc":"intranetCount * 1.0 / (intranetCount + internetCount)"}],"windowSize":5000,"windowType":"tumbling","windowTimeFormat":"UNIX_MS"}','{}'), + ('AccessLogTransform_Demo','kafkaSink1609824456742','com.eoi.jax.flink.job.sink.KafkaSinkJob','{"bootstrapServers":["kafka:9092"],"topic":"sinkTopic","autoCreateTopic":true,"kafkaProducerProperties":{"batch.size":"131072"}}',NULL), + ('StreamSQL_Map2Table_Demo','source','com.eoi.jax.flink.job.source.JavascriptSimulateMapSourceJob','{"interval":1000,"ignoreException":false,"script":"var providerIdList = [\\"100002\\", \\"100003\\", \\"100004\\", \\"other\\"];\\nvar colSrcFlagList = [\\"1\\",\\"1\\",\\"1\\",\\"1\\",\\"1\\",\\"other\\"];\\nvar returnCodeList = [\\"0002\\", \\"0001\\", \\"0000\\"];\\n\\nvar now = new Date().getTime();\\nvar providerId = providerIdList[Math.floor(Math.random() * 4)]\\nvar colSrcFlag = colSrcFlagList[Math.floor(Math.random() * 6)];\\nvar returnCode = returnCodeList[Math.floor(Math.random() * 3)];\\n\\nvar req = {\\n\\tProviderId : providerId,\\n\\tColSrcFlag : colSrcFlag,\\n\\tMsgId : now.toString(),\\n\\ttimestamp : now,\\n\\tReturnCode : \\"\\",\\n\\tDtgrmRl : 1\\n\\n};\\n\\nvar resp = {\\n\\tProviderId : providerId,\\n\\tColSrcFlag : colSrcFlag,\\n\\tMsgId : now.toString(),\\n\\ttimestamp : now + Math.floor(Math.random() * 1000),\\n\\tDtgrmRl : 4,\\n\\tReturnCode : returnCode\\n};[req,resp]"}','{}'), + ('StreamSQL_Map2Table_Demo','convertNode','com.eoi.jax.flink.job.process.TypeConvertJob','{"fields":[{"type":"long","field":"timestamp"}]}','{}'), + ('StreamSQL_Map2Table_Demo','stream2TableNode','com.eoi.jax.flink.job.process.StreamToTableJob','{"columns":[{"columnName":"ProviderId","columnType":"string"},{"columnName":"ColSrcFlag","columnType":"string"},{"columnName":"MsgId","columnType":"string"},{"columnName":"timestamp","columnType":"long"},{"columnName":"DtgrmRl","columnType":"int"},{"columnName":"ReturnCode","columnType":"string"}],"eventTimeEnabled":true,"eventTimeOutputField":"row_time","allowedLateness":0,"timeFieldName":"timestamp","timeFormat":"UNIX_MS","eventTimeFromSource":false,"procTimeEnabled":false,"tableName":"req_resp","windowOffsetBeiJing":false}','{}'); +INSERT INTO tb_pipeline_job (pipeline_name,job_id,job_name,job_config,opts) VALUES + ('StreamSQL_Map2Table_Demo','sqlNode','com.eoi.jax.flink.job.process.SqlJob','{"sql":"select * , (respTime - reqTime) as Duration from (select SESSION_START(row_time, interval ''10'' second) as `trans_time`,\\nmax(`timestamp`) as `timestamp`,\\nmax(ProviderId) as ProviderId,\\nmax(ColSrcFlag) as ColSrcFlag,\\nMsgId,\\nmax(CASE WHEN DtgrmRl = 4 then ReturnCode else '''' end) as ReturnCode,\\nmax(CASE WHEN DtgrmRl = 4 then `timestamp` else 0 end) as respTime,\\nmax(CASE WHEN DtgrmRl = 1 then `timestamp` else 0 end) as reqTime,\\nmax(CASE WHEN ProviderId not in (''100002'',''100003'') then ''master'' WHEN ProviderId = ''100002'' then ''slave'' else '''' end) as CoreType\\nfrom req_resp where ColSrcFlag =''1'' and ProviderId like ''1000%''\\ngroup by MsgId, SESSION(row_time, interval ''10'' second)\\n)","tableName":"output"}','{}'), + ('StreamSQL_Map2Table_Demo','table2StreamNode','com.eoi.jax.flink.job.process.TableToStreamJob','{}','{}'), + ('StreamSQL_Map2Table_Demo','kafkaSink1609824456742','com.eoi.jax.flink.job.sink.KafkaSinkJob','{"bootstrapServers":["kafka:9092"],"topic":"sinkTopic","autoCreateTopic":true,"kafkaProducerProperties":{"batch.size":"131072"}}',NULL), + ('StreamWatermarkWinAgg_Demo','source1609824456705','com.eoi.jax.flink.job.source.JavascriptSimulateMapSourceJob','{"interval":1000,"ignoreException":false,"script":"var providerIdList = [\\"100002\\", \\"100003\\", \\"100004\\", \\"other\\"];\\nvar colSrcFlagList = [\\"1\\",\\"1\\",\\"1\\",\\"1\\",\\"1\\",\\"other\\"];\\nvar returnCodeList = [\\"0002\\", \\"0001\\", \\"0000\\"];\\n\\nvar now = new Date().getTime();\\nvar providerId = providerIdList[Math.floor(Math.random() * 4)]\\nvar colSrcFlag = colSrcFlagList[Math.floor(Math.random() * 6)];\\nvar returnCode = returnCodeList[Math.floor(Math.random() * 3)];\\n\\nvar req = {\\n\\tProviderId : providerId,\\n\\tColSrcFlag : colSrcFlag,\\n\\tMsgId : now.toString(),\\n\\ttimestamp : now,\\n\\tDtgrmRl : 1\\n\\n};\\n\\nvar resp = {\\n\\tProviderId : providerId,\\n\\tColSrcFlag : colSrcFlag,\\n\\tMsgId : now.toString(),\\n\\ttimestamp : now + Math.floor(Math.random() * 1000),\\n\\tDtgrmRl : 4,\\n\\tReturnCode : returnCode\\n};[req,resp]"}',NULL), + ('StreamWatermarkWinAgg_Demo','filterJob1609824456706','com.eoi.jax.flink.job.process.FilterJob','{"rule":"ColSrcFlag==''1'' && string.startsWith(ProviderId, ''1000'')"}',NULL), + ('StreamWatermarkWinAgg_Demo','addFieldNodeJob1609824456733','com.eoi.jax.flink.job.process.AddFieldsJob','{"fields":[{"key":"CoreType","keyIsExp":false,"expression":"(ProviderId == ''100002'' || ProviderId == ''100003'') ? ''slave'' : ''master''","isReplace":false}]}',NULL), + ('StreamWatermarkWinAgg_Demo','WatermarkJob1609824456733timestamp','com.eoi.jax.flink.job.process.WatermarkJob','{"watermarkSource":"time_field","timeFieldName":"timestamp","timeFormat":"UNIX_MS"}',NULL), + ('StreamWatermarkWinAgg_Demo','sessionWindowAggJob1609824456734','com.eoi.jax.flink.job.process.WindowAggJob','{"windowType":"session","windowSize":10000,"aggDefs":[{"fieldName":"timestamp","aggMethod":"last","distinct":false,"outputFieldName":"reqTime","filterExp":"DtgrmRl == 1"},{"fieldName":"timestamp","aggMethod":"last","distinct":false,"outputFieldName":"respTime","filterExp":"DtgrmRl == 4"},{"fieldName":"CoreType","aggMethod":"last","distinct":false,"outputFieldName":"CoreType"},{"fieldName":"Duration","aggMethod":"calc","calc":"respTime - reqTime","distinct":false,"outputFieldName":"Duration"},{"fieldName":"ReturnCode","aggMethod":"first","distinct":false,"outputFieldName":"ReturnCode","filterExp":"DtgrmRl == 4"}],"groupKeys":["MsgId"]}',NULL), + ('StreamWatermarkWinAgg_Demo','EnrichByBroadcastJob1609824456739','com.eoi.jax.flink.job.process.EnrichByBroadcastJob','{"key":"ReturnCode"}',NULL), + ('StreamWatermarkWinAgg_Demo','dictSource1609824456706','com.eoi.jax.flink.job.source.JavascriptSimulateMapSourceJob','{"interval":60000,"ignoreException":false,"script":"[{\\n\\tReturnCode : \\"0000\\",\\n\\tfailure_type : \\"nil\\"\\n},\\n{\\n\\tReturnCode : \\"0001\\",\\n\\tfailure_type : \\"tec\\"\\n},\\n{\\n\\tReturnCode : \\"0002\\",\\n\\tfailure_type : \\"tec\\"\\n}]"}',NULL); +INSERT INTO tb_pipeline_job (pipeline_name,job_id,job_name,job_config,opts) VALUES + ('StreamWatermarkWinAgg_Demo','addFailTypeNodeJob1609824456741','com.eoi.jax.flink.job.process.AddFieldsJob','{"fields":[{"key":"FailFlag","keyIsExp":false,"expression":"failure_type == ''tec'' ? 1 : 0","isReplace":false}]}',NULL), + ('StreamWatermarkWinAgg_Demo','WatermarkJob1609824456741@timestamp','com.eoi.jax.flink.job.process.WatermarkJob','{"watermarkSource":"time_field","timeFieldName":"@timestamp","timeFormat":"UNIX_MS"}',NULL), + ('StreamWatermarkWinAgg_Demo','TumblingWindowAggJob1609824456741','com.eoi.jax.flink.job.process.WindowAggJob','{"windowType":"tumbling","windowSize":5000,"aggDefs":[{"fieldName":"*","aggMethod":"count","distinct":false,"outputFieldName":"totalCount"},{"fieldName":"Duration","aggMethod":"sum","distinct":false,"outputFieldName":"totalDuration"},{"fieldName":"FailFlag","aggMethod":"sum","distinct":false,"outputFieldName":"failCount"},{"aggMethod":"calc","calc":"totalDuration/totalCount","distinct":false,"outputFieldName":"avgDuration"},{"aggMethod":"calc","calc":"(totalCount-failCount)/totalCount","distinct":false,"outputFieldName":"successRate"}],"groupKeys":["CoreType"],"windowTimeFormat":"yyyy-MM-dd HH:mm:ss"}',NULL), + ('StreamWatermarkWinAgg_Demo','kafkaSink1609824456742','com.eoi.jax.flink.job.sink.KafkaSinkJob','{"bootstrapServers":["kafka:9092"],"esNodes":["192.168.21.41:9200"],"topic":"pufa_poc1","autoCreateTopic":true,"kafkaProducerProperties":{"batch.size":"131072"}}',NULL), + ('WarnLogParse_Join_Demo','source1610353261723','com.eoi.jax.flink.job.source.JavascriptSimulateMapSourceJob','{"interval":200,"ignoreException":false,"script":"var emailList = \\"a@eoi.com;b@eoi.com;c@eoi.com\\";\\nvar warnLevel = [\\"1\\",\\"2\\",\\"3\\",\\"4\\"];\\nvar warnContent = [\\"warn1\\",\\"warn2\\",\\"warn3\\",\\"warn4\\"];\\n\\nvar log = warnLevel[Math.floor(Math.random() * 4)] + \\" \\" + emailList + \\" \\" + warnContent[Math.floor(Math.random() * 4)];\\nvar line = {\\n\\tmessage:log\\n};\\nline"}',NULL), + ('WarnLogParse_Join_Demo','grokNode','com.eoi.jax.flink.job.process.GrokParseJob','{"sourceField":"message","matches":["^(?.+?) (?.+?) (?.+?)$"]}',NULL), + ('WarnLogParse_Join_Demo','UnPivotJob','com.eoi.jax.flink.job.process.UnPivotJob','{"sourceField":"emails","targetField":"email","delimiter":";"}',NULL), + ('WarnLogParse_Join_Demo','EnrichByBroadcastJob1610353261742','com.eoi.jax.flink.job.process.EnrichByBroadcastJob','{"key":"email"}',NULL), + ('WarnLogParse_Join_Demo','dictSource1610353261723','com.eoi.jax.flink.job.source.JavascriptSimulateMapSourceJob','{"interval":60000,"ignoreException":false,"script":"[{\\n\\temail : \\"a@eoi.com\\",\\n\\tposition : \\"总监\\",\\n\\tdept : \\"it部门\\"\\n},\\n{\\n\\temail : \\"b@eoi.com\\",\\n\\tposition : \\"运维\\",\\n\\tdept : \\"it部门\\"\\n},\\n{\\n\\temail : \\"c@eoi.com\\",\\n\\tposition : \\"处长\\",\\n\\tdept : \\"行政部\\"\\n}\\n]"}',NULL), + ('WarnLogParse_Join_Demo','kafkaSink1609824456742','com.eoi.jax.flink.job.sink.KafkaSinkJob','{"bootstrapServers":["kafka:9092"],"topic":"sinkTopic","autoCreateTopic":true,"kafkaProducerProperties":{"batch.size":"131072"}}',NULL); + +COMMIT; + diff --git a/pom.xml b/pom.xml index 9f451e0..d3fdb51 100644 --- a/pom.xml +++ b/pom.xml @@ -20,6 +20,7 @@ jax-tool jax-flink-job jax-flink-job-common + jax-root @@ -444,5 +445,50 @@ jax-flink-entry-1_12 + + + dev_skip + + + dev_skip + + false + + + + + + com.mycila + license-maven-plugin + + true + + + + org.apache.maven.plugins + maven-checkstyle-plugin + + true + + + + org.apache.maven.plugins + maven-enforcer-plugin + + true + + + + org.apache.maven.plugins + maven-javadoc-plugin + + true + + + + + + + From 314e94f69506b0fd9c4428ea8931184c75afb9f2 Mon Sep 17 00:00:00 2001 From: allenhe888 <363857596@qq.com> Date: Sat, 21 May 2022 09:43:00 +0800 Subject: [PATCH 04/25] enable set mysql:database(jax_db) from env:$JAX_META_DB --- jax-web/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax-web/src/main/resources/application.yml b/jax-web/src/main/resources/application.yml index c13cd0f..8662c1e 100644 --- a/jax-web/src/main/resources/application.yml +++ b/jax-web/src/main/resources/application.yml @@ -68,7 +68,7 @@ spring: - file:${jax.website.root} datasource: # JDBC连接串 - url: jdbc:mysql://${MYSQL_HOST:localhost}:3306/jax_db?characterEncoding=utf8&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai + url: jdbc:mysql://${MYSQL_HOST:localhost}:3306/${JAX_META_DB:jax_db}?characterEncoding=utf8&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai # JDBC用户 username: ${MYSQL_USER:root} # JDBC密码 From 977b318e135f6603488bbe81daf32c22179f6c68 Mon Sep 17 00:00:00 2001 From: allenhe888 <363857596@qq.com> Date: Sat, 21 May 2022 09:43:58 +0800 Subject: [PATCH 05/25] enable read JAX_DB from --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 7f93f82..087cd1d 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,4 @@ node_modules *.pyc .gradle +*pid.lock \ No newline at end of file From 19273a5ae2cea21db391fa3ebe1a150e1de70921 Mon Sep 17 00:00:00 2001 From: allenhe888 <363857596@qq.com> Date: Sat, 21 May 2022 21:15:26 +0800 Subject: [PATCH 06/25] cluster-options --- jax-web/pom.xml | 5 ++ .../jax/web/controller/ClusterController.java | 57 ++++++++++++++-- .../web/model/cluster/config/ConfigDef.java | 68 +++++++++++++++++++ .../model/cluster/config/ConfigDescribe.java | 19 ++++++ 4 files changed, 142 insertions(+), 7 deletions(-) create mode 100644 jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java create mode 100644 jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDescribe.java diff --git a/jax-web/pom.xml b/jax-web/pom.xml index 9c74a41..69e8bc0 100644 --- a/jax-web/pom.xml +++ b/jax-web/pom.xml @@ -118,6 +118,11 @@ + + org.projectlombok + lombok + 1.16.22 + diff --git a/jax-web/src/main/java/com/eoi/jax/web/controller/ClusterController.java b/jax-web/src/main/java/com/eoi/jax/web/controller/ClusterController.java index 91756d9..b3b349f 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/controller/ClusterController.java +++ b/jax-web/src/main/java/com/eoi/jax/web/controller/ClusterController.java @@ -17,18 +17,20 @@ import com.eoi.jax.web.common.ResponseResult; import com.eoi.jax.web.model.cluster.ClusterReq; import com.eoi.jax.web.model.cluster.ClusterResp; +import com.eoi.jax.web.model.cluster.config.ConfigDescribe; +import com.eoi.jax.web.model.opts.MigrationResp; +import com.eoi.jax.web.model.opts.OptsDescribe; +import com.eoi.jax.web.model.opts.OptsFlinkResp; +import com.eoi.jax.web.model.opts.OptsSparkResp; import com.eoi.jax.web.provider.resource.ClusterResourcePool; import com.eoi.jax.web.service.ClusterService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; @RestController public class ClusterController extends V1Controller { @@ -75,4 +77,45 @@ public ResponseResult> listResource() { return new ResponseResult>().setEntity(clusterService.listClusterResource()); } + @GetMapping("cluster-options") + public ResponseResult>> clusterOptionsTemplate() { + MigrationResp resp = new MigrationResp(); + OptsFlinkResp flinkResp = optsService.flinkOptions(); + OptsSparkResp sparkResp = optsService.sparkOptions(); + resp.setFlinkOptsList(flinkResp.getOptsList()); + resp.setSparkOptsList(sparkResp.getOptsList()); + + + class RMClusterOptionDesc{ + private String name; + private String desc; + private String description; + private String entryClass; + private String version; + private List options; + } + + + RMClusterOptionDesc yarnOptDesc = null; + RMClusterOptionDesc k8sOptDesc = null; + RMClusterOptionDesc flinkStandaloneOptDesc = null; + RMClusterOptionDesc sparkStandaloneOptDesc = null; + + Map> typeOptionDescMap = new HashMap<>(); + List supportedRMClusterTypes = Arrays.asList( + yarnOptDesc, + flinkStandaloneOptDesc, + sparkStandaloneOptDesc + ); + + + supportedRMClusterTypes.forEach(typeDesc->{ +// typeOptionDescMap.put(typeDesc.name,typeDesc); + typeOptionDescMap.put(typeDesc.name,typeDesc.options); + }); + + + return new ResponseResult>>().setEntity(typeOptionDescMap); + } + } diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java new file mode 100644 index 0000000..2a36ad8 --- /dev/null +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java @@ -0,0 +1,68 @@ +package com.eoi.jax.web.model.cluster.config; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface ConfigDef { + + public enum Type { + BOOLEAN("BOOL"), + LONG("LONG"), + DOUBLE("DOUBLE"), + STRING("STRING"), + LIST("LIST"), + MAP("MAP"), + ; + +// private final transient Object defaultValue; +// +// Type(Object defaultValue) { +// this.defaultValue = defaultValue; +// } +// +// public Object getDefault(Class variableClass) { +// Object value; +// if (variableClass.isEnum()) { +// value = variableClass.getEnumConstants()[0]; +// } else if (Map.class.isAssignableFrom(variableClass)) { +// value = Collections.emptyMap(); +// } else if (List.class.isAssignableFrom(variableClass)) { +// value = Collections.emptyList(); +// } else { +// value = defaultValue; +// } +// return value; +// } + + public final transient String code; + + Type(String code) { + this.code = code; + } + + public boolean isEqual(String code) { + return this.code.equals(code); + } + + } + + Type type() default Type.STRING; + + String defaultValue() default ""; + + boolean required() default true; + + String description() default ""; + + String group() default ""; + + int displayPosition() default 0; + + boolean hidden() default false; + +} diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDescribe.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDescribe.java new file mode 100644 index 0000000..d75d7b9 --- /dev/null +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDescribe.java @@ -0,0 +1,19 @@ +package com.eoi.jax.web.model.cluster.config; + +import lombok.Data; + +@Data +public class ConfigDescribe { + private String name; + private Object value; + + private String type; + private String defaultValue; + private Boolean required; + private String description; + private String group; + private Integer displayPosition; + private Boolean hidden; + + +} From 6be5727dba6140ad54bc7155a35efd5ce57507b1 Mon Sep 17 00:00:00 2001 From: allenhe888 <363857596@qq.com> Date: Mon, 23 May 2022 09:11:34 +0800 Subject: [PATCH 07/25] =?UTF-8?q?add=202=20api:=20/cluster-options,=20/clu?= =?UTF-8?q?ster/save/{clusterName}=20to=20support=20dyn=20form=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81Cluster=E9=85=8D=E7=BD=AE=E7=9A=84=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jax/web/controller/ClusterController.java | 65 +++++---------- .../model/cluster/bean/ClusterRequest.java | 12 +++ .../model/cluster/bean/CommClusterBean.java | 23 +++++ .../bean/FlinkStandaloneClusterBean.java | 23 +++++ .../model/cluster/bean/K8sClusterBean.java | 7 ++ .../model/cluster/bean/MesosClusterBean.java | 7 ++ .../bean/SparkStandaloneClusterBean.java | 22 +++++ .../model/cluster/bean/YarnClusterBean.java | 10 +++ .../cluster/config/BeanConfigParser.java | 83 +++++++++++++++++++ .../config/BeanConfigsDescription.java | 16 ++++ .../web/model/cluster/config/ConfigBean.java | 16 ++++ .../web/model/cluster/config/ConfigDef.java | 2 +- .../model/cluster/config/ConfigDescribe.java | 19 ----- .../cluster/config/ConfigDescription.java | 33 ++++++++ .../eoi/jax/web/service/ClusterService.java | 5 ++ 15 files changed, 280 insertions(+), 63 deletions(-) create mode 100644 jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/ClusterRequest.java create mode 100644 jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java create mode 100644 jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/FlinkStandaloneClusterBean.java create mode 100644 jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/K8sClusterBean.java create mode 100644 jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/MesosClusterBean.java create mode 100644 jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/SparkStandaloneClusterBean.java create mode 100644 jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/YarnClusterBean.java create mode 100644 jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigParser.java create mode 100644 jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigsDescription.java create mode 100644 jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigBean.java delete mode 100644 jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDescribe.java create mode 100644 jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDescription.java diff --git a/jax-web/src/main/java/com/eoi/jax/web/controller/ClusterController.java b/jax-web/src/main/java/com/eoi/jax/web/controller/ClusterController.java index b3b349f..c90fcde 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/controller/ClusterController.java +++ b/jax-web/src/main/java/com/eoi/jax/web/controller/ClusterController.java @@ -17,18 +17,16 @@ import com.eoi.jax.web.common.ResponseResult; import com.eoi.jax.web.model.cluster.ClusterReq; import com.eoi.jax.web.model.cluster.ClusterResp; -import com.eoi.jax.web.model.cluster.config.ConfigDescribe; -import com.eoi.jax.web.model.opts.MigrationResp; -import com.eoi.jax.web.model.opts.OptsDescribe; -import com.eoi.jax.web.model.opts.OptsFlinkResp; -import com.eoi.jax.web.model.opts.OptsSparkResp; +import com.eoi.jax.web.model.cluster.bean.ClusterRequest; +import com.eoi.jax.web.model.cluster.bean.SparkStandaloneClusterBean; +import com.eoi.jax.web.model.cluster.bean.YarnClusterBean; +import com.eoi.jax.web.model.cluster.config.BeanConfigParser; +import com.eoi.jax.web.model.cluster.config.ConfigDescription; import com.eoi.jax.web.provider.resource.ClusterResourcePool; import com.eoi.jax.web.service.ClusterService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import java.util.Arrays; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -78,44 +76,25 @@ public ResponseResult> listResource() { } @GetMapping("cluster-options") - public ResponseResult>> clusterOptionsTemplate() { - MigrationResp resp = new MigrationResp(); - OptsFlinkResp flinkResp = optsService.flinkOptions(); - OptsSparkResp sparkResp = optsService.sparkOptions(); - resp.setFlinkOptsList(flinkResp.getOptsList()); - resp.setSparkOptsList(sparkResp.getOptsList()); - - - class RMClusterOptionDesc{ - private String name; - private String desc; - private String description; - private String entryClass; - private String version; - private List options; - } - - - RMClusterOptionDesc yarnOptDesc = null; - RMClusterOptionDesc k8sOptDesc = null; - RMClusterOptionDesc flinkStandaloneOptDesc = null; - RMClusterOptionDesc sparkStandaloneOptDesc = null; - - Map> typeOptionDescMap = new HashMap<>(); - List supportedRMClusterTypes = Arrays.asList( - yarnOptDesc, - flinkStandaloneOptDesc, - sparkStandaloneOptDesc - ); - - - supportedRMClusterTypes.forEach(typeDesc->{ -// typeOptionDescMap.put(typeDesc.name,typeDesc); - typeOptionDescMap.put(typeDesc.name,typeDesc.options); - }); + public ResponseResult>> clusterOptionsTemplate() { + Class[] classes = { + YarnClusterBean.class, + SparkStandaloneClusterBean.class + }; + Map> configDescriptions = BeanConfigParser.parseConfigDescriptions(classes); + + return new ResponseResult>>().setEntity(configDescriptions); + } + @PostMapping("cluster/save/{clusterName}") + public ResponseResult save( + @PathVariable(value = "clusterName") String clusterName, + @RequestBody ClusterRequest req) { - return new ResponseResult>>().setEntity(typeOptionDescMap); + clusterService.save(clusterName,req); + return new ResponseResult() +// .setEntity(clusterService.createCluster(req)) + ; } } diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/ClusterRequest.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/ClusterRequest.java new file mode 100644 index 0000000..eb81580 --- /dev/null +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/ClusterRequest.java @@ -0,0 +1,12 @@ +package com.eoi.jax.web.model.cluster.bean; + +public interface ClusterRequest { + + String getClusterName(); + + String getClusterType(); + + Long getUpdateTime(); + + +} diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java new file mode 100644 index 0000000..99422f9 --- /dev/null +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java @@ -0,0 +1,23 @@ +package com.eoi.jax.web.model.cluster.bean; + +import com.eoi.jax.web.model.cluster.config.ConfigBean; +import com.eoi.jax.web.model.cluster.config.ConfigDef; +import lombok.Data; + +@Data +@ConfigBean() +public class CommClusterBean implements ClusterRequest{ + @ConfigDef(description = "集群名",displayPosition = 1) + private String clusterName; + @ConfigDef(description = "集群类型",displayPosition = 2) + private String clusterType; + @ConfigDef(description = "描述",displayPosition = 3,required = false) + private String clusterDescription; + + @ConfigDef(description = "提交超时",displayPosition = 4,required = false,type = ConfigDef.Type.LONG) + private Long timeoutMs; + + @ConfigDef(description = "更新时间",displayPosition = 5,required = false,type = ConfigDef.Type.LONG) + private Long updateTime; + +} diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/FlinkStandaloneClusterBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/FlinkStandaloneClusterBean.java new file mode 100644 index 0000000..c4660d6 --- /dev/null +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/FlinkStandaloneClusterBean.java @@ -0,0 +1,23 @@ +package com.eoi.jax.web.model.cluster.bean; + +import com.eoi.jax.web.model.cluster.config.ConfigDef; +import lombok.Data; + +@Data +//@ConfigBean("abc") +public class FlinkStandaloneClusterBean extends CommClusterBean { + + @ConfigDef(description = "FLINK_WEB_ADDR",displayPosition = 31) + private String flinkWebUrl; + + @ConfigDef(description = "FLINK_JOB_MASTER",displayPosition = 32) + private String flinkServer; + + @ConfigDef(description = "Flink框架集",displayPosition = 33) + private String flinkOptsName; + + @ConfigDef(description = "默认Flink运行集群",displayPosition = 34) + private Boolean defaultFlinkCluster; + + +} diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/K8sClusterBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/K8sClusterBean.java new file mode 100644 index 0000000..b46f65c --- /dev/null +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/K8sClusterBean.java @@ -0,0 +1,7 @@ +package com.eoi.jax.web.model.cluster.bean; + +public class K8sClusterBean extends CommClusterBean { + + + +} diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/MesosClusterBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/MesosClusterBean.java new file mode 100644 index 0000000..d17293e --- /dev/null +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/MesosClusterBean.java @@ -0,0 +1,7 @@ +package com.eoi.jax.web.model.cluster.bean; + +public class MesosClusterBean extends CommClusterBean { + + + +} diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/SparkStandaloneClusterBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/SparkStandaloneClusterBean.java new file mode 100644 index 0000000..3ba91e1 --- /dev/null +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/SparkStandaloneClusterBean.java @@ -0,0 +1,22 @@ +package com.eoi.jax.web.model.cluster.bean; + +import com.eoi.jax.web.model.cluster.config.ConfigBean; +import com.eoi.jax.web.model.cluster.config.ConfigDef; + +@ConfigBean("spark") +public class SparkStandaloneClusterBean extends CommClusterBean { + + + @ConfigDef(description = "SPARK_WEB_ADDR",displayPosition = 21) + private String sparkWebUrl; + @ConfigDef(description = "SPARK_MASTER",displayPosition = 22) + private String sparkServer; + + @ConfigDef(description = "Spark框架集",displayPosition = 23) + private String sparkOptsName; + + @ConfigDef(description = "默认Spark运行集群",displayPosition = 24) + private Boolean defaultSparkCluster; + + +} diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/YarnClusterBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/YarnClusterBean.java new file mode 100644 index 0000000..581b35c --- /dev/null +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/YarnClusterBean.java @@ -0,0 +1,10 @@ +package com.eoi.jax.web.model.cluster.bean; + +public class YarnClusterBean extends CommClusterBean { + + private String hadoopHome; + private String pythonEnv; + private String principal; + private String keytab; + +} diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigParser.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigParser.java new file mode 100644 index 0000000..eb0555c --- /dev/null +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigParser.java @@ -0,0 +1,83 @@ +package com.eoi.jax.web.model.cluster.config; + +import com.eoi.jax.web.common.ResponseCode; +import com.eoi.jax.web.common.exception.BizException; + +import java.lang.reflect.Field; +import java.util.*; + +public class BeanConfigParser { + + public Map getBeanDescriptions(Class... classes) { + Map beanConfigDefs = new LinkedHashMap<>(); + for(Class clazz: classes){ + BeanConfigsDescription beanDesc = parseConfigBeanByClass(clazz); + if(null != beanDesc){ + beanConfigDefs.put(beanDesc.getName(),beanDesc); + } + } + return beanConfigDefs; + } + + public static Map> parseConfigDescriptions(Class... classes) { + Map> beanConfigDefs = new LinkedHashMap<>(); + for(Class clazz: classes){ + BeanConfigsDescription beanDesc = parseConfigBeanByClass(clazz); + if(null != beanDesc){ + beanConfigDefs.put(beanDesc.getName(), new ArrayList<>(beanDesc.getConfigs().values())); + } + } + return beanConfigDefs; + } + + public static BeanConfigsDescription parseConfigBeanByClass(Class clazz) { + List allFields = new LinkedList<>(); + Class tmpClazz = clazz; + while (null != tmpClazz) { + Field[] fields = tmpClazz.getDeclaredFields(); + if(null != fields && fields.length>0){ + for(Field field: fields){ + allFields.add(field); + } + } + tmpClazz =tmpClazz.getSuperclass(); + } + + if(allFields.isEmpty()){ + return null; + } + + Map foundConfigDefs = new LinkedHashMap<>(); + for(Field field: allFields){ + try { + field.setAccessible(true); + ConfigDef annotation = field.getAnnotation(ConfigDef.class); + if (annotation == null) { + continue; + } + String fieldName = field.getName(); + ConfigDescription confDesc = ConfigDescription.fromDef(annotation); + confDesc.setName(fieldName); + foundConfigDefs.put(fieldName,confDesc); + } catch (RuntimeException e) { + throw new BizException(ResponseCode.INVALID_PARAM); + } + } + + if(foundConfigDefs.isEmpty()) { + return null; + } + + String name = clazz.getSimpleName(); + if(clazz.isAnnotationPresent(ConfigBean.class)) { + ConfigBean annotation = (ConfigBean) clazz.getAnnotation(ConfigBean.class); + String value = annotation.value(); + if(! value.isEmpty()){ + name = value; + } + } + return new BeanConfigsDescription(name,clazz.getCanonicalName(),foundConfigDefs); + } + + +} diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigsDescription.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigsDescription.java new file mode 100644 index 0000000..670a0f4 --- /dev/null +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigsDescription.java @@ -0,0 +1,16 @@ +package com.eoi.jax.web.model.cluster.config; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.Map; + +@Data +@AllArgsConstructor +public class BeanConfigsDescription { + + private String name; + private String beanClass; + private Map configs; + +} diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigBean.java new file mode 100644 index 0000000..0b63414 --- /dev/null +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigBean.java @@ -0,0 +1,16 @@ +package com.eoi.jax.web.model.cluster.config; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface ConfigBean { + + String value() default ""; + + +} diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java index 2a36ad8..d47568a 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java @@ -61,7 +61,7 @@ public boolean isEqual(String code) { String group() default ""; - int displayPosition() default 0; + int displayPosition() default Integer.MAX_VALUE; boolean hidden() default false; diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDescribe.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDescribe.java deleted file mode 100644 index d75d7b9..0000000 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDescribe.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.eoi.jax.web.model.cluster.config; - -import lombok.Data; - -@Data -public class ConfigDescribe { - private String name; - private Object value; - - private String type; - private String defaultValue; - private Boolean required; - private String description; - private String group; - private Integer displayPosition; - private Boolean hidden; - - -} diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDescription.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDescription.java new file mode 100644 index 0000000..e332372 --- /dev/null +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDescription.java @@ -0,0 +1,33 @@ +package com.eoi.jax.web.model.cluster.config; + +import lombok.Data; + +@Data +public class ConfigDescription { + private String name; +// private Object value; + + private String type; + private String defaultValue; + private Boolean required; + private String description; + private String group; + private Integer displayPosition; + private Boolean hidden; + + + public static ConfigDescription fromDef(ConfigDef annotation) { + if(null == annotation) { + return null; + } + ConfigDescription desc = new ConfigDescription(); + desc.setType(annotation.type().name()); + desc.setDefaultValue(annotation.defaultValue()); + desc.setRequired(annotation.required()); + desc.setDescription(annotation.description()); + desc.setGroup(annotation.group()); + desc.setDisplayPosition(annotation.displayPosition()); + desc.setHidden(annotation.hidden()); + return desc; + } +} diff --git a/jax-web/src/main/java/com/eoi/jax/web/service/ClusterService.java b/jax-web/src/main/java/com/eoi/jax/web/service/ClusterService.java index 84f9a2f..8e687dd 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/service/ClusterService.java +++ b/jax-web/src/main/java/com/eoi/jax/web/service/ClusterService.java @@ -33,6 +33,7 @@ import com.eoi.jax.web.dao.service.TbPipelineService; import com.eoi.jax.web.model.cluster.ClusterReq; import com.eoi.jax.web.model.cluster.ClusterResp; +import com.eoi.jax.web.model.cluster.bean.ClusterRequest; import com.eoi.jax.web.provider.ResourceManagerProvider; import com.eoi.jax.web.provider.cluster.Cluster; import com.eoi.jax.web.provider.cluster.ClusterProvider; @@ -289,4 +290,8 @@ private boolean exist(String clusterName, boolean existThrow, boolean notExistTh } return count > 0; } + + public void save(String clusterName, ClusterRequest req) { + + } } From e0f690fd42bf940f6a4bb09e144732ed09a6b646 Mon Sep 17 00:00:00 2001 From: allenhe888 <363857596@qq.com> Date: Mon, 23 May 2022 21:37:42 +0800 Subject: [PATCH 08/25] =?UTF-8?q?add=202=20api:=20/cluster-options,=20/clu?= =?UTF-8?q?ster/save/{clusterName}=20to=20support=20dyn=20form=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81Cluster=E9=85=8D=E7=BD=AE=E7=9A=84=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jax-web/pom.xml | 9 +++ .../jax/web/common/config/RouterConfig.java | 5 ++ .../jax/web/common/config/SwaggerConfig.java | 63 +++++++++++++++++++ .../jax/web/controller/ClusterController.java | 33 +++++++--- .../jax/web/controller/OptsController.java | 28 +++++---- .../web/model/cluster/ClusterDynRequest.java | 16 +++++ .../model/cluster/bean/ClusterRequest.java | 14 +++++ .../bean/FlinkStandaloneClusterBean.java | 3 +- .../model/cluster/bean/K8sClusterBean.java | 14 +++++ .../bean/SparkStandaloneClusterBean.java | 18 +++++- .../cluster/config/BeanConfigParser.java | 3 +- .../web/model/cluster/config/ConfigBean.java | 2 - .../web/model/cluster/config/ConfigDef.java | 6 +- .../cluster/config/ConfigDescription.java | 13 +++- .../eoi/jax/web/model/opts/OptsDescribe.java | 9 +++ .../com/eoi/jax/web/model/opts/OptsResp.java | 1 + .../com/eoi/jax/web/model/opts/OptsValue.java | 1 + jax-web/src/main/resources/application.yml | 2 + pom.xml | 25 ++++++++ 19 files changed, 236 insertions(+), 29 deletions(-) create mode 100644 jax-web/src/main/java/com/eoi/jax/web/common/config/SwaggerConfig.java create mode 100644 jax-web/src/main/java/com/eoi/jax/web/model/cluster/ClusterDynRequest.java diff --git a/jax-web/pom.xml b/jax-web/pom.xml index 69e8bc0..55f9fb6 100644 --- a/jax-web/pom.xml +++ b/jax-web/pom.xml @@ -122,6 +122,15 @@ org.projectlombok lombok 1.16.22 + provided + + + io.springfox + springfox-swagger2 + + + io.springfox + springfox-swagger-ui diff --git a/jax-web/src/main/java/com/eoi/jax/web/common/config/RouterConfig.java b/jax-web/src/main/java/com/eoi/jax/web/common/config/RouterConfig.java index 3d6b2b6..db48b4e 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/common/config/RouterConfig.java +++ b/jax-web/src/main/java/com/eoi/jax/web/common/config/RouterConfig.java @@ -90,5 +90,10 @@ protected Resource getResource(String resourcePath, new FileSystemResource(ConfigLoader.load().jax.getWebsite().getIndex()); } }); + + + registry.addResourceHandler("swagger-ui.html") + .addResourceLocations("classpath:/META-INF/resources/"); + } } diff --git a/jax-web/src/main/java/com/eoi/jax/web/common/config/SwaggerConfig.java b/jax-web/src/main/java/com/eoi/jax/web/common/config/SwaggerConfig.java new file mode 100644 index 0000000..2260025 --- /dev/null +++ b/jax-web/src/main/java/com/eoi/jax/web/common/config/SwaggerConfig.java @@ -0,0 +1,63 @@ +package com.eoi.jax.web.common.config; + +import io.swagger.annotations.ApiOperation; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@Configuration +@EnableSwagger2 +@ConditionalOnProperty(prefix = "jax.swagger", name = "swagger-ui-open", havingValue = "true") +public class SwaggerConfig { +// @Bean +// public Docket createRestApi() { +// return new Docket(DocumentationType.SWAGGER_2) +// .apiInfo(apiInfo()) +// .select() +// .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) +// .paths(PathSelectors.any()) +// .build(); +// } + + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("JAX REST API") + .version("v1") + .description("") + .termsOfServiceUrl("") + .build(); + } + + @Bean + public Docket createRestApi(){ + + ApiInfo apiInfo = new ApiInfoBuilder() + .title("JAX REST API") + .version("v1") + .description("") + .termsOfServiceUrl("") + .build(); + + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo) +// .groupName("ElectricProduction") + .enable(true) // 默认开启 + .select() + // apis(): 添加过滤条件; + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) +// .apis(RequestHandlerSelectors.basePackage("com.envisioniot.enlight.stream.ophelper.springboot.controller")) + // paths() 控制哪些路径的api会被显示出来 + .paths(PathSelectors.any()) + .build(); + + } + + +} diff --git a/jax-web/src/main/java/com/eoi/jax/web/controller/ClusterController.java b/jax-web/src/main/java/com/eoi/jax/web/controller/ClusterController.java index c90fcde..62547d2 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/controller/ClusterController.java +++ b/jax-web/src/main/java/com/eoi/jax/web/controller/ClusterController.java @@ -15,17 +15,26 @@ package com.eoi.jax.web.controller; import com.eoi.jax.web.common.ResponseResult; +import com.eoi.jax.web.model.cluster.ClusterDynRequest; import com.eoi.jax.web.model.cluster.ClusterReq; import com.eoi.jax.web.model.cluster.ClusterResp; -import com.eoi.jax.web.model.cluster.bean.ClusterRequest; +import com.eoi.jax.web.model.cluster.bean.FlinkStandaloneClusterBean; +import com.eoi.jax.web.model.cluster.bean.K8sClusterBean; import com.eoi.jax.web.model.cluster.bean.SparkStandaloneClusterBean; import com.eoi.jax.web.model.cluster.bean.YarnClusterBean; import com.eoi.jax.web.model.cluster.config.BeanConfigParser; import com.eoi.jax.web.model.cluster.config.ConfigDescription; import com.eoi.jax.web.provider.resource.ClusterResourcePool; import com.eoi.jax.web.service.ClusterService; +import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.Map; @@ -36,16 +45,19 @@ public class ClusterController extends V1Controller { @Autowired private ClusterService clusterService; + @ApiOperation("获取cluster列表") @GetMapping("cluster") public ResponseResult> list() { return new ResponseResult>().setEntity(clusterService.listCluster()); } + @ApiOperation("获取cluster详情") @GetMapping("cluster/{clusterName}") public ResponseResult get(@PathVariable("clusterName") String clusterName) { return new ResponseResult().setEntity(clusterService.getCluster(clusterName)); } + @ApiOperation("新建cluster") @PostMapping("cluster/{clusterName}") public ResponseResult create(@PathVariable("clusterName") String clusterName, @RequestBody ClusterReq req) { @@ -53,6 +65,7 @@ public ResponseResult create(@PathVariable("clusterName") String cl return new ResponseResult().setEntity(clusterService.createCluster(req)); } + @ApiOperation("更新cluster") @PutMapping("cluster/{clusterName}") public ResponseResult update(@PathVariable("clusterName") String clusterName, @RequestBody ClusterReq req) { @@ -60,41 +73,47 @@ public ResponseResult update(@PathVariable("clusterName") String cl return new ResponseResult().setEntity(clusterService.updateCluster(req)); } + @ApiOperation("删除cluster详情") @DeleteMapping("cluster/{clusterName}") public ResponseResult delete(@PathVariable("clusterName") String clusterName) { return new ResponseResult().setEntity(clusterService.deleteCluster(clusterName)); } + @ApiOperation("获取cluster详情") @GetMapping("cluster/{clusterName}/resource") public ResponseResult getResource(@PathVariable("clusterName") String clusterName) { return new ResponseResult().setEntity(clusterService.getResource(clusterName)); } + @ApiOperation("获取cluster列表") @GetMapping("cluster-resource") public ResponseResult> listResource() { return new ResponseResult>().setEntity(clusterService.listClusterResource()); } + @ApiOperation("获取cluster-动态表") @GetMapping("cluster-options") public ResponseResult>> clusterOptionsTemplate() { Class[] classes = { YarnClusterBean.class, - SparkStandaloneClusterBean.class + SparkStandaloneClusterBean.class, + FlinkStandaloneClusterBean.class, + K8sClusterBean.class, }; Map> configDescriptions = BeanConfigParser.parseConfigDescriptions(classes); return new ResponseResult>>().setEntity(configDescriptions); } + @ApiOperation("新建cluster-动态表") @PostMapping("cluster/save/{clusterName}") public ResponseResult save( @PathVariable(value = "clusterName") String clusterName, - @RequestBody ClusterRequest req) { - - clusterService.save(clusterName,req); + @RequestBody ClusterDynRequest req) { + clusterService.save(clusterName,null); return new ResponseResult() // .setEntity(clusterService.createCluster(req)) - ; + ; } } diff --git a/jax-web/src/main/java/com/eoi/jax/web/controller/OptsController.java b/jax-web/src/main/java/com/eoi/jax/web/controller/OptsController.java index 8d9ab0f..fdac86a 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/controller/OptsController.java +++ b/jax-web/src/main/java/com/eoi/jax/web/controller/OptsController.java @@ -15,21 +15,11 @@ package com.eoi.jax.web.controller; import com.eoi.jax.web.common.ResponseResult; -import com.eoi.jax.web.model.opts.MigrationResp; -import com.eoi.jax.web.model.opts.OptsFlinkReq; -import com.eoi.jax.web.model.opts.OptsFlinkResp; -import com.eoi.jax.web.model.opts.OptsResp; -import com.eoi.jax.web.model.opts.OptsSparkReq; -import com.eoi.jax.web.model.opts.OptsSparkResp; +import com.eoi.jax.web.model.opts.*; import com.eoi.jax.web.service.OptsService; +import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -39,21 +29,25 @@ public class OptsController extends V1Controller { @Autowired private OptsService optsService; + @ApiOperation("获取opts列表") @GetMapping("opts") public ResponseResult> list() { return new ResponseResult>().setEntity(optsService.listOpts()); } + @ApiOperation("获取opts-flink列表") @GetMapping("opts/flink") public ResponseResult> listFlink() { return new ResponseResult>().setEntity(optsService.listFlink()); } + @ApiOperation("获取opts-flink详情") @GetMapping("opts/flink/{flinkOptsName}") public ResponseResult getFlink(@PathVariable("flinkOptsName") String flinkOptsName) { return new ResponseResult().setEntity(optsService.getFlink(flinkOptsName)); } + @ApiOperation("新建opts-flink") @PostMapping("opts/flink/{flinkOptsName}") public ResponseResult createFlink(@PathVariable("flinkOptsName") String flinkOptsName, @RequestBody OptsFlinkReq req) { @@ -61,6 +55,7 @@ public ResponseResult createFlink(@PathVariable("flinkOptsName") return new ResponseResult().setEntity(optsService.createFlink(req)); } + @ApiOperation("更新opts-flink") @PutMapping("opts/flink/{flinkOptsName}") public ResponseResult updateFlink(@PathVariable("flinkOptsName") String flinkOptsName, @RequestBody OptsFlinkReq req) { @@ -68,21 +63,25 @@ public ResponseResult updateFlink(@PathVariable("flinkOptsName") return new ResponseResult().setEntity(optsService.updateFlink(req)); } + @ApiOperation("删除opts-flink详情") @DeleteMapping("opts/flink/{flinkOptsName}") public ResponseResult deleteFlink(@PathVariable("flinkOptsName") String flinkOptsName) { return new ResponseResult().setEntity(optsService.deleteFlink(flinkOptsName)); } + @ApiOperation("获取opts-spark列表") @GetMapping("opts/spark") public ResponseResult> listSpark() { return new ResponseResult>().setEntity(optsService.listSpark()); } + @ApiOperation("获取opts-spark详情") @GetMapping("opts/spark/{sparkOptsName}") public ResponseResult getSpark(@PathVariable("sparkOptsName") String sparkOptsName) { return new ResponseResult().setEntity(optsService.getSpark(sparkOptsName)); } + @ApiOperation("新建opts-spark") @PostMapping("opts/spark/{sparkOptsName}") public ResponseResult createSpark(@PathVariable("sparkOptsName") String sparkOptsName, @RequestBody OptsSparkReq req) { @@ -90,6 +89,7 @@ public ResponseResult createSpark(@PathVariable("sparkOptsName") return new ResponseResult().setEntity(optsService.createSpark(req)); } + @ApiOperation("更新opts-spark") @PutMapping("opts/spark/{sparkOptsName}") public ResponseResult updateSpark(@PathVariable("sparkOptsName") String sparkOptsName, @RequestBody OptsSparkReq req) { @@ -97,11 +97,13 @@ public ResponseResult updateSpark(@PathVariable("sparkOptsName") return new ResponseResult().setEntity(optsService.updateSpark(req)); } + @ApiOperation("删除opts-spark详情") @DeleteMapping("opts/spark/{sparkOptsName}") public ResponseResult deleteSpark(@PathVariable("sparkOptsName") String sparkOptsName) { return new ResponseResult().setEntity(optsService.deleteSpark(sparkOptsName)); } + @ApiOperation("获取opts列表") @GetMapping("opts-options") public ResponseResult options() { MigrationResp resp = new MigrationResp(); diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/ClusterDynRequest.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/ClusterDynRequest.java new file mode 100644 index 0000000..eaf374c --- /dev/null +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/ClusterDynRequest.java @@ -0,0 +1,16 @@ +package com.eoi.jax.web.model.cluster; + +import lombok.Data; + +import java.util.Map; + +@Data +public class ClusterDynRequest { + + private String clusterName; + private String clusterType; + private String clusterDescription; + private Long updateTime; + private Map configs; + +} diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/ClusterRequest.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/ClusterRequest.java index eb81580..5504f93 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/ClusterRequest.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/ClusterRequest.java @@ -1,3 +1,17 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.eoi.jax.web.model.cluster.bean; public interface ClusterRequest { diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/FlinkStandaloneClusterBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/FlinkStandaloneClusterBean.java index c4660d6..a2d3580 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/FlinkStandaloneClusterBean.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/FlinkStandaloneClusterBean.java @@ -16,8 +16,9 @@ public class FlinkStandaloneClusterBean extends CommClusterBean { @ConfigDef(description = "Flink框架集",displayPosition = 33) private String flinkOptsName; - @ConfigDef(description = "默认Flink运行集群",displayPosition = 34) + @ConfigDef(description = "默认Flink运行集群",displayPosition = 34,type = ConfigDef.Type.BOOLEAN) private Boolean defaultFlinkCluster; + } diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/K8sClusterBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/K8sClusterBean.java index b46f65c..d610e20 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/K8sClusterBean.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/K8sClusterBean.java @@ -1,3 +1,17 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.eoi.jax.web.model.cluster.bean; public class K8sClusterBean extends CommClusterBean { diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/SparkStandaloneClusterBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/SparkStandaloneClusterBean.java index 3ba91e1..238221a 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/SparkStandaloneClusterBean.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/SparkStandaloneClusterBean.java @@ -1,3 +1,17 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.eoi.jax.web.model.cluster.bean; import com.eoi.jax.web.model.cluster.config.ConfigBean; @@ -7,7 +21,7 @@ public class SparkStandaloneClusterBean extends CommClusterBean { - @ConfigDef(description = "SPARK_WEB_ADDR",displayPosition = 21) + @ConfigDef(description = "SPARK_WEB_ADDR",displayPosition = 21,group = "Group1") private String sparkWebUrl; @ConfigDef(description = "SPARK_MASTER",displayPosition = 22) private String sparkServer; @@ -15,7 +29,7 @@ public class SparkStandaloneClusterBean extends CommClusterBean { @ConfigDef(description = "Spark框架集",displayPosition = 23) private String sparkOptsName; - @ConfigDef(description = "默认Spark运行集群",displayPosition = 24) + @ConfigDef(description = "默认Spark运行集群",displayPosition = 24,type = ConfigDef.Type.BOOLEAN) private Boolean defaultSparkCluster; diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigParser.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigParser.java index eb0555c..385ecf7 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigParser.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigParser.java @@ -56,8 +56,7 @@ public static BeanConfigsDescription parseConfigBeanByClass(Class clazz) { continue; } String fieldName = field.getName(); - ConfigDescription confDesc = ConfigDescription.fromDef(annotation); - confDesc.setName(fieldName); + ConfigDescription confDesc = ConfigDescription.fromDef(fieldName,annotation); foundConfigDefs.put(fieldName,confDesc); } catch (RuntimeException e) { throw new BizException(ResponseCode.INVALID_PARAM); diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigBean.java index 0b63414..1210349 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigBean.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigBean.java @@ -11,6 +11,4 @@ public @interface ConfigBean { String value() default ""; - - } diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java index d47568a..bf523e9 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java @@ -53,15 +53,19 @@ public boolean isEqual(String code) { Type type() default Type.STRING; + String label() default ""; // 字段显示标签,表示字段在表单中显示的label + String defaultValue() default ""; boolean required() default true; String description() default ""; + String placeholder() default ""; + String group() default ""; - int displayPosition() default Integer.MAX_VALUE; + int displayPosition() default 0; boolean hidden() default false; diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDescription.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDescription.java index e332372..d4488a4 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDescription.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDescription.java @@ -8,26 +8,37 @@ public class ConfigDescription { // private Object value; private String type; + private String label; private String defaultValue; private Boolean required; private String description; + private String placeholder; private String group; private Integer displayPosition; private Boolean hidden; - public static ConfigDescription fromDef(ConfigDef annotation) { + public static ConfigDescription fromDef(String fieldName, ConfigDef annotation) { if(null == annotation) { return null; } ConfigDescription desc = new ConfigDescription(); + desc.setName(fieldName); desc.setType(annotation.type().name()); + String label = annotation.label(); + if(null == label && label.isEmpty()){ + label = fieldName; + } + desc.setLabel(label); desc.setDefaultValue(annotation.defaultValue()); desc.setRequired(annotation.required()); desc.setDescription(annotation.description()); + desc.setPlaceholder(annotation.placeholder()); desc.setGroup(annotation.group()); desc.setDisplayPosition(annotation.displayPosition()); desc.setHidden(annotation.hidden()); return desc; } + + } diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/opts/OptsDescribe.java b/jax-web/src/main/java/com/eoi/jax/web/model/opts/OptsDescribe.java index 4612c19..bbb98ec 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/opts/OptsDescribe.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/opts/OptsDescribe.java @@ -20,6 +20,7 @@ public class OptsDescribe { private Object value; private String description; private Boolean required; + private String label; public String getName() { return name; @@ -65,4 +66,12 @@ public OptsDescribe setRequired(Boolean required) { this.required = required; return this; } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } } diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/opts/OptsResp.java b/jax-web/src/main/java/com/eoi/jax/web/model/opts/OptsResp.java index f51ccb2..4e47c2b 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/opts/OptsResp.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/opts/OptsResp.java @@ -45,6 +45,7 @@ default List getOptsList() { describe.setType(annotation.type().code); describe.setValue(field.get(this)); describe.setDescription(annotation.description()); + describe.setLabel(annotation.label()); describe.setRequired(annotation.required()); list.add(describe); } catch (IllegalAccessException e) { diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/opts/OptsValue.java b/jax-web/src/main/java/com/eoi/jax/web/model/opts/OptsValue.java index 815df29..3407275 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/opts/OptsValue.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/opts/OptsValue.java @@ -25,4 +25,5 @@ OptsValueType type() default OptsValueType.STRING; boolean required() default true; String description() default ""; + String label() default ""; } diff --git a/jax-web/src/main/resources/application.yml b/jax-web/src/main/resources/application.yml index 8662c1e..7bf60b4 100644 --- a/jax-web/src/main/resources/application.yml +++ b/jax-web/src/main/resources/application.yml @@ -55,6 +55,8 @@ jax: tool: jaxToolBin: ${jax.home}/jax/tool/jax-tool.sh jaxToolTimeoutMillis: 60000 + swagger: + swagger-ui-open: true spring: application: diff --git a/pom.xml b/pom.xml index d3fdb51..19339a4 100644 --- a/pom.xml +++ b/pom.xml @@ -61,6 +61,7 @@ 5.2.4 5.2.2 2.4.0 + 2.9.2 1.9.1 @@ -308,6 +309,30 @@ flyway-core ${flyway.version} + + io.springfox + springfox-swagger2 + ${swagger.version} + + + byte-buddy + net.bytebuddy + + + mapstruct + org.mapstruct + + + + + + + + + io.springfox + springfox-swagger-ui + ${swagger.version} + From f22b95d9e9177b3420ce586a10f50251f84015c3 Mon Sep 17 00:00:00 2001 From: allenhe888 <363857596@qq.com> Date: Tue, 24 May 2022 13:25:16 +0800 Subject: [PATCH 09/25] =?UTF-8?q?add=202=20api:=20/cluster-options,=20/clu?= =?UTF-8?q?ster/save/{clusterName}=20to=20support=20dyn=20form=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81Cluster=E9=85=8D=E7=BD=AE=E7=9A=84=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jax/web/controller/ClusterController.java | 20 ++++++---------- .../web/model/cluster/ClusterDynRequest.java | 6 +++++ .../model/cluster/bean/CommClusterBean.java | 17 ++++---------- .../bean/FlinkStandaloneClusterBean.java | 17 +++++++------- .../bean/SparkStandaloneClusterBean.java | 15 ++++++------ .../model/cluster/bean/YarnClusterBean.java | 23 +++++++++++++++++++ .../web/model/cluster/config/ConfigDef.java | 5 +++- .../web/model/cluster/config/EnumChooser.java | 13 +++++++++++ .../eoi/jax/web/service/ClusterService.java | 3 --- 9 files changed, 75 insertions(+), 44 deletions(-) create mode 100644 jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/EnumChooser.java diff --git a/jax-web/src/main/java/com/eoi/jax/web/controller/ClusterController.java b/jax-web/src/main/java/com/eoi/jax/web/controller/ClusterController.java index 62547d2..b87825f 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/controller/ClusterController.java +++ b/jax-web/src/main/java/com/eoi/jax/web/controller/ClusterController.java @@ -15,11 +15,9 @@ package com.eoi.jax.web.controller; import com.eoi.jax.web.common.ResponseResult; -import com.eoi.jax.web.model.cluster.ClusterDynRequest; import com.eoi.jax.web.model.cluster.ClusterReq; import com.eoi.jax.web.model.cluster.ClusterResp; import com.eoi.jax.web.model.cluster.bean.FlinkStandaloneClusterBean; -import com.eoi.jax.web.model.cluster.bean.K8sClusterBean; import com.eoi.jax.web.model.cluster.bean.SparkStandaloneClusterBean; import com.eoi.jax.web.model.cluster.bean.YarnClusterBean; import com.eoi.jax.web.model.cluster.config.BeanConfigParser; @@ -98,22 +96,18 @@ public ResponseResult>> clusterOptionsTemplat YarnClusterBean.class, SparkStandaloneClusterBean.class, FlinkStandaloneClusterBean.class, - K8sClusterBean.class, +// K8sClusterBean.class, // now, not support k8s }; Map> configDescriptions = BeanConfigParser.parseConfigDescriptions(classes); return new ResponseResult>>().setEntity(configDescriptions); } - @ApiOperation("新建cluster-动态表") - @PostMapping("cluster/save/{clusterName}") - public ResponseResult save( - @PathVariable(value = "clusterName") String clusterName, - @RequestBody ClusterDynRequest req) { - clusterService.save(clusterName,null); - return new ResponseResult() -// .setEntity(clusterService.createCluster(req)) - ; - } +// @ApiOperation("新建cluster-动态表") +// @PostMapping("cluster/save") +// public ResponseResult save(@RequestBody ClusterDynRequest req) { +// +// return new ResponseResult(); +// } } diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/ClusterDynRequest.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/ClusterDynRequest.java index eaf374c..836db5f 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/ClusterDynRequest.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/ClusterDynRequest.java @@ -1,5 +1,6 @@ package com.eoi.jax.web.model.cluster; +import com.eoi.jax.web.dao.entity.TbCluster; import lombok.Data; import java.util.Map; @@ -13,4 +14,9 @@ public class ClusterDynRequest { private Long updateTime; private Map configs; + + public TbCluster toEntity(TbCluster tbCluster) { + + return null; + } } diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java index 99422f9..e86cd3f 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java @@ -1,23 +1,16 @@ package com.eoi.jax.web.model.cluster.bean; -import com.eoi.jax.web.model.cluster.config.ConfigBean; import com.eoi.jax.web.model.cluster.config.ConfigDef; import lombok.Data; @Data -@ConfigBean() -public class CommClusterBean implements ClusterRequest{ - @ConfigDef(description = "集群名",displayPosition = 1) - private String clusterName; - @ConfigDef(description = "集群类型",displayPosition = 2) - private String clusterType; - @ConfigDef(description = "描述",displayPosition = 3,required = false) - private String clusterDescription; +public class CommClusterBean { - @ConfigDef(description = "提交超时",displayPosition = 4,required = false,type = ConfigDef.Type.LONG) +// @ConfigDef(label = "描述",displayPosition = 3,required = false) +// private String clusterDescription; + + @ConfigDef(label = "提交超时",displayPosition = 4,required = false,type = ConfigDef.Type.LONG,description = "单位秒",defaultValue = "60") private Long timeoutMs; - @ConfigDef(description = "更新时间",displayPosition = 5,required = false,type = ConfigDef.Type.LONG) - private Long updateTime; } diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/FlinkStandaloneClusterBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/FlinkStandaloneClusterBean.java index a2d3580..70fe34f 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/FlinkStandaloneClusterBean.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/FlinkStandaloneClusterBean.java @@ -1,23 +1,24 @@ package com.eoi.jax.web.model.cluster.bean; +import com.eoi.jax.web.model.cluster.config.ConfigBean; import com.eoi.jax.web.model.cluster.config.ConfigDef; import lombok.Data; @Data -//@ConfigBean("abc") +@ConfigBean("flink_standalone") public class FlinkStandaloneClusterBean extends CommClusterBean { - @ConfigDef(description = "FLINK_WEB_ADDR",displayPosition = 31) + @ConfigDef(label = "FLINK_WEB_ADDR",displayPosition = 31) private String flinkWebUrl; - @ConfigDef(description = "FLINK_JOB_MASTER",displayPosition = 32) + @ConfigDef(label = "FLINK_JOB_MASTER",displayPosition = 32) private String flinkServer; - @ConfigDef(description = "Flink框架集",displayPosition = 33) - private String flinkOptsName; - - @ConfigDef(description = "默认Flink运行集群",displayPosition = 34,type = ConfigDef.Type.BOOLEAN) - private Boolean defaultFlinkCluster; +// @ConfigDef(label = "Flink框架集",displayPosition = 33) +// private String flinkOptsName; +// +// @ConfigDef(label = "默认Flink运行集群",displayPosition = 34,type = ConfigDef.Type.BOOL) +// private Boolean defaultFlinkCluster; diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/SparkStandaloneClusterBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/SparkStandaloneClusterBean.java index 238221a..579868d 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/SparkStandaloneClusterBean.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/SparkStandaloneClusterBean.java @@ -17,20 +17,21 @@ import com.eoi.jax.web.model.cluster.config.ConfigBean; import com.eoi.jax.web.model.cluster.config.ConfigDef; -@ConfigBean("spark") +@ConfigBean("spark_stanalone") public class SparkStandaloneClusterBean extends CommClusterBean { - @ConfigDef(description = "SPARK_WEB_ADDR",displayPosition = 21,group = "Group1") + @ConfigDef(label = "SPARK_WEB_ADDR",displayPosition = 21) private String sparkWebUrl; - @ConfigDef(description = "SPARK_MASTER",displayPosition = 22) + @ConfigDef(label = "SPARK_MASTER",displayPosition = 22) private String sparkServer; - @ConfigDef(description = "Spark框架集",displayPosition = 23) - private String sparkOptsName; - @ConfigDef(description = "默认Spark运行集群",displayPosition = 24,type = ConfigDef.Type.BOOLEAN) - private Boolean defaultSparkCluster; +// @ConfigDef(label = "Spark框架集",displayPosition = 23) +// private String sparkOptsName; +// +// @ConfigDef(label = "默认Spark运行集群",displayPosition = 24,type = ConfigDef.Type.BOOL) +// private Boolean defaultSparkCluster; } diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/YarnClusterBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/YarnClusterBean.java index 581b35c..ac6dd35 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/YarnClusterBean.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/YarnClusterBean.java @@ -1,10 +1,33 @@ package com.eoi.jax.web.model.cluster.bean; +import com.eoi.jax.web.model.cluster.config.ConfigBean; +import com.eoi.jax.web.model.cluster.config.ConfigDef; + +@ConfigBean("yarn") public class YarnClusterBean extends CommClusterBean { + @ConfigDef(label = "HADOOP_HOME",displayPosition = 11) private String hadoopHome; + @ConfigDef(label = "PYTHON_HOME",displayPosition = 12) private String pythonEnv; + @ConfigDef(label = "Kerberos Principal",displayPosition = 13) private String principal; + @ConfigDef(label = "Kerberos Keytab",displayPosition = 14,type = ConfigDef.Type.TEXT) private String keytab; + +// @ConfigDef(label = "Flink框架集",displayPosition = 15) +// private String flinkOptsName; +// +// @ConfigDef(label = "Spark框架集",displayPosition = 16) +// private String sparkOptsName; +// +// @ConfigDef(label = "默认Spark运行集群",displayPosition = 17,type = ConfigDef.Type.BOOL) +// private Boolean defaultSparkCluster; +// +// @ConfigDef(label = "默认Flink运行集群",displayPosition = 18,type = ConfigDef.Type.BOOL) +// private Boolean defaultFlinkCluster; + + + } diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java index bf523e9..360353d 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java @@ -11,12 +11,15 @@ public @interface ConfigDef { public enum Type { - BOOLEAN("BOOL"), + BOOL("BOOL"), LONG("LONG"), DOUBLE("DOUBLE"), STRING("STRING"), + TEXT("TEXT"), LIST("LIST"), MAP("MAP"), + ENUM_CHOOSER("ENUM_CHOOSER"), + ; // private final transient Object defaultValue; diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/EnumChooser.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/EnumChooser.java new file mode 100644 index 0000000..6398b22 --- /dev/null +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/EnumChooser.java @@ -0,0 +1,13 @@ +package com.eoi.jax.web.model.cluster.config; + +public @interface EnumChooser { + + String[] candidates() default {}; + + String defaultValue() default ""; + + boolean enableCandidatesByURL() default false; + + String url() default ""; + +} diff --git a/jax-web/src/main/java/com/eoi/jax/web/service/ClusterService.java b/jax-web/src/main/java/com/eoi/jax/web/service/ClusterService.java index 8e687dd..5d28193 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/service/ClusterService.java +++ b/jax-web/src/main/java/com/eoi/jax/web/service/ClusterService.java @@ -33,7 +33,6 @@ import com.eoi.jax.web.dao.service.TbPipelineService; import com.eoi.jax.web.model.cluster.ClusterReq; import com.eoi.jax.web.model.cluster.ClusterResp; -import com.eoi.jax.web.model.cluster.bean.ClusterRequest; import com.eoi.jax.web.provider.ResourceManagerProvider; import com.eoi.jax.web.provider.cluster.Cluster; import com.eoi.jax.web.provider.cluster.ClusterProvider; @@ -291,7 +290,5 @@ private boolean exist(String clusterName, boolean existThrow, boolean notExistTh return count > 0; } - public void save(String clusterName, ClusterRequest req) { - } } From 86d9dfcba9c63341d977208d85e78422f5c756d1 Mon Sep 17 00:00:00 2001 From: allenhe888 <363857596@qq.com> Date: Tue, 24 May 2022 14:32:45 +0800 Subject: [PATCH 10/25] =?UTF-8?q?add=202=20api:=20/cluster-options,=20/clu?= =?UTF-8?q?ster/save/{clusterName}=20to=20support=20dyn=20form=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81Cluster=E9=85=8D=E7=BD=AE=E7=9A=84=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/eoi/jax/web/model/cluster/bean/CommClusterBean.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java index e86cd3f..2eee12f 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java @@ -9,7 +9,7 @@ public class CommClusterBean { // @ConfigDef(label = "描述",displayPosition = 3,required = false) // private String clusterDescription; - @ConfigDef(label = "提交超时",displayPosition = 4,required = false,type = ConfigDef.Type.LONG,description = "单位秒",defaultValue = "60") + @ConfigDef(label = "提交超时",displayPosition = 4,required = false,type = ConfigDef.Type.LONG,description = "单位毫秒") private Long timeoutMs; From eba038dd1563cc8c398a18ae46a3383e4553bee6 Mon Sep 17 00:00:00 2001 From: allenhe888 <363857596@qq.com> Date: Tue, 24 May 2022 17:43:14 +0800 Subject: [PATCH 11/25] modify for checkstyle and clusterBean's some props --- jax-web/pom.xml | 2 +- .../jax/web/common/config/SwaggerConfig.java | 26 +----- .../jax/web/controller/ClusterController.java | 9 +- .../jax/web/controller/OptsController.java | 15 +++- .../web/model/cluster/ClusterDynRequest.java | 22 ----- .../model/cluster/bean/ClusterRequest.java | 26 ------ .../model/cluster/bean/CommClusterBean.java | 19 ++-- .../bean/FlinkStandaloneClusterBean.java | 27 ++++-- .../bean/SparkStandaloneClusterBean.java | 28 ++++-- .../model/cluster/bean/YarnClusterBean.java | 61 +++++++++---- .../cluster/config/BeanConfigParser.java | 31 ++++--- .../config/BeanConfigsDescription.java | 35 ++++++-- .../web/model/cluster/config/ConfigDef.java | 20 ----- .../cluster/config/ConfigDescription.java | 86 +++++++++++++++++-- 14 files changed, 241 insertions(+), 166 deletions(-) delete mode 100644 jax-web/src/main/java/com/eoi/jax/web/model/cluster/ClusterDynRequest.java delete mode 100644 jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/ClusterRequest.java diff --git a/jax-web/pom.xml b/jax-web/pom.xml index 55f9fb6..4322b36 100644 --- a/jax-web/pom.xml +++ b/jax-web/pom.xml @@ -122,7 +122,7 @@ org.projectlombok lombok 1.16.22 - provided + test io.springfox diff --git a/jax-web/src/main/java/com/eoi/jax/web/common/config/SwaggerConfig.java b/jax-web/src/main/java/com/eoi/jax/web/common/config/SwaggerConfig.java index 2260025..804c2f7 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/common/config/SwaggerConfig.java +++ b/jax-web/src/main/java/com/eoi/jax/web/common/config/SwaggerConfig.java @@ -16,44 +16,20 @@ @EnableSwagger2 @ConditionalOnProperty(prefix = "jax.swagger", name = "swagger-ui-open", havingValue = "true") public class SwaggerConfig { -// @Bean -// public Docket createRestApi() { -// return new Docket(DocumentationType.SWAGGER_2) -// .apiInfo(apiInfo()) -// .select() -// .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) -// .paths(PathSelectors.any()) -// .build(); -// } - - private ApiInfo apiInfo() { - return new ApiInfoBuilder() - .title("JAX REST API") - .version("v1") - .description("") - .termsOfServiceUrl("") - .build(); - } @Bean - public Docket createRestApi(){ - + public Docket createRestApi() { ApiInfo apiInfo = new ApiInfoBuilder() .title("JAX REST API") .version("v1") .description("") .termsOfServiceUrl("") .build(); - return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo) -// .groupName("ElectricProduction") .enable(true) // 默认开启 .select() - // apis(): 添加过滤条件; .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) -// .apis(RequestHandlerSelectors.basePackage("com.envisioniot.enlight.stream.ophelper.springboot.controller")) - // paths() 控制哪些路径的api会被显示出来 .paths(PathSelectors.any()) .build(); diff --git a/jax-web/src/main/java/com/eoi/jax/web/controller/ClusterController.java b/jax-web/src/main/java/com/eoi/jax/web/controller/ClusterController.java index b87825f..f33a6e1 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/controller/ClusterController.java +++ b/jax-web/src/main/java/com/eoi/jax/web/controller/ClusterController.java @@ -96,18 +96,11 @@ public ResponseResult>> clusterOptionsTemplat YarnClusterBean.class, SparkStandaloneClusterBean.class, FlinkStandaloneClusterBean.class, -// K8sClusterBean.class, // now, not support k8s + // K8sClusterBean.class, // now, not support k8s }; Map> configDescriptions = BeanConfigParser.parseConfigDescriptions(classes); return new ResponseResult>>().setEntity(configDescriptions); } -// @ApiOperation("新建cluster-动态表") -// @PostMapping("cluster/save") -// public ResponseResult save(@RequestBody ClusterDynRequest req) { -// -// return new ResponseResult(); -// } - } diff --git a/jax-web/src/main/java/com/eoi/jax/web/controller/OptsController.java b/jax-web/src/main/java/com/eoi/jax/web/controller/OptsController.java index fdac86a..2bdc007 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/controller/OptsController.java +++ b/jax-web/src/main/java/com/eoi/jax/web/controller/OptsController.java @@ -15,11 +15,22 @@ package com.eoi.jax.web.controller; import com.eoi.jax.web.common.ResponseResult; -import com.eoi.jax.web.model.opts.*; +import com.eoi.jax.web.model.opts.MigrationResp; +import com.eoi.jax.web.model.opts.OptsFlinkReq; +import com.eoi.jax.web.model.opts.OptsFlinkResp; +import com.eoi.jax.web.model.opts.OptsResp; +import com.eoi.jax.web.model.opts.OptsSparkReq; +import com.eoi.jax.web.model.opts.OptsSparkResp; import com.eoi.jax.web.service.OptsService; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; import java.util.List; diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/ClusterDynRequest.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/ClusterDynRequest.java deleted file mode 100644 index 836db5f..0000000 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/ClusterDynRequest.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.eoi.jax.web.model.cluster; - -import com.eoi.jax.web.dao.entity.TbCluster; -import lombok.Data; - -import java.util.Map; - -@Data -public class ClusterDynRequest { - - private String clusterName; - private String clusterType; - private String clusterDescription; - private Long updateTime; - private Map configs; - - - public TbCluster toEntity(TbCluster tbCluster) { - - return null; - } -} diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/ClusterRequest.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/ClusterRequest.java deleted file mode 100644 index 5504f93..0000000 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/ClusterRequest.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.eoi.jax.web.model.cluster.bean; - -public interface ClusterRequest { - - String getClusterName(); - - String getClusterType(); - - Long getUpdateTime(); - - -} diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java index 2eee12f..859e305 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java @@ -1,16 +1,23 @@ package com.eoi.jax.web.model.cluster.bean; import com.eoi.jax.web.model.cluster.config.ConfigDef; -import lombok.Data; -@Data public class CommClusterBean { -// @ConfigDef(label = "描述",displayPosition = 3,required = false) -// private String clusterDescription; - - @ConfigDef(label = "提交超时",displayPosition = 4,required = false,type = ConfigDef.Type.LONG,description = "单位毫秒") + @ConfigDef(label = "提交超时", + displayPosition = 4,required = false, + type = ConfigDef.Type.LONG, + description = "单位毫秒") private Long timeoutMs; + public Long getTimeoutMs() { + return timeoutMs; + } + + public void setTimeoutMs(Long timeoutMs) { + this.timeoutMs = timeoutMs; + } + + } diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/FlinkStandaloneClusterBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/FlinkStandaloneClusterBean.java index 70fe34f..cb8268b 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/FlinkStandaloneClusterBean.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/FlinkStandaloneClusterBean.java @@ -2,24 +2,33 @@ import com.eoi.jax.web.model.cluster.config.ConfigBean; import com.eoi.jax.web.model.cluster.config.ConfigDef; -import lombok.Data; -@Data @ConfigBean("flink_standalone") public class FlinkStandaloneClusterBean extends CommClusterBean { - @ConfigDef(label = "FLINK_WEB_ADDR",displayPosition = 31) + @ConfigDef(label = "FLINK_WEB_ADDR", + description = "http://localhost:8081", + displayPosition = 31) private String flinkWebUrl; - @ConfigDef(label = "FLINK_JOB_MASTER",displayPosition = 32) + @ConfigDef(label = "FLINK_JOB_MASTER", + description = "localhost:8081", + displayPosition = 32) private String flinkServer; -// @ConfigDef(label = "Flink框架集",displayPosition = 33) -// private String flinkOptsName; -// -// @ConfigDef(label = "默认Flink运行集群",displayPosition = 34,type = ConfigDef.Type.BOOL) -// private Boolean defaultFlinkCluster; + public String getFlinkWebUrl() { + return flinkWebUrl; + } + public void setFlinkWebUrl(String flinkWebUrl) { + this.flinkWebUrl = flinkWebUrl; + } + public String getFlinkServer() { + return flinkServer; + } + public void setFlinkServer(String flinkServer) { + this.flinkServer = flinkServer; + } } diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/SparkStandaloneClusterBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/SparkStandaloneClusterBean.java index 579868d..0ea3c4b 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/SparkStandaloneClusterBean.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/SparkStandaloneClusterBean.java @@ -17,21 +17,31 @@ import com.eoi.jax.web.model.cluster.config.ConfigBean; import com.eoi.jax.web.model.cluster.config.ConfigDef; -@ConfigBean("spark_stanalone") +@ConfigBean("spark_standalone") public class SparkStandaloneClusterBean extends CommClusterBean { - - @ConfigDef(label = "SPARK_WEB_ADDR",displayPosition = 21) + @ConfigDef(label = "SPARK_WEB_ADDR", + description = "http://localhost:8088", + displayPosition = 21) private String sparkWebUrl; - @ConfigDef(label = "SPARK_MASTER",displayPosition = 22) + @ConfigDef(label = "SPARK_MASTER", + description = "http://localhost:7077", + displayPosition = 22) private String sparkServer; + public String getSparkWebUrl() { + return sparkWebUrl; + } -// @ConfigDef(label = "Spark框架集",displayPosition = 23) -// private String sparkOptsName; -// -// @ConfigDef(label = "默认Spark运行集群",displayPosition = 24,type = ConfigDef.Type.BOOL) -// private Boolean defaultSparkCluster; + public void setSparkWebUrl(String sparkWebUrl) { + this.sparkWebUrl = sparkWebUrl; + } + public String getSparkServer() { + return sparkServer; + } + public void setSparkServer(String sparkServer) { + this.sparkServer = sparkServer; + } } diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/YarnClusterBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/YarnClusterBean.java index ac6dd35..1c7faeb 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/YarnClusterBean.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/YarnClusterBean.java @@ -6,28 +6,59 @@ @ConfigBean("yarn") public class YarnClusterBean extends CommClusterBean { - @ConfigDef(label = "HADOOP_HOME",displayPosition = 11) + @ConfigDef(label = "HADOOP_HOME", + description = "配置JAX所在服务器的路径,可用${JAX_HOME}引用相对位置", + required = false, + displayPosition = 11) private String hadoopHome; - @ConfigDef(label = "PYTHON_HOME",displayPosition = 12) + + @ConfigDef(label = "PYTHON_HOME", + description = "配置Python环境", + required = false, + displayPosition = 12) private String pythonEnv; - @ConfigDef(label = "Kerberos Principal",displayPosition = 13) + + @ConfigDef(label = "Kerberos Principal", + description = "如果hadoop集群开启认证,填写Kerberos认证对应的principal", + required = false, + displayPosition = 13) private String principal; - @ConfigDef(label = "Kerberos Keytab",displayPosition = 14,type = ConfigDef.Type.TEXT) + + @ConfigDef(label = "Kerberos Keytab", + description = "如果hadoop集群开启认证,填写Kerberos认证对应的keytab文件。配置JAX所在服务器的路径,可用${JAX_HOME}引用相对位置", + required = false, + displayPosition = 14,type = ConfigDef.Type.TEXT) private String keytab; + public String getHadoopHome() { + return hadoopHome; + } + + public void setHadoopHome(String hadoopHome) { + this.hadoopHome = hadoopHome; + } + + public String getPythonEnv() { + return pythonEnv; + } + + public void setPythonEnv(String pythonEnv) { + this.pythonEnv = pythonEnv; + } -// @ConfigDef(label = "Flink框架集",displayPosition = 15) -// private String flinkOptsName; -// -// @ConfigDef(label = "Spark框架集",displayPosition = 16) -// private String sparkOptsName; -// -// @ConfigDef(label = "默认Spark运行集群",displayPosition = 17,type = ConfigDef.Type.BOOL) -// private Boolean defaultSparkCluster; -// -// @ConfigDef(label = "默认Flink运行集群",displayPosition = 18,type = ConfigDef.Type.BOOL) -// private Boolean defaultFlinkCluster; + public String getPrincipal() { + return principal; + } + public void setPrincipal(String principal) { + this.principal = principal; + } + public String getKeytab() { + return keytab; + } + public void setKeytab(String keytab) { + this.keytab = keytab; + } } diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigParser.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigParser.java index 385ecf7..0d5bed2 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigParser.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigParser.java @@ -4,15 +4,20 @@ import com.eoi.jax.web.common.exception.BizException; import java.lang.reflect.Field; -import java.util.*; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + public class BeanConfigParser { public Map getBeanDescriptions(Class... classes) { Map beanConfigDefs = new LinkedHashMap<>(); - for(Class clazz: classes){ + for (Class clazz: classes) { BeanConfigsDescription beanDesc = parseConfigBeanByClass(clazz); - if(null != beanDesc){ + if (null != beanDesc) { beanConfigDefs.put(beanDesc.getName(),beanDesc); } } @@ -21,9 +26,9 @@ public Map getBeanDescriptions(Class... classes) public static Map> parseConfigDescriptions(Class... classes) { Map> beanConfigDefs = new LinkedHashMap<>(); - for(Class clazz: classes){ + for (Class clazz: classes) { BeanConfigsDescription beanDesc = parseConfigBeanByClass(clazz); - if(null != beanDesc){ + if (null != beanDesc) { beanConfigDefs.put(beanDesc.getName(), new ArrayList<>(beanDesc.getConfigs().values())); } } @@ -35,20 +40,20 @@ public static BeanConfigsDescription parseConfigBeanByClass(Class clazz) { Class tmpClazz = clazz; while (null != tmpClazz) { Field[] fields = tmpClazz.getDeclaredFields(); - if(null != fields && fields.length>0){ - for(Field field: fields){ + if (null != fields && fields.length > 0) { + for (Field field: fields) { allFields.add(field); } } - tmpClazz =tmpClazz.getSuperclass(); + tmpClazz = tmpClazz.getSuperclass(); } - if(allFields.isEmpty()){ + if (allFields.isEmpty()) { return null; } Map foundConfigDefs = new LinkedHashMap<>(); - for(Field field: allFields){ + for (Field field: allFields) { try { field.setAccessible(true); ConfigDef annotation = field.getAnnotation(ConfigDef.class); @@ -63,15 +68,15 @@ public static BeanConfigsDescription parseConfigBeanByClass(Class clazz) { } } - if(foundConfigDefs.isEmpty()) { + if (foundConfigDefs.isEmpty()) { return null; } String name = clazz.getSimpleName(); - if(clazz.isAnnotationPresent(ConfigBean.class)) { + if (clazz.isAnnotationPresent(ConfigBean.class)) { ConfigBean annotation = (ConfigBean) clazz.getAnnotation(ConfigBean.class); String value = annotation.value(); - if(! value.isEmpty()){ + if (! value.isEmpty()) { name = value; } } diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigsDescription.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigsDescription.java index 670a0f4..85feb26 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigsDescription.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigsDescription.java @@ -1,16 +1,41 @@ package com.eoi.jax.web.model.cluster.config; -import lombok.AllArgsConstructor; -import lombok.Data; - import java.util.Map; -@Data -@AllArgsConstructor + public class BeanConfigsDescription { private String name; private String beanClass; private Map configs; + public BeanConfigsDescription(String name, String beanClass, Map configs) { + this.name = name; + this.beanClass = beanClass; + this.configs = configs; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getBeanClass() { + return beanClass; + } + + public void setBeanClass(String beanClass) { + this.beanClass = beanClass; + } + + public Map getConfigs() { + return configs; + } + + public void setConfigs(Map configs) { + this.configs = configs; + } } diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java index 360353d..753b2be 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java @@ -22,26 +22,6 @@ public enum Type { ; -// private final transient Object defaultValue; -// -// Type(Object defaultValue) { -// this.defaultValue = defaultValue; -// } -// -// public Object getDefault(Class variableClass) { -// Object value; -// if (variableClass.isEnum()) { -// value = variableClass.getEnumConstants()[0]; -// } else if (Map.class.isAssignableFrom(variableClass)) { -// value = Collections.emptyMap(); -// } else if (List.class.isAssignableFrom(variableClass)) { -// value = Collections.emptyList(); -// } else { -// value = defaultValue; -// } -// return value; -// } - public final transient String code; Type(String code) { diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDescription.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDescription.java index d4488a4..e47203f 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDescription.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDescription.java @@ -1,11 +1,8 @@ package com.eoi.jax.web.model.cluster.config; -import lombok.Data; -@Data public class ConfigDescription { private String name; -// private Object value; private String type; private String label; @@ -17,16 +14,95 @@ public class ConfigDescription { private Integer displayPosition; private Boolean hidden; + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public String getDefaultValue() { + return defaultValue; + } + + public void setDefaultValue(String defaultValue) { + this.defaultValue = defaultValue; + } + + public Boolean getRequired() { + return required; + } + + public void setRequired(Boolean required) { + this.required = required; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getPlaceholder() { + return placeholder; + } + + public void setPlaceholder(String placeholder) { + this.placeholder = placeholder; + } + + public String getGroup() { + return group; + } + + public void setGroup(String group) { + this.group = group; + } + + public Integer getDisplayPosition() { + return displayPosition; + } + + public void setDisplayPosition(Integer displayPosition) { + this.displayPosition = displayPosition; + } + + public Boolean getHidden() { + return hidden; + } + + public void setHidden(Boolean hidden) { + this.hidden = hidden; + } public static ConfigDescription fromDef(String fieldName, ConfigDef annotation) { - if(null == annotation) { + if (null == annotation) { return null; } ConfigDescription desc = new ConfigDescription(); desc.setName(fieldName); desc.setType(annotation.type().name()); String label = annotation.label(); - if(null == label && label.isEmpty()){ + if (null == label && label.isEmpty()) { label = fieldName; } desc.setLabel(label); From fea7fdb6e6c619ddc0bea9a538b12f3d20b60620 Mon Sep 17 00:00:00 2001 From: allenhe888 <363857596@qq.com> Date: Wed, 25 May 2022 07:24:17 +0800 Subject: [PATCH 12/25] add licese header --- .../jax/web/common/config/SwaggerConfig.java | 14 +++++ .../model/cluster/bean/CommClusterBean.java | 16 ++++- .../bean/FlinkStandaloneClusterBean.java | 14 +++++ .../model/cluster/bean/MesosClusterBean.java | 14 +++++ .../model/cluster/bean/YarnClusterBean.java | 14 +++++ .../cluster/config/BeanConfigParser.java | 14 +++++ .../config/BeanConfigsDescription.java | 14 +++++ .../web/model/cluster/config/ConfigBean.java | 14 +++++ .../web/model/cluster/config/ConfigDef.java | 14 +++++ .../cluster/config/ConfigDescription.java | 14 +++++ .../web/model/cluster/config/EnumChooser.java | 14 +++++ .../eoi/jax/web/service/ClusterService.java | 2 +- pom.xml | 63 +++++++++++++++++++ 13 files changed, 219 insertions(+), 2 deletions(-) diff --git a/jax-web/src/main/java/com/eoi/jax/web/common/config/SwaggerConfig.java b/jax-web/src/main/java/com/eoi/jax/web/common/config/SwaggerConfig.java index 804c2f7..5a87826 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/common/config/SwaggerConfig.java +++ b/jax-web/src/main/java/com/eoi/jax/web/common/config/SwaggerConfig.java @@ -1,3 +1,17 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.eoi.jax.web.common.config; import io.swagger.annotations.ApiOperation; diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java index 859e305..589e5f8 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java @@ -1,3 +1,17 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.eoi.jax.web.model.cluster.bean; import com.eoi.jax.web.model.cluster.config.ConfigDef; @@ -5,7 +19,7 @@ public class CommClusterBean { @ConfigDef(label = "提交超时", - displayPosition = 4,required = false, + displayPosition = 4, type = ConfigDef.Type.LONG, description = "单位毫秒") private Long timeoutMs; diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/FlinkStandaloneClusterBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/FlinkStandaloneClusterBean.java index cb8268b..1081748 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/FlinkStandaloneClusterBean.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/FlinkStandaloneClusterBean.java @@ -1,3 +1,17 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.eoi.jax.web.model.cluster.bean; import com.eoi.jax.web.model.cluster.config.ConfigBean; diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/MesosClusterBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/MesosClusterBean.java index d17293e..021d9c1 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/MesosClusterBean.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/MesosClusterBean.java @@ -1,3 +1,17 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.eoi.jax.web.model.cluster.bean; public class MesosClusterBean extends CommClusterBean { diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/YarnClusterBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/YarnClusterBean.java index 1c7faeb..af45d08 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/YarnClusterBean.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/YarnClusterBean.java @@ -1,3 +1,17 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.eoi.jax.web.model.cluster.bean; import com.eoi.jax.web.model.cluster.config.ConfigBean; diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigParser.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigParser.java index 0d5bed2..7dcecdd 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigParser.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigParser.java @@ -1,3 +1,17 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.eoi.jax.web.model.cluster.config; import com.eoi.jax.web.common.ResponseCode; diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigsDescription.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigsDescription.java index 85feb26..b877695 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigsDescription.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/BeanConfigsDescription.java @@ -1,3 +1,17 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.eoi.jax.web.model.cluster.config; import java.util.Map; diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigBean.java index 1210349..64069f4 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigBean.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigBean.java @@ -1,3 +1,17 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.eoi.jax.web.model.cluster.config; import java.lang.annotation.ElementType; diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java index 753b2be..bbe999d 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java @@ -1,3 +1,17 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.eoi.jax.web.model.cluster.config; import java.lang.annotation.ElementType; diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDescription.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDescription.java index e47203f..d6f4ded 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDescription.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDescription.java @@ -1,3 +1,17 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.eoi.jax.web.model.cluster.config; diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/EnumChooser.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/EnumChooser.java index 6398b22..4f417ab 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/EnumChooser.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/EnumChooser.java @@ -1,3 +1,17 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.eoi.jax.web.model.cluster.config; public @interface EnumChooser { diff --git a/jax-web/src/main/java/com/eoi/jax/web/service/ClusterService.java b/jax-web/src/main/java/com/eoi/jax/web/service/ClusterService.java index 5d28193..fe4f21f 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/service/ClusterService.java +++ b/jax-web/src/main/java/com/eoi/jax/web/service/ClusterService.java @@ -225,7 +225,7 @@ private void verifyReq(ClusterReq req) { if (verifySparkOpts) { verifySparkOpts(req.getSparkOptsName()); } - if (req.getTimeoutMs() <= 0) { + if (null == req.getTimeoutMs() || req.getTimeoutMs() <= 0) { req.setTimeoutMs(600000L); } } diff --git a/pom.xml b/pom.xml index 19339a4..1043bfa 100644 --- a/pom.xml +++ b/pom.xml @@ -345,6 +345,14 @@ license-maven-plugin 3.0 + + + + + + + + license validate @@ -515,5 +523,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From d06242c1fee2a32859d87feebff2d769437c24a1 Mon Sep 17 00:00:00 2001 From: allenhe888 <363857596@qq.com> Date: Wed, 25 May 2022 11:00:05 +0800 Subject: [PATCH 13/25] remove kafka-mgr --- docker-compose.yml | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index e17f60a..b949b5e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,7 +10,7 @@ services: MYSQL_USER: root MYSQL_PASSWORD: my-secret-pw ports: - - "9999:9999" + - "49999:9999" volumes: - web-data:/app/jax/jar_dir networks: @@ -35,7 +35,7 @@ services: FLINK_PROPERTIES= jobmanager.rpc.address: jobmanager ports: - - "8081:8081" + - "48081:8081" networks: - jax db: @@ -44,15 +44,13 @@ services: MYSQL_ROOT_PASSWORD: my-secret-pw MYSQL_DATABASE: jax_db ports: - - "23306:3306" + - "43306:3306" networks: - jax volumes: - db-data:/var/lib/mysql zookeeper: image: wurstmeister/zookeeper - ports: - - "2181:2181" networks: - jax kafka: @@ -60,7 +58,7 @@ services: depends_on: - zookeeper ports: - - "9092:9092" + - "49092:9092" environment: KAFKA_ADVERTISED_HOST_NAME: ${KAFKA_AD_IP:-192.168.51.124} KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092 @@ -69,18 +67,6 @@ services: KAFKA_CREATE_TOPICS: sourceTopic:2:1,sinkTopic:2:1 networks: - jax - kafka-manager: - image: sheepkiller/kafka-manager - command: -Dpidfile.path=/dev/null - depends_on: - - zookeeper - - kafka - ports: - - "9000:9000" - environment: - ZK_HOSTS: zookeeper:2181 - networks: - - jax networks: jax: From 4c46a752f5e3b613fede544cf4fed9e1e1e26c60 Mon Sep 17 00:00:00 2001 From: allenhe888 <363857596@qq.com> Date: Wed, 25 May 2022 11:50:16 +0800 Subject: [PATCH 14/25] remove kafka-mgr --- docker-compose.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index b949b5e..4391e2a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -57,10 +57,8 @@ services: image: wurstmeister/kafka depends_on: - zookeeper - ports: - - "49092:9092" environment: - KAFKA_ADVERTISED_HOST_NAME: ${KAFKA_AD_IP:-192.168.51.124} + KAFKA_ADVERTISED_HOST_NAME: ${KAFKA_AD_IP:-kafka} KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_BROKER_ID: 1 From 93a7573df52c1f8e5cae78b7115f15a5375f4618 Mon Sep 17 00:00:00 2001 From: allenhe888 <363857596@qq.com> Date: Wed, 25 May 2022 16:21:50 +0800 Subject: [PATCH 15/25] remove kafka-mgr --- README.md | 202 +++++++++++++++++++++++---------------- docker-compose.yml | 22 ++--- docs/CompileAndDeploy.md | 122 +++++++++++++++++++++++ 3 files changed, 251 insertions(+), 95 deletions(-) create mode 100644 docs/CompileAndDeploy.md diff --git a/README.md b/README.md index 38b5ff1..2f6d0f4 100644 --- a/README.md +++ b/README.md @@ -30,130 +30,167 @@ JAX是一款轻量级的数据平台,JAX本身并不强制与某种数据存 +# QuickStart 快速构建和体验JAX -# Compile and Deploy 编译部署 +依赖环境: docker, docker-compose -### Environment Requriment +预编译好的JAX已发布到 aliyun docker镜像, 这里提供与MySQL, Flink, Kafka等服务快速集成部署的docker-compose.yml + -nodejs, npm, yarn, vue-cli -tar dos2unix +### 创建docker-compose.yml -### Jax运行环境 +使用如下命令新建 docker-compose.yml 或手动创建下文内容的 docker-compose.yml: -### Jax项目编译环境 +```sh +tee docker-compose.yml <<'EOF' + +version: "3" +services: + web: + image: registry.cn-hangzhou.aliyuncs.com/eoitek/jax:1.0.0 + depends_on: + - db + - taskmanager + environment: + MYSQL_HOST: db + MYSQL_USER: root + MYSQL_PASSWORD: my-secret-pw + ports: + - "49999:9999" + volumes: + - web-data:/app/jax/jar_dir + networks: + - jax + db: + image: mysql:5.7.25 + environment: + MYSQL_ROOT_PASSWORD: my-secret-pw + MYSQL_DATABASE: jax_db + networks: + - jax + volumes: + - db-data:/var/lib/mysql + taskmanager: + image: ${FLINK_IMAGE:-flink:1.9.1-scala_2.11} + command: taskmanager + depends_on: + - jobmanager + environment: + - | + FLINK_PROPERTIES= + jobmanager.rpc.address: jobmanager + taskmanager.numberOfTaskSlots: 4 + networks: + - jax + jobmanager: + image: ${FLINK_IMAGE:-flink:1.9.1-scala_2.11} + command: jobmanager + environment: + - | + FLINK_PROPERTIES= + jobmanager.rpc.address: jobmanager + ports: + - "48081:8081" + networks: + - jax + zookeeper: + image: wurstmeister/zookeeper + networks: + - jax + kafka: + image: wurstmeister/kafka + depends_on: + - zookeeper + environment: + KAFKA_ADVERTISED_HOST_NAME: ${KAFKA_AD_IP:-kafka} + KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092 + KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 + KAFKA_BROKER_ID: 1 + KAFKA_CREATE_TOPICS: sourceTopic:2:1,sinkTopic:2:1 + networks: + - jax + +networks: + jax: + +volumes: + db-data: + web-data: + +EOF -Jax项目手动编译, 可在Window/Linux/Unix 准备好如下命令 -- java -- maven -- nodejs 10.0+ -- yarn/yarnpkg -- vue-cli -- dos2unix -- make -- docker-compose +``` +其中的 registry.cn-hangzhou.aliyuncs.com/eoitek/jax:1.0.0 即为已准备好的JAX docker镜像 -### Download 预编译版下载 +### 一键启动各服务 +```sh +docker-compose up -### Compile & Package 编译打包 +``` +服务验证和访问: +- 访问JAX服务: http://{ip}:49999 +- 访问Flink Standalone 测试集群: http://{ip}:48081 -cd 到jax的根目录, 使用make 命令编译和打包出整个jax-all-1.0.0-xxx.tar.gz安装包(位于其tmp目录下); -make package-all主要包括: -- mvn clean package -DskipTests 后端编译打包 -- yarn install && yarn build 前端编译打包 -- wget flink-xx.tgz && tar -zxf flink-xx.tgz 下载并解压安装flink/spark -```sh -cd jax +# Compile and Deploy 编译部署 -make package-all -tar -xvf tmp/jax-all-*.tar.gz -C /opt/jax +### Requriments 编译环境要求 -``` +- 基础命令: tar, make, java; +- 前端命令: nodejs, npm, yarn/yarnpkg, vue-cli; +- Docker命令: docker, docker-compose ; -编译打包注意点: -- 如果make package-all失败, 可用尝试分别对后端项目(mvn clean package )和 前端项目(cd jax-ui && yarnpkg install & yarnpkg build) 进行编译测试, 确认环境没问题; -- make packag-all中使用 ./mvnw 第一次执行时可能很慢(在下载maven/wrapper包), 需耐心等待,不宜打断; -- 编译中若遇到报错,可参考 [常见问题列表](https://datasalon.yuque.com/staff-dg3tgh/pg6cpg/uem0ig) -### Deploy 项目部署 +### Compile 编译部署命令 -项目启动前, 需要确保Hadoop已安装好; +使用make命令(基于Makefile) 进行项目编译和打包 -解压jax-all-xxx.tar.gz 项目后, 直接执行其 start.sh脚本即可启动JAX项目, 如见到打印: Jax Application is Ready, 则一般项目启动成功; ```sh -$ ./start.sh - -# 项目启动成功, 由如下打印 - _ _ |_ _ _|_. ___ _ | _ -| | |\/|_)(_| | |_\ |_)||_|_\ - / | - 3.1.2 -Jax Application is Ready - -``` - -如果项目启动成功, 默认jax-web访问端口是9999, 访问 http://{hostname}:9999 即可; - -如果没有此打印,或者 9999端口未开,则可能项目启动失败, 具体原因详解 logs/jax-web.error.log 排查; -- 一般启动失败是 jax/application.yml中配置缺失或配错导致; -- 注意其中 jax.home, MySQL的DB和账号密码; - +# 编译并打包 +make package-all -##### 开启Debug +# 或者直接: 打包+ 制作Docker镜像 +make image -```sh -export JAX_WEB_DEBUG_PORT=45000 ``` -在start.sh 脚本中,若JAX_WEB_DEBUG_PORT存在则会增加jvm debug参数, 方便进行远程Debug和调试; - -### Docker镜像和运行 +编译打包好的tar.gz文件即位于 tmp 目录下的 jax-all-xxx.tar.gz 压缩文件; +解压后, 需要对 jax/application.yml配置文件 配置好正确的如下变量,才能start.sh启动 +- jax.home(或$JAX_HOME环境变量) 为解压的JAX安装目录; +- spring.datasource中配置正确的MySQL url账号密码 -提前确认相关环境命令: -- node/npm/yarn -- mvn/make -- docker/docker-compose +配置成功后, 启动JAX服务 -首先需要生成 jax docker镜像 ```sh -make image -``` +cd $JAX_HOME +./start.sh -默认安装的flink计算引擎是1.9.1版本,并会启1个Flink Standalone模式容器, -本测试Docker Demo中会启1个Zookeeper/Kafka服务, 需要指定一个用于外网可访问的Kafka广播IP环境变量: $KAFKA_AD_IP -可先通过如下命令生成 KAFKA_AD_IP=宿主机IP变量, 再 docker-compose up 构建和启动 mysql,redis,kafka,jax等服务; -```sh -export KAFKA_AD_IP=$(ip addr|grep "global ens"| tail -n1|awk '{print $2}'|awk -F"/" '{print $1}') -# 或者在命令行直接赋值环境变量: KAFKA_AD_IP -# export KAFKA_AD_IP=192.168.51.124 -echo $KAFKA_AD_IP -``` +# 项目启动成功, 由如下打印 + _ _ |_ _ _|_. ___ _ | _ +| | |\/|_)(_| | |_\ |_)||_|_\ + / | + 3.1.2 +Jax Application is Ready -With flink 1.9 standalone cluster: -```sh -docker-compose up ``` -With flink 1.12 standalone cluster: -```sh -$ make image -$ FLINK_IMAGE=flink:1.12.3-scala_2.11 docker-compose up -``` +### 详细编译部署手册 +项目编译和部署详细文档, 可参见 [编译部署](docs/CompileAndDeploy.md) @@ -167,6 +204,3 @@ $ FLINK_IMAGE=flink:1.12.3-scala_2.11 docker-compose up # Communication -# License - - diff --git a/docker-compose.yml b/docker-compose.yml index 4391e2a..b2fc686 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,6 +15,17 @@ services: - web-data:/app/jax/jar_dir networks: - jax + db: + image: mysql:5.7.25 + environment: + MYSQL_ROOT_PASSWORD: my-secret-pw + MYSQL_DATABASE: jax_db + ports: + - "43306:3306" + networks: + - jax + volumes: + - db-data:/var/lib/mysql taskmanager: image: ${FLINK_IMAGE:-flink:1.9.1-scala_2.11} command: taskmanager @@ -38,17 +49,6 @@ services: - "48081:8081" networks: - jax - db: - image: mysql:5.7.25 - environment: - MYSQL_ROOT_PASSWORD: my-secret-pw - MYSQL_DATABASE: jax_db - ports: - - "43306:3306" - networks: - - jax - volumes: - - db-data:/var/lib/mysql zookeeper: image: wurstmeister/zookeeper networks: diff --git a/docs/CompileAndDeploy.md b/docs/CompileAndDeploy.md new file mode 100644 index 0000000..859fce9 --- /dev/null +++ b/docs/CompileAndDeploy.md @@ -0,0 +1,122 @@ + + +### Environment Requriment + +nodejs, npm, yarn, vue-cli +tar dos2unix + +### Jax运行环境 + +### Jax项目编译环境 + +Jax项目手动编译, 可在Window/Linux/Unix 准备好如下命令 +- java +- maven +- nodejs 10.0+ +- yarn/yarnpkg +- vue-cli +- dos2unix +- make +- docker-compose + + + +### Download 预编译版下载 + + + +### Compile & Package 编译打包 + + +cd 到jax的根目录, 使用make 命令编译和打包出整个jax-all-1.0.0-xxx.tar.gz安装包(位于其tmp目录下); + +make package-all主要包括: +- mvn clean package -DskipTests 后端编译打包 +- yarn install && yarn build 前端编译打包 +- wget flink-xx.tgz && tar -zxf flink-xx.tgz 下载并解压安装flink/spark + + +```sh +cd jax + +make package-all + +tar -xvf tmp/jax-all-*.tar.gz -C /opt/jax + +``` + +编译打包注意点: +- 如果make package-all失败, 可用尝试分别对后端项目(mvn clean package )和 前端项目(cd jax-ui && yarnpkg install & yarnpkg build) 进行编译测试, 确认环境没问题; +- make packag-all中使用 ./mvnw 第一次执行时可能很慢(在下载maven/wrapper包), 需耐心等待,不宜打断; +- 编译中若遇到报错,可参考 [常见问题列表](https://datasalon.yuque.com/staff-dg3tgh/pg6cpg/uem0ig) + + +### Deploy 项目部署 + +项目启动前, 需要确保Hadoop已安装好; + +解压jax-all-xxx.tar.gz 项目后, 直接执行其 start.sh脚本即可启动JAX项目, 如见到打印: Jax Application is Ready, 则一般项目启动成功; +```sh +$ ./start.sh + +# 项目启动成功, 由如下打印 + _ _ |_ _ _|_. ___ _ | _ +| | |\/|_)(_| | |_\ |_)||_|_\ + / | + 3.1.2 +Jax Application is Ready + +``` + +如果项目启动成功, 默认jax-web访问端口是9999, 访问 http://{hostname}:9999 即可; + +如果没有此打印,或者 9999端口未开,则可能项目启动失败, 具体原因详解 logs/jax-web.error.log 排查; +- 一般启动失败是 jax/application.yml中配置缺失或配错导致; +- 注意其中 jax.home, MySQL的DB和账号密码; + + +##### 开启Debug + +```sh +export JAX_WEB_DEBUG_PORT=45000 +``` +在start.sh 脚本中,若JAX_WEB_DEBUG_PORT存在则会增加jvm debug参数, 方便进行远程Debug和调试; + + +### Docker镜像和运行 + +提前确认相关环境命令: +- node/npm/yarn +- mvn/make +- docker/docker-compose + + +首先需要生成 jax docker镜像 +```sh +make image +``` + + +默认安装的flink计算引擎是1.9.1版本,并会启1个Flink Standalone模式容器, +本测试Docker Demo中会启1个Zookeeper/Kafka服务, 需要指定一个用于外网可访问的Kafka广播IP环境变量: $KAFKA_AD_IP +可先通过如下命令生成 KAFKA_AD_IP=宿主机IP变量, 再 docker-compose up 构建和启动 mysql,redis,kafka,jax等服务; + +```sh +export KAFKA_AD_IP=$(ip addr|grep "global ens"| tail -n1|awk '{print $2}'|awk -F"/" '{print $1}') +# 或者在命令行直接赋值环境变量: KAFKA_AD_IP +# export KAFKA_AD_IP=192.168.51.124 +echo $KAFKA_AD_IP +``` + +With flink 1.9 standalone cluster: +```sh +docker-compose up +``` + +With flink 1.12 standalone cluster: + +```sh +$ make image +$ FLINK_IMAGE=flink:1.12.3-scala_2.11 docker-compose up +``` + From c8cb65ad8188d92ba4da45e8a2ef5be48348e787 Mon Sep 17 00:00:00 2001 From: allenhe888 <363857596@qq.com> Date: Wed, 25 May 2022 16:32:32 +0800 Subject: [PATCH 16/25] remove kafka-mgr --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2f6d0f4..2b3b7ec 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ JAX是一款轻量级的数据平台,JAX本身并不强制与某种数据存 -# QuickStart 快速构建和体验JAX +# QuickStart 快速构建和体验 依赖环境: docker, docker-compose From ecdb6f0cb92743bff7d53729e4b416358449873c Mon Sep 17 00:00:00 2001 From: allenhe888 <363857596@qq.com> Date: Fri, 27 May 2022 14:45:05 +0800 Subject: [PATCH 17/25] modify HadoopUtils to support read $HADOOP_CONF_DIR from etc or etc/hadoop --- jax-web/pom.xml | 4 ++ .../eoi/jax/web/common/config/AppConfig.java | 4 +- .../eoi/jax/web/common/util/HadoopUtil.java | 54 +++++++++++++++++++ .../model/cluster/bean/CommClusterBean.java | 12 +++++ .../web/model/cluster/config/ConfigDef.java | 2 + .../web/provider/cluster/ClusterProvider.java | 11 ++-- .../jax/web/common/util/TestHadoopUtil.java | 29 ++++++++++ pom.xml | 5 ++ 8 files changed, 115 insertions(+), 6 deletions(-) create mode 100644 jax-web/src/test/java/com/eoi/jax/web/common/util/TestHadoopUtil.java diff --git a/jax-web/pom.xml b/jax-web/pom.xml index 4322b36..37603c1 100644 --- a/jax-web/pom.xml +++ b/jax-web/pom.xml @@ -132,6 +132,10 @@ io.springfox springfox-swagger-ui + + junit + junit + diff --git a/jax-web/src/main/java/com/eoi/jax/web/common/config/AppConfig.java b/jax-web/src/main/java/com/eoi/jax/web/common/config/AppConfig.java index 3dce51e..4cefeb4 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/common/config/AppConfig.java +++ b/jax-web/src/main/java/com/eoi/jax/web/common/config/AppConfig.java @@ -28,7 +28,9 @@ public class AppConfig { public static final String JAX_JOB_JAR_LIB = "jaxjobjarlib"; public static final String JAX_JOB_WORK_DIR = "jaxjobworkdir"; public static final String JAX_JOB_PYTHON_DIR = "jaxjobpythondir"; - public static final String HADOOP_ETC_RELATIVE = "etc/hadoop"; + public static final String HADOOP_ETC_RELATIVE = "etc"; + public static final String HADOOP_ETC_HADOOP_RELATIVE = "etc/hadoop"; + public static final String HADOOP_CONF = "conf"; public static final String HADOOP_YARN_BIN_RELATIVE = "bin/yarn"; public static final String FLINK_BIN_RELATIVE = "bin/flink"; public static final String SPARK_BIN_RELATIVE = "bin/spark-submit"; diff --git a/jax-web/src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java b/jax-web/src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java index d4477ac..5d49703 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java +++ b/jax-web/src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java @@ -17,6 +17,7 @@ import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; import com.eoi.jax.web.common.ResponseCode; +import com.eoi.jax.web.common.config.AppConfig; import com.eoi.jax.web.common.exception.BizException; import com.eoi.jax.web.dao.entity.TbCluster; import com.eoi.jax.web.provider.cluster.ClusterVariable; @@ -36,6 +37,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; +import java.nio.file.Paths; import java.security.PrivilegedExceptionAction; import java.util.ArrayList; import java.util.Collection; @@ -78,6 +80,10 @@ public static String readHdfsServer(String configHome) { public static String readYarnWebUrl(String configHome) { Configuration config = readConfig(configHome); + return getYarnWebUrl(config); + } + + public static String getYarnWebUrl(Configuration config) { String schema = "http://"; String webUrl = null; // HA @@ -224,4 +230,52 @@ private static Path getUploadPath(FileSystem fs, String fileName) throws IOExcep } return finalPath; } + + public static Configuration getHadoopConf(String hadoopHome) { + String[] possiblePaths = new String[4]; + if (hadoopHome != null) { + possiblePaths[0] = Paths.get(hadoopHome, AppConfig.HADOOP_ETC_RELATIVE).toString(); // eoitek hadoop + possiblePaths[1] = Paths.get(hadoopHome,AppConfig.HADOOP_ETC_HADOOP_RELATIVE).toString(); // apache hadoop + possiblePaths[2] = Paths.get(hadoopHome,AppConfig.HADOOP_CONF).toString(); + } + if (null != System.getenv(AppConfig.HADOOP_CONF_DIR)) { + possiblePaths[3] = Paths.get(System.getenv(AppConfig.HADOOP_CONF_DIR)).toString(); // eoitek hadoop + } + Configuration hadoopConf = null; + for (String possibleHadoopConfPath :possiblePaths) { + hadoopConf = getHadoopConfiguration(possibleHadoopConfPath); + if (hadoopConf != null) { + break; + } + } + return hadoopConf; + } + + public static Configuration getHadoopConfiguration(String hadoopConfDir) { + if (new File(hadoopConfDir).exists()) { + Configuration hadoopConfiguration = new Configuration(); + File coreSite = new File(hadoopConfDir, "core-site.xml"); + if (coreSite.exists()) { + hadoopConfiguration.addResource(new Path(coreSite.getAbsolutePath())); + } + File hdfsSite = new File(hadoopConfDir, "hdfs-site.xml"); + if (hdfsSite.exists()) { + hadoopConfiguration.addResource(new Path(hdfsSite.getAbsolutePath())); + } + File yarnSite = new File(hadoopConfDir, "yarn-site.xml"); + if (yarnSite.exists()) { + hadoopConfiguration.addResource(new Path(yarnSite.getAbsolutePath())); + } + // Add mapred-site.xml. We need to read configurations like compression codec. + File mapredSite = new File(hadoopConfDir, "mapred-site.xml"); + if (mapredSite.exists()) { + hadoopConfiguration.addResource(new Path(mapredSite.getAbsolutePath())); + } + return hadoopConfiguration; + } + return null; + } + + + } diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java index 589e5f8..daf9d52 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java @@ -24,6 +24,12 @@ public class CommClusterBean { description = "单位毫秒") private Long timeoutMs; + @ConfigDef(label = "单位", + displayPosition = 5, + type = ConfigDef.Type.STRING, + description = "信息补充, unit: ms") + private String unit; + public Long getTimeoutMs() { return timeoutMs; } @@ -32,6 +38,12 @@ public void setTimeoutMs(Long timeoutMs) { this.timeoutMs = timeoutMs; } + public String getUnit() { + return unit; + } + public void setUnit(String unit) { + this.unit = unit; + } } diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java index bbe999d..76ba556 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/config/ConfigDef.java @@ -66,4 +66,6 @@ public boolean isEqual(String code) { boolean hidden() default false; + + } diff --git a/jax-web/src/main/java/com/eoi/jax/web/provider/cluster/ClusterProvider.java b/jax-web/src/main/java/com/eoi/jax/web/provider/cluster/ClusterProvider.java index ee33675..b6f0cb6 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/provider/cluster/ClusterProvider.java +++ b/jax-web/src/main/java/com/eoi/jax/web/provider/cluster/ClusterProvider.java @@ -24,6 +24,7 @@ import com.eoi.jax.web.model.cluster.ClusterReq; import com.eoi.jax.web.model.opts.OptsFlinkReq; import com.eoi.jax.web.model.opts.OptsSparkReq; +import org.apache.hadoop.conf.Configuration; import org.springframework.stereotype.Service; @Service @@ -108,11 +109,11 @@ public ClusterReq fillUpdateClusterReq(ClusterReq req) { private ClusterReq fillHadoopMetaInfo(ClusterReq req) { if (ClusterType.YARN.isEqual(req.getClusterType()) && StrUtil.isNotEmpty(req.getHadoopHome())) { - String hadoopConfDir = ClusterVariable.genHadoopConf( - ClusterVariable.replaceVariable(req.getHadoopHome()) - ); - req.setHdfsServer(HadoopUtil.readHdfsServer(hadoopConfDir)); - req.setYarnWebUrl(HadoopUtil.readYarnWebUrl(hadoopConfDir)); + Configuration hadoopConf = HadoopUtil.getHadoopConf(req.getHadoopHome()); + if (null != hadoopConf) { + req.setHdfsServer(hadoopConf.get(HadoopUtil.HDFS_DEFAULT_NAME_KEY)); + req.setYarnWebUrl(HadoopUtil.getYarnWebUrl(hadoopConf)); + } } return req; } diff --git a/jax-web/src/test/java/com/eoi/jax/web/common/util/TestHadoopUtil.java b/jax-web/src/test/java/com/eoi/jax/web/common/util/TestHadoopUtil.java new file mode 100644 index 0000000..af83ce7 --- /dev/null +++ b/jax-web/src/test/java/com/eoi/jax/web/common/util/TestHadoopUtil.java @@ -0,0 +1,29 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.eoi.jax.web.common.util; + +import org.apache.hadoop.conf.Configuration; +import org.junit.Test; + +public class TestHadoopUtil { + + @Test + public void testGetConfDir() { + String hadoopHome = "D:\\app-bigdata\\hadoop\\hadoop-2.7.7"; + Configuration conf = HadoopUtil.getHadoopConf(hadoopHome); + System.out.println(conf); + } + +} diff --git a/pom.xml b/pom.xml index 1043bfa..83e967a 100644 --- a/pom.xml +++ b/pom.xml @@ -333,6 +333,11 @@ springfox-swagger-ui ${swagger.version} + + junit + junit + ${junit.version} + From 5942d284e7cff2f70412861b1e8eae8bab409604 Mon Sep 17 00:00:00 2001 From: allenhe888 <363857596@qq.com> Date: Fri, 27 May 2022 14:57:10 +0800 Subject: [PATCH 18/25] modify HadoopUtils to support read $HADOOP_CONF_DIR from etc or etc/hadoop --- .../src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jax-web/src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java b/jax-web/src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java index 5d49703..6cef0ed 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java +++ b/jax-web/src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java @@ -236,10 +236,10 @@ public static Configuration getHadoopConf(String hadoopHome) { if (hadoopHome != null) { possiblePaths[0] = Paths.get(hadoopHome, AppConfig.HADOOP_ETC_RELATIVE).toString(); // eoitek hadoop possiblePaths[1] = Paths.get(hadoopHome,AppConfig.HADOOP_ETC_HADOOP_RELATIVE).toString(); // apache hadoop - possiblePaths[2] = Paths.get(hadoopHome,AppConfig.HADOOP_CONF).toString(); + possiblePaths[2] = Paths.get(hadoopHome,AppConfig.HADOOP_CONF).toString(); // old hadoop version } if (null != System.getenv(AppConfig.HADOOP_CONF_DIR)) { - possiblePaths[3] = Paths.get(System.getenv(AppConfig.HADOOP_CONF_DIR)).toString(); // eoitek hadoop + possiblePaths[3] = Paths.get(System.getenv(AppConfig.HADOOP_CONF_DIR)).toString(); // from env } Configuration hadoopConf = null; for (String possibleHadoopConfPath :possiblePaths) { From ab81fff638bda84bd4d812477bbcf3f485217e19 Mon Sep 17 00:00:00 2001 From: allenhe888 <363857596@qq.com> Date: Tue, 31 May 2022 16:26:36 +0800 Subject: [PATCH 19/25] modify HadoopUtils to support read $HADOOP_CONF_DIR from etc or etc/hadoop --- .../eoi/jax/web/common/util/HadoopUtil.java | 64 ++++++++----------- .../eoi/jax/web/provider/cluster/Cluster.java | 3 +- .../web/provider/cluster/ClusterProvider.java | 4 +- .../jax/web/common/util/TestHadoopUtil.java | 12 +++- 4 files changed, 42 insertions(+), 41 deletions(-) diff --git a/jax-web/src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java b/jax-web/src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java index 6cef0ed..fa9eafc 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java +++ b/jax-web/src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java @@ -37,6 +37,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; +import java.nio.file.Files; import java.nio.file.Paths; import java.security.PrivilegedExceptionAction; import java.util.ArrayList; @@ -231,51 +232,38 @@ private static Path getUploadPath(FileSystem fs, String fileName) throws IOExcep return finalPath; } - public static Configuration getHadoopConf(String hadoopHome) { - String[] possiblePaths = new String[4]; - if (hadoopHome != null) { - possiblePaths[0] = Paths.get(hadoopHome, AppConfig.HADOOP_ETC_RELATIVE).toString(); // eoitek hadoop - possiblePaths[1] = Paths.get(hadoopHome,AppConfig.HADOOP_ETC_HADOOP_RELATIVE).toString(); // apache hadoop - possiblePaths[2] = Paths.get(hadoopHome,AppConfig.HADOOP_CONF).toString(); // old hadoop version - } - if (null != System.getenv(AppConfig.HADOOP_CONF_DIR)) { - possiblePaths[3] = Paths.get(System.getenv(AppConfig.HADOOP_CONF_DIR)).toString(); // from env - } - Configuration hadoopConf = null; - for (String possibleHadoopConfPath :possiblePaths) { - hadoopConf = getHadoopConfiguration(possibleHadoopConfPath); - if (hadoopConf != null) { - break; - } + public static Configuration getConfFromHadoopHome(String hadoopHome) { + String confDir = getConfDirFromHadoopHome(hadoopHome); + if (null != confDir) { + return readConfig(confDir); } - return hadoopConf; + return null; } - public static Configuration getHadoopConfiguration(String hadoopConfDir) { - if (new File(hadoopConfDir).exists()) { - Configuration hadoopConfiguration = new Configuration(); - File coreSite = new File(hadoopConfDir, "core-site.xml"); - if (coreSite.exists()) { - hadoopConfiguration.addResource(new Path(coreSite.getAbsolutePath())); - } - File hdfsSite = new File(hadoopConfDir, "hdfs-site.xml"); - if (hdfsSite.exists()) { - hadoopConfiguration.addResource(new Path(hdfsSite.getAbsolutePath())); + public static String getConfDirFromHadoopHome(String hadoopHome) { + String[] possiblePaths = new String[4]; + String confDir = null; + try { + if (hadoopHome != null) { + possiblePaths[0] = Paths.get(hadoopHome, AppConfig.HADOOP_ETC_RELATIVE).toString(); // eoitek hadoop + possiblePaths[1] = Paths.get(hadoopHome,AppConfig.HADOOP_ETC_HADOOP_RELATIVE).toString(); // apache hadoop + possiblePaths[2] = Paths.get(hadoopHome,AppConfig.HADOOP_CONF).toString(); // old hadoop version } - File yarnSite = new File(hadoopConfDir, "yarn-site.xml"); - if (yarnSite.exists()) { - hadoopConfiguration.addResource(new Path(yarnSite.getAbsolutePath())); + if (null != System.getenv(AppConfig.HADOOP_CONF_DIR)) { + possiblePaths[3] = Paths.get(System.getenv(AppConfig.HADOOP_CONF_DIR)).toString(); // from env } - // Add mapred-site.xml. We need to read configurations like compression codec. - File mapredSite = new File(hadoopConfDir, "mapred-site.xml"); - if (mapredSite.exists()) { - hadoopConfiguration.addResource(new Path(mapredSite.getAbsolutePath())); + + for (String possibleHadoopConfPath :possiblePaths) { + + if (Files.exists(Paths.get(possibleHadoopConfPath)) + && Files.exists(Paths.get(possibleHadoopConfPath,"core-site.xml"))) { + confDir = possibleHadoopConfPath; + } } - return hadoopConfiguration; + } catch (RuntimeException e) { + logger.warn("Failed to parse HADOOP_CONF_DIR,cause: " + e.getMessage(),e); } - return null; + return confDir; } - - } diff --git a/jax-web/src/main/java/com/eoi/jax/web/provider/cluster/Cluster.java b/jax-web/src/main/java/com/eoi/jax/web/provider/cluster/Cluster.java index 52a39b1..fa46328 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/provider/cluster/Cluster.java +++ b/jax-web/src/main/java/com/eoi/jax/web/provider/cluster/Cluster.java @@ -17,6 +17,7 @@ import com.eoi.jax.web.common.config.ConfigLoader; import com.eoi.jax.web.common.config.JaxConfig; import com.eoi.jax.web.common.util.Common; +import com.eoi.jax.web.common.util.HadoopUtil; import com.eoi.jax.web.dao.entity.TbCluster; import com.eoi.jax.web.dao.entity.TbOptsFlink; import com.eoi.jax.web.dao.entity.TbOptsSpark; @@ -239,7 +240,7 @@ public Cluster fromDb(TbCluster clusterEntity, TbOptsFlink flinkEntity, TbOptsSp setClusterName(clusterEntity.getClusterName()); setClusterType(clusterEntity.getClusterType()); setHadoopHome(ClusterVariable.replaceVariable(clusterEntity.getHadoopHome())); - setHadoopConfig(ClusterVariable.genHadoopConf(getHadoopHome())); + setHadoopConfig(HadoopUtil.getConfDirFromHadoopHome(getHadoopHome())); setYarnBin(ClusterVariable.genYarnBin(getHadoopHome())); setHdfsServer(clusterEntity.getHdfsServer()); setFlinkServer(clusterEntity.getFlinkServer()); diff --git a/jax-web/src/main/java/com/eoi/jax/web/provider/cluster/ClusterProvider.java b/jax-web/src/main/java/com/eoi/jax/web/provider/cluster/ClusterProvider.java index b6f0cb6..cf46c2a 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/provider/cluster/ClusterProvider.java +++ b/jax-web/src/main/java/com/eoi/jax/web/provider/cluster/ClusterProvider.java @@ -109,10 +109,12 @@ public ClusterReq fillUpdateClusterReq(ClusterReq req) { private ClusterReq fillHadoopMetaInfo(ClusterReq req) { if (ClusterType.YARN.isEqual(req.getClusterType()) && StrUtil.isNotEmpty(req.getHadoopHome())) { - Configuration hadoopConf = HadoopUtil.getHadoopConf(req.getHadoopHome()); + Configuration hadoopConf = HadoopUtil.getConfFromHadoopHome(req.getHadoopHome()); if (null != hadoopConf) { req.setHdfsServer(hadoopConf.get(HadoopUtil.HDFS_DEFAULT_NAME_KEY)); req.setYarnWebUrl(HadoopUtil.getYarnWebUrl(hadoopConf)); + } else { + throw new IllegalArgumentException("Cannot find HADOOP_CONF_DIR from HADOOP_HOME=" + req.getHadoopHome()); } } return req; diff --git a/jax-web/src/test/java/com/eoi/jax/web/common/util/TestHadoopUtil.java b/jax-web/src/test/java/com/eoi/jax/web/common/util/TestHadoopUtil.java index af83ce7..caa4a50 100644 --- a/jax-web/src/test/java/com/eoi/jax/web/common/util/TestHadoopUtil.java +++ b/jax-web/src/test/java/com/eoi/jax/web/common/util/TestHadoopUtil.java @@ -15,6 +15,8 @@ package com.eoi.jax.web.common.util; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.CommonConfigurationKeysPublic; +import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.junit.Test; public class TestHadoopUtil { @@ -22,8 +24,16 @@ public class TestHadoopUtil { @Test public void testGetConfDir() { String hadoopHome = "D:\\app-bigdata\\hadoop\\hadoop-2.7.7"; - Configuration conf = HadoopUtil.getHadoopConf(hadoopHome); + Configuration conf = HadoopUtil.getConfFromHadoopHome(hadoopHome); + String hdfs = conf.get(CommonConfigurationKeysPublic.FS_DEFAULT_NAME_KEY); + String yarnUrl = conf.get(YarnConfiguration.RM_WEBAPP_HTTPS_ADDRESS); System.out.println(conf); + + String confDir = "D:\\app-bigdata\\hadoop\\hadoop-2.7.2\\etc\\hadoop"; + String hdfsServer = HadoopUtil.readHdfsServer(confDir); + String yarnWebUrl = HadoopUtil.readYarnWebUrl(confDir); + System.out.println(hdfsServer); + } } From 7c62b5674746e5f48c1dfb52d5c7a74362888ab1 Mon Sep 17 00:00:00 2001 From: allenhe888 <363857596@qq.com> Date: Mon, 6 Jun 2022 16:54:11 +0800 Subject: [PATCH 20/25] modify HadoopUtils to support read $HADOOP_CONF_DIR from etc or etc/hadoop --- .../web/model/cluster/bean/CommClusterBean.java | 15 +-------------- .../web/model/cluster/bean/YarnClusterBean.java | 1 - 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java index daf9d52..8f80351 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/CommClusterBean.java @@ -18,18 +18,12 @@ public class CommClusterBean { - @ConfigDef(label = "提交超时", + @ConfigDef(label = "提交超时(毫秒)", displayPosition = 4, type = ConfigDef.Type.LONG, description = "单位毫秒") private Long timeoutMs; - @ConfigDef(label = "单位", - displayPosition = 5, - type = ConfigDef.Type.STRING, - description = "信息补充, unit: ms") - private String unit; - public Long getTimeoutMs() { return timeoutMs; } @@ -38,12 +32,5 @@ public void setTimeoutMs(Long timeoutMs) { this.timeoutMs = timeoutMs; } - public String getUnit() { - return unit; - } - - public void setUnit(String unit) { - this.unit = unit; - } } diff --git a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/YarnClusterBean.java b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/YarnClusterBean.java index af45d08..821d942 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/YarnClusterBean.java +++ b/jax-web/src/main/java/com/eoi/jax/web/model/cluster/bean/YarnClusterBean.java @@ -22,7 +22,6 @@ public class YarnClusterBean extends CommClusterBean { @ConfigDef(label = "HADOOP_HOME", description = "配置JAX所在服务器的路径,可用${JAX_HOME}引用相对位置", - required = false, displayPosition = 11) private String hadoopHome; From 833c05759dd31eec96f0eca88b94e8dcbd91bb61 Mon Sep 17 00:00:00 2001 From: allenhe888 <363857596@qq.com> Date: Tue, 7 Jun 2022 11:04:07 +0800 Subject: [PATCH 21/25] =?UTF-8?q?Page=20Query=20for=202=20apis:=20Job,Jar,?= =?UTF-8?q?=20Jar=E5=92=8CJob=E7=9A=84=E5=88=86=E9=A1=B5=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/eoi/jax/web/controller/JarController.java | 13 ++++++++++++- .../com/eoi/jax/web/controller/JobController.java | 7 +++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/jax-web/src/main/java/com/eoi/jax/web/controller/JarController.java b/jax-web/src/main/java/com/eoi/jax/web/controller/JarController.java index c51f776..e45ec01 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/controller/JarController.java +++ b/jax-web/src/main/java/com/eoi/jax/web/controller/JarController.java @@ -21,6 +21,7 @@ import com.eoi.jax.web.model.jar.JarReq; import com.eoi.jax.web.model.jar.JarResp; import com.eoi.jax.web.service.JarService; +import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -33,7 +34,6 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; - import java.io.IOException; import java.util.List; @@ -43,22 +43,26 @@ public class JarController extends V1Controller { @Autowired private JarService jarService; + @ApiOperation("获取jar列表") @GetMapping("jar") public ResponseResult> list() { return new ResponseResult>().setEntity(jarService.listJar()); } + @ApiOperation("获取jar列表") @PostMapping("jar/list/query") public ResponseResult> query(@RequestBody JarQueryReq req) { Paged paged = jarService.queryJar(req); return new ResponseResult>().setEntity(paged.getList()).setTotal(paged.getTotal()); } + @ApiOperation("获取jar详情") @GetMapping("jar/{jarName}") public ResponseResult get(@PathVariable("jarName") String jarName) { return new ResponseResult().setEntity(jarService.getJar(jarName)); } + @ApiOperation("新建jar") @PostMapping("jar/{jarName}") public ResponseResult uploadCreate( @RequestParam("file") MultipartFile file, @@ -80,6 +84,7 @@ public ResponseResult uploadCreate( return new ResponseResult().setEntity(jarService.createJar(file, req)); } + @ApiOperation("新建jar") @PostMapping("jar-build-in/{jarName}") public ResponseResult uploadBuildInCreate( @RequestParam(value = "jarBuildFile") String jarBuildFile, @@ -121,6 +126,7 @@ public ResponseResult uploadUpdate( return new ResponseResult().setEntity(jarService.updateJar(file, req)); } + @ApiOperation("更新jar") @PutMapping("jar-build-in/{jarName}") public ResponseResult uploadBuildInUpdate( @RequestParam(value = "jarBuildFile") String jarBuildFile, @@ -142,11 +148,13 @@ public ResponseResult uploadBuildInUpdate( return new ResponseResult().setEntity(jarService.updateJar(jarBuildFile, req)); } + @ApiOperation("删除jar") @DeleteMapping("jar/{jarName}") public ResponseResult delete(@PathVariable("jarName") String jarName) { return new ResponseResult().setEntity(jarService.deleteJar(jarName)); } + @ApiOperation("archive jar") @GetMapping("jar-archive") public void archive(@RequestParam(value = "jars", required = true) String jars, @RequestParam(value = "filename", required = false) String filename, @@ -160,8 +168,11 @@ public void archive(@RequestParam(value = "jars", required = true) String jars, jarService.archive(jars, response.getOutputStream()); } + @ApiOperation("build-in jar") @GetMapping("jar-build-in") public ResponseResult> buildIns() { return new ResponseResult>().setEntity(jarService.listBuildIns()); } + + } diff --git a/jax-web/src/main/java/com/eoi/jax/web/controller/JobController.java b/jax-web/src/main/java/com/eoi/jax/web/controller/JobController.java index 4394bed..1d4205e 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/controller/JobController.java +++ b/jax-web/src/main/java/com/eoi/jax/web/controller/JobController.java @@ -22,6 +22,7 @@ import com.eoi.jax.web.model.job.JobResp; import com.eoi.jax.web.model.pipeline.PipelineResp; import com.eoi.jax.web.service.JobService; +import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -42,27 +43,32 @@ public class JobController extends V1Controller { @Autowired private TbJobService tbJobService; + @ApiOperation("获取job列表") @GetMapping("job") public ResponseResult> list() { return new ResponseResult>().setEntity(jobService.listJob()); } + @ApiOperation("获取job列表") @PostMapping("job/list/query") public ResponseResult> query(@RequestBody JobQueryReq req) { Paged paged = jobService.queryJob(req); return new ResponseResult>().setEntity(paged.getList()).setTotal(paged.getTotal()); } + @ApiOperation("获取job详情") @GetMapping("job/{jobName}") public ResponseResult get(@PathVariable("jobName") String jobName) { return new ResponseResult().setEntity(jobService.getJob(jobName)); } + @ApiOperation("获取job的pipeline") @GetMapping("job/{jobName}/pipeline") public ResponseResult> pipeline(@PathVariable("jobName") String jobName) { return new ResponseResult>().setEntity(jobService.listJobPipeline(jobName)); } + @ApiOperation("获取job的document") @GetMapping("job/{jobName}/document") public ResponseEntity document(@PathVariable("jobName") String jobName) { TbJob entity = tbJobService.getById(jobName); @@ -74,6 +80,7 @@ public ResponseEntity document(@PathVariable("jobName") String jobName) .body(entity.getDoc()); } + @ApiOperation("获取job的icon") @GetMapping("job/{jobName}/icon.svg") public ResponseEntity icon(@PathVariable("jobName") String jobName) { TbJob entity = tbJobService.getById(jobName); From 5c0b0dff6aff464b16c016d6b9d7f0f86fdd3017 Mon Sep 17 00:00:00 2001 From: allenhe888 <363857596@qq.com> Date: Fri, 1 Jul 2022 16:34:09 +0800 Subject: [PATCH 22/25] =?UTF-8?q?Page=20Query=20for=202=20apis:=20Job,Jar,?= =?UTF-8?q?=20Jar=E5=92=8CJob=E7=9A=84=E5=88=86=E9=A1=B5=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/eoi/jax/web/common/util/Common.java | 11 +++++----- .../eoi/jax/web/common/util/HadoopUtil.java | 4 +++- .../web/controller/PipelineController.java | 21 ++++++++++++++++++- .../web/provider/manager/JarUrlProvider.java | 12 +++++++---- 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/jax-web/src/main/java/com/eoi/jax/web/common/util/Common.java b/jax-web/src/main/java/com/eoi/jax/web/common/util/Common.java index 29564d2..f97805b 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/common/util/Common.java +++ b/jax-web/src/main/java/com/eoi/jax/web/common/util/Common.java @@ -118,11 +118,12 @@ public static byte[] readClassPathResource(String path, ClassLoader loader) { return resource.readBytes(); } - public static String replaceJaxHomeAsPath(String var) { - var = StrUtil.replace(var, - VAR_JAX_HOME, - ConfigLoader.load().jax.getHome()); - return Paths.get(var).toString(); + public static String replaceJaxHomeAsPath(String oldPath) { + if(oldPath.contains(VAR_JAX_HOME)){ + String replacedPath = StrUtil.replace(oldPath, VAR_JAX_HOME, ConfigLoader.load().jax.getHome()); + return Paths.get(replacedPath).toString(); + } + return oldPath; } } diff --git a/jax-web/src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java b/jax-web/src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java index fa9eafc..18e22c7 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java +++ b/jax-web/src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java @@ -254,10 +254,12 @@ public static String getConfDirFromHadoopHome(String hadoopHome) { } for (String possibleHadoopConfPath :possiblePaths) { - if (Files.exists(Paths.get(possibleHadoopConfPath)) && Files.exists(Paths.get(possibleHadoopConfPath,"core-site.xml"))) { confDir = possibleHadoopConfPath; + if (null != confDir){ + return confDir; + } } } } catch (RuntimeException e) { diff --git a/jax-web/src/main/java/com/eoi/jax/web/controller/PipelineController.java b/jax-web/src/main/java/com/eoi/jax/web/controller/PipelineController.java index f19fbf0..c186ba2 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/controller/PipelineController.java +++ b/jax-web/src/main/java/com/eoi/jax/web/controller/PipelineController.java @@ -27,6 +27,7 @@ import com.eoi.jax.web.model.pipeline.PipelineReq; import com.eoi.jax.web.model.pipeline.PipelineResp; import com.eoi.jax.web.service.PipelineService; +import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -40,7 +41,6 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; - import java.io.IOException; import java.util.List; @@ -56,6 +56,7 @@ public class PipelineController extends V1Controller { * @param status 状态:运行中(RUNNING)、已完成(FINISHED)、运行失败(FAILED) * @param inStatus 内部状态:运行中(RUNNING)、已完成(FINISHED)、运行失败(FAILED) */ + @ApiOperation("获取pipeline列表") @GetMapping("pipeline") public ResponseResult> list( @RequestParam(value = "search", required = false) String search, @@ -70,17 +71,20 @@ public ResponseResult> list( return new ResponseResult>().setEntity(page.getList()).setTotal(page.getTotal()); } + @ApiOperation("分页查询pipeline") @PostMapping("pipeline/list/query") public ResponseResult> queryPipeline(@RequestBody PipelineQueryReq req) { Paged page = pipelineService.queryPipeline(req); return new ResponseResult>().setEntity(page.getList()).setTotal(page.getTotal()); } + @ApiOperation("获取pipeline详情") @GetMapping("pipeline/{pipelineName}") public ResponseResult get(@PathVariable("pipelineName") String pipelineName) { return new ResponseResult().setEntity(pipelineService.getPipeline(pipelineName)); } + @ApiOperation("新建pipeline草稿") @PostMapping("pipeline/{pipelineName}/draft") public ResponseResult createDraft( @PathVariable("pipelineName") String pipelineName, @@ -89,6 +93,7 @@ public ResponseResult createDraft( return new ResponseResult().setEntity(pipelineService.createDraft(req)); } + @ApiOperation("修改pipeline草稿") @PutMapping("pipeline/{pipelineName}/draft") public ResponseResult updateDraft( @PathVariable("pipelineName") String pipelineName, @@ -97,6 +102,7 @@ public ResponseResult updateDraft( return new ResponseResult().setEntity(pipelineService.updateDraft(req)); } + @ApiOperation("暂存pipeline") @PostMapping("pipeline/{pipelineName}/stage") public ResponseResult createStage( @PathVariable("pipelineName") String pipelineName, @@ -105,6 +111,7 @@ public ResponseResult createStage( return new ResponseResult().setEntity(pipelineService.createStage(req)); } + @ApiOperation("暂存pipeline") @PutMapping("pipeline/{pipelineName}/stage") public ResponseResult updateStage( @PathVariable("pipelineName") String pipelineName, @@ -114,6 +121,7 @@ public ResponseResult updateStage( return new ResponseResult().setEntity(pipelineService.updateStage(req, Boolean.TRUE.equals(autoCreate))); } + @ApiOperation("新建pipeline并启动") @PostMapping("pipeline/{pipelineName}") public ResponseResult create( @PathVariable("pipelineName") String pipelineName, @@ -122,6 +130,7 @@ public ResponseResult create( return new ResponseResult().setEntity(pipelineService.createPipeline(req)); } + @ApiOperation("修改pipeline并启动") @PutMapping("pipeline/{pipelineName}") public ResponseResult update( @PathVariable("pipelineName") String pipelineName, @@ -134,6 +143,7 @@ public ResponseResult update( ); } + @ApiOperation("启动pipeline") @PutMapping("pipeline/{pipelineName}/start") public ResponseResult start( @PathVariable("pipelineName") String pipelineName, @@ -144,6 +154,7 @@ public ResponseResult start( ); } + @ApiOperation("停止pipeline") @PutMapping("pipeline/{pipelineName}/stop") public ResponseResult stop( @PathVariable("pipelineName") String pipelineName, @@ -156,6 +167,7 @@ public ResponseResult stop( ); } + @ApiOperation("删除pipeline") @DeleteMapping("pipeline/{pipelineName}") public ResponseResult delete( @PathVariable("pipelineName") String pipelineName, @@ -166,11 +178,13 @@ public ResponseResult delete( ); } + @ApiOperation("pipeline日志") @GetMapping("pipeline/{pipelineName}/log") public ResponseResult> log(@PathVariable("pipelineName") String pipelineName) { return new ResponseResult>().setEntity(pipelineService.logPipeline(pipelineName)); } + @ApiOperation("pipeline控制台") @GetMapping("pipeline/{pipelineName}/console") public ResponseResult> listConsole(@PathVariable("pipelineName") String pipelineName, @RequestParam(value = "pageIndex", required = false, defaultValue = "0") Integer pageIndex, @@ -180,11 +194,13 @@ public ResponseResult> listConsole(@PathVariable("pipeli return new ResponseResult>().setEntity(page.getRecords()).setTotal(page.getTotal()); } + @ApiOperation("pipeline控制台删除") @DeleteMapping("pipeline/{pipelineName}/console") public ResponseResult deleteConsole(@PathVariable("pipelineName") String pipelineName) { return new ResponseResult().setEntity(pipelineService.deletePipelineConsole(pipelineName)); } + @ApiOperation("批量导出pipeline") @PostMapping("pipeline-export") public void export(@ModelAttribute PipelineExportFormReq req, final HttpServletResponse response) throws IOException { response.reset(); @@ -194,16 +210,19 @@ public void export(@ModelAttribute PipelineExportFormReq req, final HttpServletR pipelineService.exportPipeline(request, response.getOutputStream()); } + @ApiOperation("批量导入pipeline") @PostMapping("pipeline-import") public ResponseResult>> importPipeline(@RequestParam("file") MultipartFile file) { return new ResponseResult>>().setEntity(pipelineService.importPipeline(file)); } + @ApiOperation("批量导入pipeline-内置") @PostMapping("pipeline-import/build-in") public ResponseResult>> importBuildInPipeline(@RequestBody PipelineBuildIn req) { return new ResponseResult>>().setEntity(pipelineService.importPipeline(req)); } + @ApiOperation("build-in jar") @GetMapping("pipeline-import/build-in") public ResponseResult buildIns() { return new ResponseResult().setEntity(pipelineService.listBuildIns()); diff --git a/jax-web/src/main/java/com/eoi/jax/web/provider/manager/JarUrlProvider.java b/jax-web/src/main/java/com/eoi/jax/web/provider/manager/JarUrlProvider.java index 370f180..a972b33 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/provider/manager/JarUrlProvider.java +++ b/jax-web/src/main/java/com/eoi/jax/web/provider/manager/JarUrlProvider.java @@ -15,7 +15,6 @@ package com.eoi.jax.web.provider.manager; import cn.hutool.core.io.FileUtil; -import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.URLUtil; import com.eoi.jax.common.PythonHelper; import com.eoi.jax.web.common.config.AppConfig; @@ -30,6 +29,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Arrays; import java.util.List; import java.util.Set; @@ -93,7 +94,8 @@ public List genPythonLibUrl(Cluster cluster) { } public FileUrl genWorkUrl(String filePath) { - return genFileUrl(ConfigLoader.load().jax.getWork(), filePath, AppConfig.JAX_JOB_WORK_DIR); + String workDir = Common.pathsJoin(ConfigLoader.load().jax.getWork()); + return genFileUrl(workDir, filePath, AppConfig.JAX_JOB_WORK_DIR); } public FileUrl genJarLibUrl(String filePath) { @@ -109,13 +111,15 @@ public FileUrl genPyDirUrl(String filePath) { } private FileUrl genFileUrl(String dirPath, String filePath, String httpBase) { + Path dir = Paths.get(dirPath); + Path file = Paths.get(filePath); if (!FileUtil.exist(filePath)) { throw new JaxException("the file " + filePath + " is not exist"); } - if (!StrUtil.startWith(filePath, dirPath)) { + if (!file.startsWith(dir)) { throw new JaxException("the file " + filePath + " is not in dictionary " + dirPath); } - String relativePath = StrUtil.unWrap(StrUtil.removePrefix(filePath, dirPath), '/'); + String relativePath = dir.relativize(file).toString(); String url = Common.urlPathsJoin(getListeningHttp(), httpBase, relativePath); String name = FileUtil.getName(filePath); return new FileUrl().setName(name).setUrl(url).setPath(filePath); From 4a67782a5454a15d74efed0a85f98526f762c8e0 Mon Sep 17 00:00:00 2001 From: allenhe888 <363857596@qq.com> Date: Fri, 1 Jul 2022 16:44:04 +0800 Subject: [PATCH 23/25] modify for checkstyle --- jax-web/src/main/java/com/eoi/jax/web/common/util/Common.java | 2 +- .../src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java | 2 +- .../src/main/java/com/eoi/jax/web/controller/JarController.java | 1 + .../java/com/eoi/jax/web/controller/PipelineController.java | 1 + 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/jax-web/src/main/java/com/eoi/jax/web/common/util/Common.java b/jax-web/src/main/java/com/eoi/jax/web/common/util/Common.java index f97805b..6f7e85c 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/common/util/Common.java +++ b/jax-web/src/main/java/com/eoi/jax/web/common/util/Common.java @@ -119,7 +119,7 @@ public static byte[] readClassPathResource(String path, ClassLoader loader) { } public static String replaceJaxHomeAsPath(String oldPath) { - if(oldPath.contains(VAR_JAX_HOME)){ + if (oldPath.contains(VAR_JAX_HOME)) { String replacedPath = StrUtil.replace(oldPath, VAR_JAX_HOME, ConfigLoader.load().jax.getHome()); return Paths.get(replacedPath).toString(); } diff --git a/jax-web/src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java b/jax-web/src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java index 18e22c7..1dd8b6b 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java +++ b/jax-web/src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java @@ -257,7 +257,7 @@ public static String getConfDirFromHadoopHome(String hadoopHome) { if (Files.exists(Paths.get(possibleHadoopConfPath)) && Files.exists(Paths.get(possibleHadoopConfPath,"core-site.xml"))) { confDir = possibleHadoopConfPath; - if (null != confDir){ + if (null != confDir) { return confDir; } } diff --git a/jax-web/src/main/java/com/eoi/jax/web/controller/JarController.java b/jax-web/src/main/java/com/eoi/jax/web/controller/JarController.java index e45ec01..5fd22e6 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/controller/JarController.java +++ b/jax-web/src/main/java/com/eoi/jax/web/controller/JarController.java @@ -34,6 +34,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; + import java.io.IOException; import java.util.List; diff --git a/jax-web/src/main/java/com/eoi/jax/web/controller/PipelineController.java b/jax-web/src/main/java/com/eoi/jax/web/controller/PipelineController.java index c186ba2..ea488f0 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/controller/PipelineController.java +++ b/jax-web/src/main/java/com/eoi/jax/web/controller/PipelineController.java @@ -41,6 +41,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; + import java.io.IOException; import java.util.List; From 8fd97ed2010c3d52be3bad1748f3b9ec11a999c5 Mon Sep 17 00:00:00 2001 From: allenhe888 <363857596@qq.com> Date: Fri, 1 Jul 2022 19:30:12 +0800 Subject: [PATCH 24/25] fix bug about $Hadoop_Confi parser and add log-file out when debug running --- jax-web/release/debug/debug.sh | 3 ++- .../com/eoi/jax/web/common/util/HadoopUtil.java | 15 ++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/jax-web/release/debug/debug.sh b/jax-web/release/debug/debug.sh index 15b8ded..b7943f0 100755 --- a/jax-web/release/debug/debug.sh +++ b/jax-web/release/debug/debug.sh @@ -32,6 +32,7 @@ LoggingConfig4Log4j="file:${DIR}/flink-debug-docker.properties" DEBUG_JAVA_OPTS="-Xmx1024m -Xms1024m ${DEBUG_JAVA_OPTS}" -exec "$JAVA" ${DEBUG_JAVA_OPTS} -Dlogback.configurationFile="${LoggingConfig}" -Dlog4j.configuration="${LoggingConfig4Log4j}" "$@" +# exec "$JAVA" ${DEBUG_JAVA_OPTS} -Dlogback.configurationFile="${LoggingConfig}" -Dlog4j.configuration="${LoggingConfig4Log4j}" "$@" > debug_out.log 2>&1 +$JAVA ${DEBUG_JAVA_OPTS} -Dlogback.configurationFile="${LoggingConfig}" -Dlog4j.configuration="${LoggingConfig4Log4j}" "$@" 2>&1 |tee -a $DIR/out_debug.log diff --git a/jax-web/src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java b/jax-web/src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java index 1dd8b6b..5a8249e 100644 --- a/jax-web/src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java +++ b/jax-web/src/main/java/com/eoi/jax/web/common/util/HadoopUtil.java @@ -241,14 +241,15 @@ public static Configuration getConfFromHadoopHome(String hadoopHome) { } public static String getConfDirFromHadoopHome(String hadoopHome) { - String[] possiblePaths = new String[4]; String confDir = null; + if (null == hadoopHome || hadoopHome.isEmpty()) { + return confDir; + } + String[] possiblePaths = new String[4]; try { - if (hadoopHome != null) { - possiblePaths[0] = Paths.get(hadoopHome, AppConfig.HADOOP_ETC_RELATIVE).toString(); // eoitek hadoop - possiblePaths[1] = Paths.get(hadoopHome,AppConfig.HADOOP_ETC_HADOOP_RELATIVE).toString(); // apache hadoop - possiblePaths[2] = Paths.get(hadoopHome,AppConfig.HADOOP_CONF).toString(); // old hadoop version - } + possiblePaths[0] = Paths.get(hadoopHome, AppConfig.HADOOP_ETC_RELATIVE).toString(); // eoitek hadoop + possiblePaths[1] = Paths.get(hadoopHome,AppConfig.HADOOP_ETC_HADOOP_RELATIVE).toString(); // apache hadoop + possiblePaths[2] = Paths.get(hadoopHome,AppConfig.HADOOP_CONF).toString(); // old hadoop version if (null != System.getenv(AppConfig.HADOOP_CONF_DIR)) { possiblePaths[3] = Paths.get(System.getenv(AppConfig.HADOOP_CONF_DIR)).toString(); // from env } @@ -263,7 +264,7 @@ public static String getConfDirFromHadoopHome(String hadoopHome) { } } } catch (RuntimeException e) { - logger.warn("Failed to parse HADOOP_CONF_DIR,cause: " + e.getMessage(),e); + logger.warn("Catch Failure: parse HADOOP_CONF_DIR by hadoopHome=" + hadoopHome + ",cause: " + e.getMessage(),e); } return confDir; } From e27cb82ae6b8027bf200d61b32d072f46af21867 Mon Sep 17 00:00:00 2001 From: allenhe888 <363857596@qq.com> Date: Fri, 1 Jul 2022 19:32:06 +0800 Subject: [PATCH 25/25] fix bug about $Hadoop_Confi parser and add log-file out when debug running --- jax-web/release/debug/debug.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jax-web/release/debug/debug.sh b/jax-web/release/debug/debug.sh index b7943f0..e370c7f 100755 --- a/jax-web/release/debug/debug.sh +++ b/jax-web/release/debug/debug.sh @@ -34,5 +34,5 @@ DEBUG_JAVA_OPTS="-Xmx1024m -Xms1024m ${DEBUG_JAVA_OPTS}" # exec "$JAVA" ${DEBUG_JAVA_OPTS} -Dlogback.configurationFile="${LoggingConfig}" -Dlog4j.configuration="${LoggingConfig4Log4j}" "$@" > debug_out.log 2>&1 -$JAVA ${DEBUG_JAVA_OPTS} -Dlogback.configurationFile="${LoggingConfig}" -Dlog4j.configuration="${LoggingConfig4Log4j}" "$@" 2>&1 |tee -a $DIR/out_debug.log +$JAVA ${DEBUG_JAVA_OPTS} -Dlogback.configurationFile="${LoggingConfig}" -Dlog4j.configuration="${LoggingConfig4Log4j}" "$@" 2>&1 |tee $DIR/out_debug.log

    WB$;)8goCj#pp*vn8kKsc^Lnw(T{>w)or9u|G=`4@<_oo z!`Z2dwEy{t`RP7(EVfK{w2<0N(A8mxM0=0Rty6O&*J#Qm=U0k|`*G_p(|z&6Ks3HG z`dAL?ySs|V!#+`#4mnwBDG~$vZpW9?-QkRDOhu6?a3US}RyOGc1kH<5>(|;ysdIax zcNZ@pm0DsNb|F(P&q2?&WiPt((dyh-O|#HulNaUr{>~Y@RU*AYMa6-S3WxK|twO1R z*cPUz2A8{qhb<asd*2z>WVVH?DAEKhAPUlKfOHiQkR}$CDjh7W!52%!ZDO^J$tNC_oUMWlo-B=mCkhjXUr%y`a^dw<>Y_?!pEndJNS zT6^ua*Lv6cg8Y@wRdyxsOvajq?35MIehOm{n*!8Z4tKpMU-F7Vgmj6QUkj-Z&fbBD zG8w$=Y^%GwyT|Ss-{V@ zhbUN3`K8u|{sZYo@3qUE!&EjKFMXSB{Q7HhrOr~uSp7Wwj8YbL^fy1CktT%GPdXEI z#b5iGxMxfm6-HOVUGvf3yky~&f~ez}n-%u@mR)+uRyrp=i-ZwDa=qkAUr!46WPDZ) zE7R21hV{vW7mh3=s=|ASC-v@o{B-ikZ|A<%7N46J$CXA13>$~51_<|g-j`cDfQH>S z(O)(6&HKo0`BHR1qiSQdzto2rhKrjpuQn}21~nesC$5|IK=B?GstA&&al2O!l@uEn z(Ziam%DNw(hy!>h#|kpdlsb zA}|(CHAROIHtl{wrY-THo$mZt1M(%wUJMSu1IFATcYQQza|aj#as0$f!>x5T4{|Vb zw#~2E`irmng4f-2mD2MdW{a$WfObL*>W%h{!P~4(Dj4d%`ruJ&$8H$`+gJ$!%(F!H z@u{vwc2;|DB0Tis4r@3}?!nW+@iRiE_R)6~A?9_cmN>=!RK#8Z;$`du1aVL?utob1{E$)RT5!y8Dg^e0h7rJIa$$W8Rc8iKaOo=bng_4+C--Ndb#^{ZKupoiX-H!pB%geq z=`SX~Sl(=1GKT6vy)cqWbH|%YrKrZY7k5q+)Hs-L%*CnWGi;y7xXYC;yd~h|xfZ%4 zKrO(%sX6%B`7NI@gM3DA>GOH->1FHVsk3QH9Uk2|iEg(nRB7Ds>SaXMdadBn9a5O4 zDBcE#mmBO|`}Ms;FX(C-D^!!`YNZv{d*?kqmeqi`=c=2I?xhaC!NSz0d~E!PN!QVQ zYLzwdrB|ImSY_(GK(*NnC@%4Jw?}K+>(uzIBOukl8v{$1Hd4IWINDmm-=e&=y{WNo z{h4GBpGM&_A~anO4-gK{XEBihoqr^#BWb3F3(#h8y>2glj52L|c$j+n%ms^sbJ~u2 zxWZ>#B`odQqP8nZ{^V!e<;a^vwe^p=@O{NuVwgxxU!y4{@WFiGmO&e#GbVUBuhv~JyXRXB z%_TO`lH-yu2j5tII$!3al&bKFr-!FoGB@g#e(Y|_k6y;}dB;_=^Yii;)`g->noYOn z6G?3oA&u9E^A-wM43n|(=&nlCHl6<3&{8tjE^OPxTkK#&m*`Q<@Wop*x&h1caX?Bh zEc&a}n!q6OHREB!_}zzE*F^2}INkeTispyMxNFExB7LiQXIH}afP-!C3&j4dgRP7X z9BicsqYW}d7q%uZF(Y3V2m)#3(e2*H?i* zKfdTh@O?K9?Fhs1cr`quLurS8EB>0(%`jmszmWHr zdwgoI%K)v`$EsCo)KyJ6TRT{hZu3U~+r%-vClwoLp$%1Y40Mv>NY4XFXB<{G!q z<4}>$aYTH9rv=Zffbi`1%9b4<13IzN#XcJB*Jrbz01ATBle9U?u}I$O~cgGX+%(2^04wExA{pOx(-E@LX0>X4NoqN5hWhdJ5N+ zOTcrFt|3Oe?RoPsarwCMu)dbCc#be39t^8eIz42{zm$}cZZq?HF*Qx3JYq&Jn_*dQ zzsS$0G(DY=gdL2(GSet^ucL0fT^RWzFoadtLqNAq(fL9ts$!d^5;v<;otM; zNJVhjK7FIovAAEz+7K;avA$~XiSGon37;I|t^8APFez-{d$8*x5|YE@g04usF2s@pm2l=q@+ElE~QI1x5kE@@Y$M8^P858de0T3P#N0Wo|j%3 z%!m3T^}E;Jn<)wOVYD5Mdl1DB8AibssU?P~A}1NU45VuD5NCduL#rVe4$DW#ta}wvaX9DZ@a%P7sugZ?41xAJDEx5^*ZPg85XFm&X znD(6p#S_dHakSiGZ;=A#885#%igdh-kWlMQpDmD^V+p z7ppM6c7`sfa6ZX=POSf#URaDa>u7#;r-;K^ajsn1oKwZ~@vpjJBgL$YtC9tGKS)r# zc(g09Cuiil(B)YdEChvX&;6K4)85+7twleoH@X9ca%x>H$rO9c<<`C~O#QSC+_0>w zpqqc)cu60|EV*&4I`0H^Lv5V@Z1aFJV;4iCu~gEcH5DuhKJFH<%Kap6w{Xjo)wAL9 zH&y1|IH*rk4AZ^oY>B(weV=S-=XfVmU+!t8+KH7helm4*tAM>L0Nh=;d=bw3?!Fg4 zb{$#D={@<*^b{tu*|-W}O0IE?U-6PzWWaX@m6q^~!E;RlgiXozXJ2-nU_4r&7>2q^ z@4a4c>e3icZkd+20sbzTNm7-71josO`BgEk2%Vd&bkHiB~>TwzR11Mmf5UUdp6W+`1MA#YcrT0g($dpjwtt>Aph?&lPfjy+KF$==e-* z>X~!T9d?JL3sDbA_B!D|aE+9p<@u=TB@RCgxrk_VGaAZY$nU6e&mEb9=i;s-;BmPL zW}=Vh$ruXZg=mjajJZ%A>}tR(eSxbbTUq6w0z#T6{nG6y1#g9dSNaFL=Uxj}O$^5^ zFKqNV@-3uvoXC~$y>zQt3of)tuWWpB6;)+l;aBCv4L4e)g+hV;bIo!Bl(4eUUZBHNGk(f$$bD$r6Y~Lp41rbQM za>cZVMf*U!Rwz`r&wNuNbpTZN@CMiLDR7TL6{qhXKIy4GPCfNlN5jsUh%-ZhP=N%@ zz#_XB!pzs68d(TVmS0^p*i)}bp-{58idfEYfJ#__N5Ct$#d+iBzUyO`6;4s+vYg_< z9s!4l0&7SR!rlVH%(~XiMW?R4L6({LkFBvB&~3JwA8q!8zc9402OPg;N5c(eOVUEJ zbTQ(SO&V26B-an@`*iE_nvHqoxh?D)y@HgFBrrm$MRV^5%0tgjbh!mU@P*CvT9!`hyHMHg2d&hq{52h~hi+#p2zA zF8a|D!W%l_l=C7&87;$5Ub-CdT=g(d0BHP)JMGy@Zu(5pgah&u66kxZ#uDHSQoYZ+ z7X}+9SzJ*xippL+DIt%H5Pg()KzCS$I=vU)@?F3D&;AS~p2i|l@gc;7FHa}QBl zv0+nWf8S_m3_H~(c) zZjeg{iuh!}cM=F-Km;jTvsT3LEao%@qVi?C&Mt>4f%^5NKFP!yz!eeQpK0!f-&nS6 z87**%M7gevNY#AGtGa=%*+5CP!()A4*4AvUJF3z^T@SzlZwZxBaxM!~zcfy4do4a- zRt+B7v6$<{T4W^qf|jy07F>pg2+bLHLO3OW{MLHvI?xz*@L21P^FueV61AVJDuhij z?$STwBQISfvHgY4$;D!G{nFin)o@p&8$Rbsg+zLuo1;l+{>CG9q|f>6Cu$N4Gx9Yh z!iYBspFTJ17=UZFUF9Y|;mh_yi_#kxsbEcKpZpjpwgo7@qIrDh#rfM;8_D!|BT`Xk z81iUuil|L#7&sSLYPGAFtprL~1+($SBuh0%*{uU%LuboD4sEry)xDSY%920th!*7< zIiVRGfywdg9UhUT9Q)+ulIwMk(Tqa*YEF>8_l_qwSH6eIc%1{*t(*Fxi^$Ni$?1DP z?$rT>bD0PHBRjWkJ9qoa1tneDB~fWSuj*B!2+7~lW{iGX`zw8yrkkaKox1|o4ul}J zk)d2gkK`8Dw7nO~V*~QXuNFsZbie6eTBNU-5w*WV>t|Xe_%gAl2TITBm;ON5ugy`u7|U8>d-Uz1QEZ3 z@<{YV`g5WmxA&xY*Q)l*DmSCmPVwj2{M6p})d3G_82}4bT-;A>4=J>QvXV)dHKfqR zAmzI;pX$k5?6zZI{+f5-8Pe2EvnmULm+nBg_eqG%19cgH>f(i7S54X3SEX{C%jw$y ziPi;>V@@UHzvxdAshB(kiPjAudZ88VrvbDChCiCRBk2$VC0m`+NVt7^8CiNXUi1Jc zW|!C_ipklMq~oePVE~=&EvwdoF#biJKgH{8eQ(_Cihp43KdfXu_YC`)z?#B z5bIgmarxh_$=Xx$>#Hx=G`onBlpP_RS zjcbM2#d|8f=6juZHW(f{$wGpFP=dgmo50BYH1Q4Y(=?ylm1GGypkWSa#t@n``?R1| ziR`Wz3AcvJ@^g=BUoIlXIhB!`Aa6GSIImt%Kf-3B*v&DUQzxzR_DCA_O4%T}U> zUgX&MAu|W?U>fAQr|`4>wDv&lgJuE<%$qwQnX3SS<47_(GC6sM2J#z)nv`D zLtkNr{brjcu9I8LLUAPW?#7HUu1uuHuYa+#Aic{$T+lX#$uHmZnKh}Up>GQNVy4tY z>pWvX{=P`tJ3n@0MOkU_SMBaN#W#T3=7gVFN_|0`8J|9PE&=soQO=gs*SuQPy)-;1 zS=8W{i0b;tm#Q{X-D3d@Hx>0d=@Z{k zQ(fs)0#*S9xS#_W5hnXS7$@zF%{o4qZ^}0X>K(EqXH_}JOg_f2^x3FdL)0B3(Y_}g z=8pjnEsn1OOwHbu1qU63-kd&B;eeUAfvrZgxPh`U+j%40r@Y9R6Qu*7b<@Xo48*$f zT!zh-{Ug~as23a?NAe7e>e93G6+q>xJS{fG0cza!?ysWv5_poCJyh1~qRMgZ7KU{1 z8z?~6F*>Jnyz$c>QT1r{CDTQG!HrLh3|U?~w)< zr`|n$5TJ1iq);MB5`cl+=9wrHiwPmR6J@*_sm$a&k-7QY)|P9Vs%V#wDdjEJX6}vC z*}X)134R;8J;a8nbgr$7a6lXNRYnA53ifENx&q6`KBZJsK2unimf@LB?`_+C=j&oa z?5cW7J!U-P=~Bi`Pk>#3CbU)GH}Wwmkli6@rf&Q-1?_#x_1w`BIjwgAB30Tt>Ix%t?e1{M?kn~VN^ zg@R|YouacK`f1b4exTUm%>3;+x|9p+mh25Ub1L9+zM?nj=SZVNK+4l`K`RPt@G-{_ zD76=9JKC;z?_0Q$J;>y~W+aEOd*24g`(J|6!Cj%cc9d=IJ9Ms0eRu)Fs{lXauWqZF zu0FsKXI``*Cztf4`*>yy04j}K5d5(YfqDiC5v;O{ZX60T17Z0bB8{Mf7tvt{gZmzA zqhB0qg!kmRpc1P&1B46SduP)J1qd@16j3_Y5yk5E2vXanT$O4mI|QN#uDnWIXBH`8 zZS3+3h-O0cIT3_Cdc`k)qGsECvyfOBvrf4eifll`y0Mm_pB%YvHHI&(#r4hJy}4h5 z{tW3vIqD&OHk3VbkmzsP9i*pz#_|RQrjI7UaGnSJB*jnyj1inSRGpZ}TH1U0@StR- zs2|y_%mJHgAmaONkgsE+aToIR0`;R5i_R9dm0BgKs)_OOUiEdk1tOlhjGR#rK74xz zlaq2{FX-M)*V|30O2u|?#HGY`shS_QHN!_hWNV(A?-8Jv?g5g5m)Yg4Zu6QIt3wO} ztY5VYU@QABOpqFx7#GvD;!+&q9$~*#46J{wCTEHU=i=t@^;!%%`pG>{a zow}g>kFK9t_GHc2-g`>VURGTVm5TDPYm07q>b761K&{>LV}JX&In2Qym%lvI-^zL< zW|$si!l0XHp=pJUbPo;78=o z8i=+5@!%wu?kLKMM8p^LF!@zWwmd~(6*P@WcVH;3k*q`qmoCF15g*Lfwpkp4yo?gT00bR6q1qm9@k`MC-EkV`V2Clv!9d2#{-T8C$z~SNZpz} zT3VC6u3aWwBwp^|1UJG}g}CZaEGRwEGvBnmD5slY+0J+p35yPKBx~|zMdTlzXUDmM zu^5k9I=(X#>Z-hFOnWrrPi0~_Onb)V1JGsb8TL0!E9w9QtiJ}Z%=PVn;mox@Ug;tj zoawjJ;poUsWj19jiWXG3F{v5JfnT@I-J(K9~C1A;Yo!L8JgGFvVPDX|w zZ-UCkDYaw~aA3HJ!NR9(o<+m=ZqE024{E)8K(g`dTTjhk%boP4cFBM8y(Yr8Cbc}!cW}uup4mN9(^#s}eaO(?c?0P4mGe?VU0vMZ-VS}K z8xjS4B-W>Gku0bpePzW5TyouR%BFZDTkU3pmFvpUDQy&~33tm|Z|;^#X}h0Z0~0mw zQ`h}%UsC7iPAQOElttV!`FbfC=#=;RPO9b!OX&<9%CRAlEo|Z_lyO~#sBU|7Y(MK* zw{sn5pVr|GJ99aK0@t?vt>8eHk*Cfs8A$f%u0Lca*Vi5!no?r0O?|cBzM#saz;sYL zxopL_;w4ESH&&9DV~enn>>jg1IgH9bV_n( zrUu&{Ma3HXk0*QfJTORUE;WO(Pk0`ty!gsZ)#@G)Vs0Q>>6LvQ1Tg;%fJH4ITx@4} zypWxC|NI4Dk2F11#?2z}mUQKJaj)10xua9kG+4giMhs~wbkej%(ytr&OGmC?)= z*kv*%(-%~2-Kto2d7Lp>2Tc28=;rnvv1n;eBAf=?4tAK1U6ngUGFDG59j7QpQn{db zMxa852cy6y=&yAor=sTArCl;))u~^Rc^)o2d({r|s2O=>#^9X63HPdOfSK%7d!ztP z5$aYJ6{w`rH!7maSo%CPg=K@@+YH=W-Ky#7#z$4U&`{zEIKFcCB+OOaAt_}ZjW}2I z{#q&W5xR#`oNs?MxRuO9FtSM=4sj;KbS-k*uP|Q#wwr4$Pj>w%J)Kb1K1F%#u@j4G z;H&rgEB=<2N6Rn3?Uq0@*Bm;rLmtYI3Nt70%a|kw4iSb%qbXX%m5>|)HGo*;ml-u5 z5HaK+cKhf)?DJUlzPJMhq@M~8U7@`yN{vkzQ7;ZPH$u>8vV*CJP4V1Mw)TtUwG2}a z2ak`qPm`g~S{Qx$tUB2CCy=dg*Bapt<+ntKNVMya#*wN4f_+xpGH$lTQ*ZBR(gz99 zW@$Z1b;BE)W5@1|63JkizGB_(CEb*&oTZ()3|AFY#S1PcTi-)<-~dlSuk*x6S;*P; zIB8T@3p;9`v2yy@IrnID<%8oU?!_n&@LemqBKeG@-cyc0s=lD5sD>9CS7q-Yh3!LL z9!*~X=)*?2XDLP$iB;8(Z^79f_`$t+_#VB1_R#<*JvNr3n2rZQ@prccO;WrJDwx z+Dw1-1oeQBVV2#YY;;xtBjLAptLLZ}{|jP9%hTEiAid^tz;n{54qK9#h3Y=n3P)D3;531&G#oVD+$XPrYj6Gv_c295`7r+im6)3p5 zng)odvv;4@E($+?Z;RIQHeSFEa)iJut&8_jMb`6SCEr9MW*DpC3&89kw(UeqcaR`G}bh$$H`# zCKEmis81$5@-eY~Wd@?<$awPXU2OKis3r5m=ThduM#eqW4wC$b$&Vs@j&;GuR+Op) zNQZqQYRV-e&vd#!LFa(dep|Ksl$2dtM(wPx*W!S&_aS?toT=uD{rUW7_5zIlh7C^s zD6vb-Yh%Wz?A!c&XjPGJO&Rv*O$$P*B1rR0%H}J{M!Rs~4}3r3rpaA+l46|v;_MQk z=cA0ic>yMN<6*0K7WZtc%`=)9xApG5(S8dh{>jl?H?C@;46pJQb^2woBHBv}(FOP` zU3Dv~&v?1;&BqZ0LL-Q(D|{c8x8?)>6k1z6Kvd0nEWGT#<}EPsTzw1BB2vZJ$IQ?Z zJp5A%0g433#QfFrbiErN)_BTux^-z0!kcNWDZUPNgSU!7!>*d_GGS2Fc8O`qz!tXH zg{l~D$fch*qV5~>14(qR7;|+Kz%s$z-Q7i!G7|^rl}U7P3N}+rf2A?pkQqjgAYHNa z6;DsWvOH;Xy3dY1DhPIUA=C+xU7N-CH7&v%%HL9#g-eed?5c=Cb+pa0)0>cPRHr=Y z5+{XiV>EpZl476ExE)DA1&do>qc7erf#vtAy=9w9>6N@ut?y{Cwgx8pDWM@RTB1wYu}b*WU;-HE z9}n@q1*xiQ(bJ#IsXDI%gnj7}abgB2Ls~iK+`;3LDk=TuV1nE`!AMix{<(r&a3Z*+ zBjl=bwH~J&&dRwXV1D2AWZ4a%+8`buAs7}56meOlH<+G27OGZV5wGz_8qr# zlw-`dW@pj{!Z31hPL2dTcMp)sokpB_9E2SXU24HH$&B%^Eon2Gq26W%W8at|P))mz zSFuhS7P_b3L-nqB63%g$iuZzaIv8cngBd=4OY{U-(I-re->ZiF>S2$jqTQeRxhJ5lDcM|ulA?G+~m!e4c=GjB{<1-OA+2VYN* zkkehfyMEKTs%hNZ&K%_%)6<(&K0g`7;IB2FW!Du9wa(I+pD}RLgZ{|cpp)(Q{>Y^? zDH<%UDfCSMbOkWgy3K{feGaYV{b?^>-07nz;CmLJaPq6#CT=vXBD3P^K)+@XC7+Rr zbNkd4-1GiqE)sDlK)7Da9j92n1D5P}{;;AEG&~ejT;~8VND=F{(&EtNJiwh_(ZZhd zdNFiWPon{4lW`^P6WKqNu;Qs}F;N301%wK-@hhqYhDH-h3x4Z)i+LUp9%bfYBTdOk zK|uz1J|=INB+zSSs9)jKA4iACq>i6qf#9^Y{Ya0i7P&n>y2+?C&;*W2P5#~l-UI$t z?rY%JGh0t11U*e)vFwk91KcA}I0z2SliAePvIhbHBADR;-`kC$FR%B|mW_hU5V8>W zo3;unWBCj{@V_UE?$t=d00|j7U#(`**!ZnKhf4I^X1Lt!=Z4<8*$#qaVR!dItg*kvygGYBW*}C`?&R`8Np=(X(aSNtNg;i@X*gW>3Sg-Knr&lQHm~3X zf?(Aqt|qK+1$nX+w1&%s;a+GB!}kL~k24l==m!)?z_bWJ6>Xe5QxFGwHlk0{^p%wZ z1-M%PK}uJA*qv)6_jSpl{^D-Pm%1GcYp%bg2P6IQJ*J>VEazaiJwUh)&)sLrv-Wys zdbIXi+~rrBL;5NCg)u46lJNQCk~pBK_6oO;2UCj9_{0o;YbgfaPRVPIF8(P|N}?hi zzB_{NF9pDPRbKvwm8=>hcf56>%hutf(WBO7@Avu+wSy=9W76;rSi|WhHRYFPh8m6p z(PyE;mm9dhZyVFwuk<}PcS`$hc{7>^<1~2Qn_L(y>5J;(ypNju$~d_{n#O}#Bz!xx z9-oy10EVlJ?EfB+2qVBq%*#I=lTa27{YniQ4s)yti&gf^DW&>o6FWfCRg#dvKJcL` zy9s(bc>Rd8h@)VT-_M%3FLA4L&L8&*=p0XiDP9a9WNZg|>{Twv*r}hM zQIUBM?GCMz6JTMgJpot)AWS>IAn@)mp$EEF-ys|IZdD`hl{1y|;eZpQY)>~hroaKY z=v0LPCyDtbX4oU<$dg-7HVvIhtG+i5Z=FhtUHe;tzf2S~7kN*EhRLmhF&CPbuXn|G zwB1WQrfH<-QEoYO8}hUMlNdmw?TOdMZ%0%wj|9WFp>k3N3{^*c%|i7NwiHJa5+UbwicZXs8tByJw!&D zmbc7t_^sgc=jRR3*rP%df2QD7>+p;t->)0$SrhAPK$_VU z48{o$;12}kzYkSph1^8SUqbQw*%!2WnSvI2l-p?KRvz zh`fkXnW+D8t+G0zGx9DNm1wyZ0DWIeA~+5yBbuqM--|$h^^3nOJDUIV4ow-!7|Ich zwWRNg8-q9Ls_b%e(bMW`d81CNhYufiwzOCP!P3RXhPjVyQ`T^+qtJpEu!8v{v(;AD zFMqts-~ZHdk-AOkSW_7v$b!+k7}>vm)K@;J@kA`$X=JdPKIRH{sj?m;Cd=KlIG0x3y@OG^)>&fWz zhBX^26EHo!m|Vi_U4WHLv6lfIRt|ZeTg6!8&s`mhtr8LvS-giRFVJXgL&MeF=g*xW zTuUADEb-FI??Y*iO8qYS`uY~-)w6SO^esJvOxGjaC~IC47yRfUw0W!aZ*N{kOw(bKle#B@F@6n?1@vLCo;;D<{PA@h znA<(x@ckovK-v|?P5n!QrPgnpfOg}Zl0P)`12Nz*t2XDj`%NWf^b+mCamG@t-SV>d|EtOX6wZgS>!?`yY$OQ2KV0fy-N7sC!1nVKfU zE-=Hy)Ax;oJ$C!T{;gOEO^C&x5&GA6+cJ~PMV{TJpq<;(b3hK^-VkwA_Ttv2Dg%`} zm#`waU$40@l#7Ox93#omB1&gQ@0V_&YH?8MPh?KX>EJJ4_EjjAd|HMPia1^ykPnpo z=9I&>mP65DyF!V`X2jPl%m2a;m3IQutI`YrF_1B7A@k}=Ed}camfZY&VX~W^;Vhi@ zoSELTmoK-ej?U0R`nv8PmW*>`L(dPMVCbQZb1&z@Eup(R$uq>U}7$Z{TKGC zW5@_pOE9lOl|n=lP)Y_M5MtCXfTnrJ7mHeu_o$r&v_@8-;1CS-Xz(a17&Tggy4qGV zKy2%6BUQnMc5!Y!_^;s+GR>G%fS6Ebk=ah{2LL(6`;&>=pg}?0hzdNC1E~NDa zr+gTN-#irZ?7vpVsY1 zA5!Gld6f>4Z&+A+>5|N?xrv*!cyLoGd)qH@?hBwTWuR31rhmboH&k%!KL;57ta10C z3@eNG03Lhu>nI>zM|P+B|0#e%+iu8nA8adQDcfuRjPlzYb|;ZI_RjGzVBs8aFzR1^ zS|#)Vu@iFqQmQqDHhTq>#^GOW65Mk|nY$TY1Nf~gWF9~w%{>js*VYv7HF&83#xJwo z+bDi!5ZsfUjW|xo)-1-voQHiMmjf-FKsx9P(t4o8V1b*L@5iP1$#`;VJe*c-m7oWa zlPw5lJ-ZRbO~y%HFCD^yAKm}09~zHdoCl1J&S1=_w7pSZPmfg&aZ!E;RCn9H6BQ54 zV73t8iu;uv0Dcv?GtG-4Gxk15z_scSqyX+Djh%P*9yLx<{plOouU=CUrpAJSK)hpSf9-*y!YDaYkQARt~E{OPL&93o*czg_)r;LPU7 zwbRQa#d-`k1?`)C7IWJFTst}YgVdm<8vELPSm=t01(PW*na zk*ER4+cGKYQXj)cntWhlR25Ou>Mw|!~{Y+7h($FKItAAt@PqR^vfYrIJ_A96T<2_qWL)F1^939JX%r}B(POd^>AXP7XN)-tWCvsP}RWRSkNn*O0 z^RbLlx6eUTD0^`xZZC1p<@=HR(`oY4UIfpg_zC)w-ZZEh2tO-m+KH<6efiK(I@c81 z`+H)?eR)*V^9`jrJFjwEqI$r4>?hv$z0>|(gcAAmgi$~Ta z360JOk%&+ zim+x`! zH57lVoVc-78goOCR-EL8vU@@rYhCn#A)?@0^_w3f^Y3f_=f4Ojf;u%`k|~~j-w&Q} zVN>ppp?_(j{rB5dOMeUQ@NWK};SO78<=;NaPZ6l$WF(X5@TXh-?%zYX4A#x}EO#sc ziMNJJ=K@S!z1aV-1&yfN1~bobG*|rQZFR9|=25)M|97_E9qV`J|C7Q0UpiaY$SZv? ze_f*fKkRzNv|zC9+n*{ux?edlVwc(>3AwK|rw8OH*(@US!^4enFn9M-P~$Ydc=6&0 z_9R5#eh(m@`8vXR{X}_1^Mpdptphir1HD#zx(d`qx%7Fh=g3R z29(YYFlJDnZzF&ByPA$$iK6!oqx}4V*1G0}pTm7X|1szbq(^@bA`iX?k!C&s>>%`z z0U!kQy8iAZ#)_!&snOjPm5nK9X})9e|8l6hLGuka8`J*?c4}LY5np*IbV9XyFuD2u zr+yQ34#%FKY*GI{;& zGW|Ko{^_el!FTz|H+%QH&zCgcOoT#E(Z{3E$>O>@ZrLSq2aE$*at*cmw?_TD4GR4; z4UqbE*FO3!gquzt#CyPvkoe_17ySxAe6E0;fP)Uiq~%klKRwAWeE!&;UGa1Gzy5~% zVUw-Km>O!N!hSoMSqWMH!)J9L-wNc0|FK)4CBSJ|moknPH$WJ;wV-TS8n_&xT!sX{BUxbr_i#V}5DqKHr~@@%RegvJ%jQs<=V)3pG7kv{T! zX~fPCK)Qxz$FGwXMP_gnQuERj{I^w6hh{7Z%;9(sP#j!R`iHIaCx=DFDju|I@V@ac zb_;Mg2`b8oeolw6pn?3B`M;?A6z{C%(dj?k_%EL2rUUN5edNF)O!Bq>VZS~9@ydVP zR{<%)4lWB8VvXmINBXCq zky^amb(0G&MqYb#A?{jVwF zm=P5`QeY;2_%Go}zsE^FH>m?%w+s8%U1mPk(9m$hzdkIPAt3*{jL^h5G&{DmSe5G^ zb=X{h%4^eC)H?B}x$++#AuV@ned_*peJZ#(i1&H5LlrgIz`GC>22*_fz;~dqR5qc% z+;hRN?#RDIt&2P7 z{L(coa>IO_4qr+HI~St+!{sRU`wvu*>|BU{e&V0Ebd?FTFET;a@g2SRH^ozU7`jcqq1z~oL>RqUvk>y$p**U`}@(M%>!O0O^V zpJQMXSyN41TOLgeY@=FZ#W8=(mApB){jLF z(dC&|NVXmJ@{b4#3v@jg@O*Lcu%xd>=uVZ}zy70rWLp=1vG8~`e8_jbT7KYMpY!yo zcen|7BYX%5y&nNO@i9A?&MJaAalqf4UCKcSfKcLq8kXvCLrf<4L~rZ82Z|jlF^e|FJqvhxss%tYd(#VY@X1d62zy6bP z{uOJy_Mw^ZdpJkpE%Ta!X1Ov`kGk?k;xsx`IP~E&j5XcN+pcuw&;}s*`rz1hmo?;d>#X7*akYjq&;O`?a!|j0qG>WE_CwO=2Sqq=r~+9;CFhi9v;eh!Y0Z2Qg0+^ zgZ7!6%TeJ0av`xmp-UBzXl4LuG3UBMK@LfTSiOBtgERnE$ARHFl`0e^1E{hth#8^Q zfo-jOUpi~&Xdf3aK%2yd$L#kAUr|)xql541?=CP+OP@p{wXxN;GzHtJRH?Oqg`$Y7&r&422ZPM$Q0| zJGj-g(|z-*9&5k_t?Gt6_VH~0^`H0mcA7jA7+-rj%^}&}H8U~a)XX_5VwqRLg*_}8 zUK<Bun*ha*dxzaxl$?9+2m&}=r29nYmC=vM!_S|E z(>ufh@jiyHdsS{k0y$tSNRd@s9HR79lRTF>wZ{<};Q#W4r^5Oo_6jM;j*Ep7;HR+< z+gV^P3h_1VP319CqA%(aio&ccOeG4SK;tR~;Go6v)ziy7=+8dX3nFh-|y0O+X(9bWY910#l)HXiiwVy;Kf4Y~jTg?9RRY5~w{ERWD4(!Xl> zI*x(kFX-@7cijLYgO!W!#}bs@J#2F-aKBiG@ioXZkBLV7Xkz(nAvzb~{a7 zKrX3YJ=TXdDc5#NZMuq|Q3t9@MJ}|(Gr)T?frj3VL)yBQdKy+}2IAqQoLq;+?cRR-(r^IGx|@eNA|R1QHedD%svsMQTLVE59^+ zO+}^lgf@2Yf`A)ODT4samY*^*6jcj%c@z1ZnH()X(Bnvd#YH957+hId1ohQ`o{@~J zDGbh_tpn6LbP^yLU9}^+PcXrOpM45yHgJj-0VTon<@a>qdYychPDIgtk)OJ^}@MO?V zJ|CLP5nRZidV6&FI~A)v*cP7LogCAw13vTWlTQ}pJjUCvfQ@+(E=ViHFtNlNEEYU5 z^ZsbWnJzaiFrYYfgq@EU* z@w%EvskH0JduD|-iww#47CDb2KA>G~Mx9+MFw_V5hr4nOM30Ip?JOS*;dnz215!D$ zfSE;(>Cn~vM+V0M9n8byF7R#WCK|3=uQCoU@54?iIdN74roIuGpjlcwL8CyG9fc4z zhVv0R^if(dhj`ga?)O^NA@-Yqi%aUuZnUf*0!XA09vhIS0_8IZymHN1@Zg85U&2Hm z2jab;@{eh0nKl)P}rU5#L4UDxH3@s%A7u+Lh^;BGs?|?1@o4*}PF3 ze#m_Q^R3#?Jk^nF`mE<6%Ra!rgmDI^cnP7GjRnhdJIy2>$qyKjb_`>}Wv9>fAk7}N z-C<^Y8Yalg%CE)a&^OI;k+`xlQSgv|NVWC+vdo8EAhYRQZ?U4oV2$f7^f+|Se9sLYI$ntrQdqF@T#ajEt-~kw4DWrE z6z&x`6G7?K!#F)p_bn5q91)i{lntH`Kx-wT0<43CG=<68G6`~h#b&t(9YEtmIib2 zLA3{Lr}{$P@MR<@)xI5deRs&_$(z@1O;iF-{F--l@j&EOF!M}#-ba9XUg8?^BOeorsLF@xQjn$T2gq zNLe;~In-kv3r=rLt14P=6b+CqE90jT3qj!t%hh{+zqIxnpwOpHekTJ25RF^c;drTR53km*#^ z_NeN}e!|m>45vFcXmTz`8UwbNB4W~%q#dO)a5k6!YYTckWk|L0B~5w0B|zVO4P2~%cqC=qQ)XoqpC#uYR^gTi$s^^QF_=O1;7^T z;cAwYS{ti+b4GZ`_4XS5H3}egRcXBEj8tYadFhm1{*E`}2;APWq>2}zboGt5S|)D? zlW@l(GrZBj<4laJ_2Lt7;!MgbL|p!_OyC`OTkzCHIrDa3{JYf^U*GEG@*j;L|DF@T z3C(Js0iwT{!YP%8*UGlzl)UxE4GnaP#p!z zr>a0Scc{%6QvRCXwtim_O)HBC@iTc4X$&B;CsgiylQ{P{^i0Tzs$|isqKZmMUpPbc z$3!X3OW}v@tVC7J%kwY#rlrDy^Di7{`WBxI2J2763*N_AE7+S@)}MWP*fv$(H^XJP zVZ_A4eD!|GvAbNhDs(6yMD~F~8_+5ox3o6joH)TbeAqc}avyd!S;(yNWwOR(Os#(U z!LX!~+upZ`>(aUNL3={TifadWa_F`5){}4RhRtVbvx^na6FF-2U$`niJycz0tI||7 z(5kyQ&@~j*7q>uJyXE)aoexY@==Us?Tfh7G$Y{80oOq`xGmMGjGQ9D!Y~t$dtRJ9b zEqr!lc^7jZ2e=-n=H4V?(!sbFa}kg~AimT+Fq_6@XXFsr0_hJEf@zlcTd9|Gf%;|^ zGc%c2VL3?nuHeClatR=M{UCIeik#Gd7?tDc+tLvWi&#U{;_m(2VG8N-owD59>dj>4shnMRWtdM%Wde{G9?=7RE zUfZ|fy%nUpL~1B00cnvAkw&_~p(KVzkP?ZZ1SJNLPy~jq0bwWs84+nDgh4<=N~F8- zy=LFfzxI3I|J(P|`{h|{f5F9GOXv5S>pITkJfZ`?$B1`yiI}saCP@p#HL*y8Ph2Nc zGN45di}Bx6X;dW4 z^vS(&5NzOD1|z8>NF`Pq{1EzOCjAFizd;`xuX!URWb8EfD7g{-?}uVAIQt0wY3dMv zyRYOlI`MG-^dw~07mScsSO3olxmfVBtBudFh|qyfoNKAkaj*jQ8FZ#0^NAMHz~^>L z5Hk+^MEIrhz$~BorQR)DoB`R)mGT~>5OM&G9|NL9`6okXiIHYRp&_=G!+d3=Q0FJ< z;6w1)Y33v!;c*0StTTxKuTc+6SbBO_g$mz?nyZ*{3I0p?x}NwNlMs z^>cZKQOP|eTu9xUYCUY$E${rdzb;NkigcK8cV_=BLOD?ORj3iZOZ0;B+r4P2UDd#D z`{#1wYj>e;vtb$Dm2$IBX6bKGGdk4C%6g56MeSEWNctaD~m(qPw9-P~MGW-bd_l}y(zn~~-!M_|8ubpmD zhJp)jiImp`pYKBv%p6L>5wlK`-8=YF#t{tlMBMyq*_q%p(V^4?0&V+F0RgW(SOMLg zklhG}%QYmYD$GAYJ^Bs(9x2w)6@ZYs6u-L6G}lwbLi+Nwzv9RN$(PI%Y`Ec%5*zU%W><)Lm^6jb#7yFWN#9MVLBnJBo3`m9Qm zI>HbRi5|+rjJGkMO)AWw8^K2j(@S67rrDfioEEy1ML|rG%Wyv2sN7`0KiHOrTZm(k zY=Xw10k8>n8v(asb?)u4-qd&ih8BE|!s>NFD9K?0&JiUA*FFRXTwuhhj;;%iY;pXW zL-1S2lPdeSV4JL;7yorUE&lEB*9n!}CZd?#R$}MIAA#$P)nH5zqdc0e81E1a{gOUX zJsErX99LJaaxI-D(q8e#3n|Z6RDVM7xLnnPI!>R&!V!W9cI~kdJ{WsAsf##n;_4Ag z`t&L39-_(z8u!)B35`4Inc#wmqsRnAiPHVf;Jyl!1emmr0d8$AekXAPs=`b?nilB| z2PwJf4c&QJPC({SA1HdnkJB`}8>f0Iw+*nKas(_cr34rZ#fmlWU@`BSe3yH{P-mxn z6&C!Ibh0L- zmvii^R1)5MCY%x|dD$Y_+dx!g(J6@hcq;Jz>1@eOjecUw#;^LWQkw5WAUEu1K{y}p zT-ANNl^ZfsAVPy1pP06LP{nD*3_KC@+l&FfH(!UULWX_&91P?CgZ+|X`}=_XlL;7i zD}eYN5%WIM0=fD+0YaU-e`awA9!F* z%PK*A%@0?#uYryomPL;pq4{uGymU~c8`RM9a)lZVsV8N=b&ub;jEm>hqkL&@E=EG( zo)paV@%ri_4*VCO9-gce7e_IQ-gklv5<+p!y30y|x4FF7|0LhJa>33*^07;LdL*$_ zoAl#j+(p8uhA363%@8E`NrV0h2IEW-`{?A(icc@fP;@yIe?1p`1scmsBFQL6LlWyP3K+k+N?GC4;+Rl!kmrW1gDW<`g08FJlL}zM6#qTWL^5TvF z4F9yCqL>4AN7}}Ng=zodmE|nYvd(XSOH>#Qj?Liu*R%1plgB43JWA54h<0TcdD)UX z7;;rISuch81kk_Du<#tvDOznI$JB$D?1-q5Dcmq~_FlQGTvSNgLVj4@8q?5VIZkP`UK>5WaTgGMUh(#($))t}lx5RwowUld~QbpI)$ z5~LIc9SoXV>$Ck>Hi5csQgH#HAPB(^@!zOE!2V(-~4hbDq-dJLlGe7lTNEY@A zu*?JSG%7;Cn)+L}_=pbRg7aSq{3pGAHvM1pHZSbhxj1hVH~#mSJW{0a?jyG3&4up+ znl@9O(2`e-&g5CIE|~!}>*G__wE{MZi)2wpnpPAWD~i*)%&f+4>1HYTwL>_y2QFYX z2Oy|}Jq=rtcEFcIBsT!SNdk;U=Xk*lMMb3`?J~0Ej$_Eo{XrqE5OQ@3*RhghapzBv z&ng>ly#MipRsp|x)5TZ*6QBwc3T+)Fp?z{5FHrm76w7woi)Qjj+F9&tY2mU~Gw%c; zikaS^Z<+?VkcUr$-fC6kr^o9C;e7o5?nV4CC5!imHGqMF$4NhQh$ z%Y1&n`WH_o%8{mw->3xAXc9q|E4>I-oR3gp9rz3{0n()ixPAEzqr`JD{)avV2l?Fx597gNf*#AM!}8H z!v%Ny?l4$$fkCmsQ2iu+(|z-6>p%eM#4KCb89P`gv@|)fe|-&OL0&_y;yT;GD#fu% zE7n;3yE2AO^WpbklLilKLsp43r201CJAIykO^VbGL&|qRLp}CQn6L@fY4%&O+mN6| zV|a@iz?T)y=FG+UJ$R-uc``3Z)`7pwRJXZ@=;U&4m%RpH zklBBY+@}BA$j#+EHz(G+rSyrA*fLI+z#N~OX!{fHUe*&AN0a%Cfpv$@C5osgV7VYX ziWvvJ5fI+`rPN$I9#W8Q-k^Jh^y+<8!M6{jTm){8d3BsYURnjM6m|?GPgM5bE7E4< ztUn^ZKiUTIo#f)0ZOr+^03e$O6&jXLi%bJk&N3mCB%jmaniWmkLIG;EqsVQp_1h`2 zG|iS1Il_OSXw|{`C^%-8{fw1;MxeM3upBv}o`aFUb=2ikf}4o<6bkzvpZVgq zvuXE@|HG_LP9N@1*k;$g1i&YolK@@`O4>D&`sdw}av^p`RaVj}Dd{ru71OD7Z3Y@x z3>Ms>jFSb5;g{4-FqeJB5wR-ydi-R3ij>69j5dpWD;ib{XkD=UD z>|bPe`^A>B*2gQeSv;2F{aD#7yG3y=L>ij78rlBmAHd|{y=iTAT`npI1b{hN z4nn~Uc5wy;YGj-Y-@-+a4C=bP?Z%}Bh2QwTkBhKw4i#m-X12>ux5kX0?5{2Y`bu>1 z$GyS9UT^5K4Y0047Kt{=dK{rXrr3+%a)qClLvxMl8kVm4vl6N%&EvpxAPCIY38GtI zM-Zs4C?Y?aL;s?J7lql`*T1&PjB- z0)@dw&m(&C_R?bz)RDb<^*a_Yz>HF++7TF&wF33k2tZ{V9^qJ*Lds-3cvw5J4a3PN?r^g|^ht=W zgM$zSX(D#9feu{HgiuxJWJ^Nd+nwW3SrCp5OgwtRbrbQX4{W8^n4u(;y!Yh6V0h*O zNbk<5X4Lj+K6tq2IX3`^>sTh6BkXafOl1u_^Y*nihxUDJyx$R#NsUe_irk5$l!QE; zyM6Z!hF+6CLU=*0+cc>PEFlde+QWN`tO?K|2X(6kAluK!l z6hSaaz1$91Y;9?28FFfduN1wttdG8hW1*%bZF9UczqoBWqx-%V!Rl_Ff8(*t|}? z1XE_fvksX6*v4Hm-Qw}-js$qtwu5QQzc*v`Q{zzo$JqZIvHt0^ZX0E1#G@ub(sS9c zE8(%3jHT#8G2>u&%UNzxDOwzTbw_o6Weh!@knQ^> zNH|mhX)Ep^!yXVK=IYCM6AgXxuR~CChqRwt3IRl8=H|^uQ2<@k1H?*fX>z1|JHxVyYFYL6ENBCBqs~nF zflo!U{C>I$L{I}3Eg`^_7X8+&b}TM<7T6sff&J{d@iqv~lsM!JIcN-1w&;9FAx)oe zl7C8OFoVm&ap=JDkbXA5)Szxani3I4$8QvS`V~%O`GiJ0?G45f%z)Z18djT)vnmOZ zk8)_hu^g=XLTveWmS>8W^obfd44V(hWHPE}Czi8wWd^Og%mU9>X*CcMsjOz>wB*m{nDsmtuAdj3i@ktHxcN@*zbvc($lPbC@cfN(-a z=_3F2FA*^_&XnEv@`)YaLf8>E%ttn;gW)eky}zrbI*$R?!7MBv4(78*e<%PF!t6wVF zZKD2hhudP(UJ>M26=w9irtus1OS6ZtyAW`syQ{Bb9#XL5Ra3SkEnQ9~S+P);kGKgB z1=+{YUa~Kua7u^2wi@S=q$c&Q#=+P|(-2dL8c3$-m`3WCkxejU(V^erD`&eO$N{6V zVO8UI;weErxqSqn7A&gX?r5gIc9eR}%-O5`o$io`3zjz*eAGd}_TtbRTqMDZJrZu? z-Kl!=E=#iocPWCqLjgSYL*S%NyzfVE)2BcTPPYnNnN;ONt{>%yjc%Rm9k3pzq2QY; z*m|}Dn`8$9Dw0_Zt}n;eE@H!vo(7AmYJ^C+gTu<;B*nXiD4ylE-_1i(=F77WVsks@ zzszs0PXIvGDyQ)3`ELQL+JCH#Z2kwH`tQ3tU0++E4xpguxxp(COE9H=u5^4I!J!&C zy$4VhlM4yQJCTpfG{KZCl8)+}ylGdUK!zd|OGZ+ZeE;$Y^a?q%b4o)}Gh8&><5E8u z?C^V(AKhc4t%dl_vCBj;G(<6crNOI1UCATG(2isP@mLNDs#c_QJJCIf7Bctk=!F0> z)`4Pcy{*HPYZ4NOA7}Y3iVFu7@MG3f_i?Bz3x&V(9Ry=aE*^W$e7m+W`KFla4|X-~ z(|!m?-dpYq_9ntvGGs@dc2@PkD>=)c!wo@7Dq(;qe669(sviNSW0WRIp|8qBIrWJt z^LHFla$jNBoV>Dfd4km-DCvw2mc;5Ugb3}FfH$d(MR0w`Rg7x`L5yeH$0Paq(-_+8 z(+KM(5{*YVVUnV#in%KC+uZ3>Uq#K1$CPh{+RuD^g@Vbs;*_4LFSTukonx_cXSZ(2SF)IEwPLJXjLFgIPkJo!GKZOZJG~4Hs3N0=&GpNs~ann&$pYt zeL-WG7qmh?CK<(T?zedWs_itWO;+KzrW}W8+>|q;@UPj0CSic|^VY$Ukf8l%9)6`# zi^nglk8PT>xhl1Yiw&`R1@MeL%ad03NFh?OF@B8(6flG)l z*!%uWMU#IKkDNC85wef%amVgiQN1o*f4F!b*F^_%_*@8I(FVz zdsm~aIBv7UqtXaKQyDTj#7nke&LReKrGuC(|5{r>h~$zVSGk18!1{s$$(k>@;US*3&3m3#}oz}@|=Vv&XNx)`x?_B#NXTE zhlmdu&s5$_@K@QMy$`rj-6)Al2o}Y&w$%b`ZRph<&W*mKnB6(4OBzpK=<(0q3HA_x z&9y?-g)}3%Bp(bizvs9CB}w7g*iO0{IqTcUxZLSK8_L%1s9vl}lCIEs-0}I)T0~}T z@t10A`{v@xw%@g?+1_z|yx_T535A{bw9#&uWq z7m=M#p3^`UcW4uE^fgbrAe%H=To(1N9pz-WyJZbm6$djMXFgOGnRff(&#ReYuwSh+ zo|_L!UrCuOTb6z7>Agi*%d0>{L|p3Dv5KEhTV>ykQit?ws}Ng&V%*l2A`aN(NMqY& zyv@lr5szFtG-OSAI&lPI55S{T9?J1~%w`nbB#bS};%o!IP^D!i6uuQZD|hCm*?WTqTHYUCuXDgJ1xGUQacC~q1ucJ>K2qLTM)K5U3F;O2qYNn z)XgkhPRO4*GO?Daj4QHH2ZI)odo6r>bS^h3wL^L=HgqYAAYqe!S7Gnr1j9rTPj#;N z9QJHD$~Fcprme|d04-TUWBSXF{cANi-7Fc##L3*NJxn2d8k`S?;R*0ygIdwx#v#si zVgt5~p+?UyZ0=kxa0#ve_)LcPue%2Hj};)c;Ae>PbS>E>$YZ9Yl*J2w>^ii%+_YMf zD5i0O>vpbZSPom^ZEtx*Tt6(5D`xf+DtcDtj2s_c4N!lX0uJI1q%Qy7I8#B18d4SW zP596Kr?21t+8ggKnZ^>lS2_IV2Eur6yl}?ubbBF_2S>!3grH^72y4s zTLDR+ppK!8JyFcXn2;ZTyOpR-^%|AN2b<>0ppFd+8!Gfn9sQk21UrPosYbN_wSD`W z^ddWyD@lb=HT1O}R3IkAD@Uz}@E*38R&oQOMFbAH<&lOSm(<_TRIe@Lo)Lfif4&WW z--iE_w}BVtNX!(_TZo6_gIA^&fN|m9KcoX+oZNx#&c6g*PHaRAl$QWsZiww=XJal- z=DS3T7KJCuEE?cmx~4sMpD(|2Y@bTw_WSW1|MKpB^Bm8IFdV=rKG3>2P2pI%6UNx_Mh-THY2+SIR2+Ec3&OJxW(UnRu(*>-+8D0_B-ANhDOX)cy!YN0DN{-eeyki zHow~ErMT|(-%nC}QP|)9zu)n)Hd|2S@Fj(Z)a6mZ|~lwqy+2Qw`JeZ6S{i$Gi!%hC#VG6ruSZDVgU{Eo-#Z@(jY z_x|u;E(o2koDKLu?&S&h*}0$STC?v!5{E3WSkrKI zw6a{DU*Gz?`;*}6Y|p{vqL!Qoa~OE@MFyV|p?Mjg%!tB^?KykdssOe0_;fwDu^w>8 zW||p7?q3ye5BAunfRpK6JN#XB5XC^TR4{st9c39tv%93I|ET;z&C}$4Yj+2M##|(M z?<=WOVTIn?=PexV7b1vX?=FuX=$g7ZtZlSkAc$jF($T&ShvC~{+OLh}We@wMTNt+< z{q4m1r$2H4w_NJ{b#3ajXuDgil?M77B?i)HR`j>tyHI<~3C((6ROLq9RO*e;Ry zuOZS?i@KY0!;-lxb=9+PUef>3_i)uQ@6~1=A=Qh?ZHlwUm##%M2H6(Jr4AgJu8yZuQ*Fu^qR)9vhh7QrtcZ+; zx|7b>`>t+~;O)>UpU?!hR|%;7P8z)z*1)j^!F9jZ zxlQQeJdRlCM&mqr>cRo&6uR5iwI<^Bxr`f#2?N(&G(JAvTcNRhUVE?7Lc(RXEfmJU z3(js4d6n?F(t0kK3sZiH2R{a);0$VYaD?xT&;K z$K8+Nz1%uR_pTM^8#GV7^j+$)?=$Is=&0F4^3b*L)Q^wt*Z!iwLhs}*@@2gKa7YNZ*7HFC`7*)|WEQjr%D>*bD z{h;0nd+1h(c!4innW@&8KC)15%r9P4pyVX$gH?YY_`2USBGzaT#gzW}iYFHSB! zR$(r7UAGA{&UOO9DQFQm3~e1S!wtkmjnaGMI!sMK9-&ifGW1H$P|g}=1=K?G&lNPC zp2b|2f?@9gMvY#EAZ6)m@TOd**n?+Oy`bzmq!heKFd48C=M-2E`*oVjoSsU>mp`wdoGC1>q;3m>Nr44 zzfHPTRbRTr;VotANRI(?o%@6b9}M|=Mzlm<#l>>3gfuw6(>jexp?mW7vfe?gVHK)g zYxB)#;|=8=6-7rij6UcWwKKY-^X6J!&%MI^th=>WM?PY{)D(Q|Ax)zQa~@H@#ugYAaMhru z*5J};5e(kr_cb-z?*wcP&5ySkSKKf~ji z31r9dJ1#{d1Vg$AmfndL5-Cu4aQ)j?CEQBwTP2;qVv4!%ywgm%lSETlNK>PHONx4P ztv$wuW*uC^2^Nz3;8rw8d(2!55JwWx@h16d-us{d->6Fim+{4qiFKgJ)HI} zs`eW>PU$|Og<|8gJ@D-mZEN6FhzkRoZ#sko8M-5qfaGfciUs(aopSI0x_H}WFzVB* z{7J)bHE(g;W_%~0V_Z>dL&vabQ9Vt5kk?B6+9s8J64oziS;hrkSy-8+H5W+{&$1C4 zuHuV8!9~4eLZxm=wy)VVw%Y}+n76w6vq}2DWyrXZy1FEobnSSzZ;gK7?f11y&;BC| zV2A9=;k~@li82Y%^Qd`k7gbYi5VXgj3Hntz@QpuNQzI-BTf^hr({tUPNBtwm-Cil3 zXNmj8%}LtW2=!YnF7pU-DcI=s6?xxhM^S>z_g97#`btxaGi#G5`+-yY!p;}R5SCuBPzCB~g{AP5FF<8*C z{LS^n^)s;ozXPj*YX&M>udYlPrS-IZk|v*U^NWff4y2G*Z7%hjcpJjy7^n`TojpM3Lx=bBS5v$8>iAMH5gOvx1^&0YWwRIL9Zx&iyoiQ9SsqYBk!(!7E`?mXd%y z8*0;L0ulh4K!d0l@)5f<4D7KP{X1kuY|&waokW&d9%=46AGn9ZOv_RGnwOw%&^{Vu zZP5;wTVT>j0d>z3x^hwdF1B}f;2jb(Uf!49_j#9rTLym7Yd;uFjgaMdz4^zkQCn#d zpEmkKlwg{R33KkgXyQTRxx~zxS||lDH*5_)rC{S`3cI)?|HCY!Bk~3C6$7#sjQe+dXf0UVSaico-Fq7Z?_?lH~vD@c8 z_Y?;p?e~eAb#0#N;dcP5_!sZ|=|c2Ow+X2A+D{%XP^M+Dn$>Z6c%+KYkW3UZ`=FSE zyV<>`LIlW+>4S`$@TS6?2GcW4s>uBx^qtVQsxhtcS+B6(1d`zwZ2PTYjjr_wL#p!k zulA&3%_Y>H#o0Sm1t7B*r4=8$&Bz*kQFi@2oYfoc=H`h6TZQb6(+@jG^VhWIG21H- z*eY!}mj^zz)A>DX^UqJevL2v)S^E3yqtp4tEaYKV)Z9!N4Z98<^NKkV*i zbnBgTBw4A&BU^bFQssL#X*M90z>T^$;#X8l*%I)Gw>> zsnmfjj{0Mr)|FCjdZ4<-Y$vPZ*Ypv410iy}5oo%hLgr0I8wqh`fEHGl>oxrc^K{Bw z)Z-xo#Fpw~nBZEnO|msu;By(Wn+4^^o8o~i< zt@Fz~d$194<8Ahq^|H7peFm0>27RzKy>lvbOtxb||3#nwveGLh4x`)fN@y1Sm{Uaj zv!J%wdWSsW6&SiGKa}yv`h#VQ@3tuCTUiU~g0mpQ!g#fXCf5_~KtVWdX}himTfu%} zys_8;Ld>S3R?l;W4KrcP{p&(d+IUp-=?^((ZYtcz!u5DO_`FeY3aK;9Q6oJGuRIC% zTj(C6*5vK!j%(yun)?D8ZsBcWV^F!!Aea zj!mz$NbxPNGYT(#uYdRFa_Ez3tET)(v}WpIZ^BjX{rxssW5cmeA(-^Uvd|I({HEe8 zTU|++)i4`F@0~K~-NLk2o-g7JS70XCAY*%9JwAO||FZm`%0`X*LnTiF-lRXcqf#~< z){8*U--#!T>fDrqAs7zS{Ti3LB;C2VnfWMk6{;wv1`Yo7dVBq$KDJi%Nb|ojAOAus zQ%ZHTSs}f17H{kwIXm$ru1fcvD#r@H$K4@K91R%w#Ib($K`4Z1uFIWwz!dNX4Nv>n zaqoW8jn9oWzd8hvnR@caorpK@T_D?v<4T(8Q&v!c;cdwMJUljo(R;3&$#+@fwCXV; z>;~*qqz3dBrw8jgn2hQ*_K^mhiP7*C1;;FyuV{JBAu}uIhqF>2HTD$%Ty}M?_QaS_QM@x+Lz1wxD z^e4(7cVbBXv?BQxHS7JME`X!u#pQsq;KkFl;fRl_{H*e})3?}1aP6Vq%p#A^j<$Dz zi!sYu{~5I--}^7W&S!rSMTrqxG7>Fbf%c^v3Y09;gpJX%HGr45X`V)qVzN==i)+3C zjSlCv;!@R27bWQG!glJy)PSX^ZwXd@)K4fWeMAs8BmLl&EE)#4GXLr9Nlbek&$~ik zB$lHt_e(?arJy1Haw07O!ilWx)R_p4prx_HyM>MESD)f~E}y|vMS z1nz%U7_)Hu4v7*>^hPYb8VPGFtumT)${gg@$E15IG;A8^m<1Wqqz9Ss3m=+36*i1p zeLc_^C+cxZPE>?y`iSZSFIHO+T~nK#+RDJQzMpP)TUpylT3FL&ZCSo_>3UC02k!hB zp%c|zEW6Hcjt^v;E_C~1)(2CYwUs&~e8^nye6$t3Whd)fG`ik8n>5Zi?jW%lcUq{) zXlc=&d=Y)A2bbGbD(&sCD0*}Mo7~&#iBtUGszau}^z;X=r=zo8XX6$dG%he)V!`jQ z@N;;SVctDsD?5WR1BGdFO$mDXKU@mQ`hym>>0&{l zN}|rbtn-SWt$Ox{PDbzU%zeWkZ^J2*>n?nca(GvP%yfMuC4OQchZ}CJ9a`t~@K_Q4 zoI990F~9!YQrb@Z(spHaI#+CTq1^(>I0uI0g_8B5H#qE4bk zK^SLVXe%^zZ*+fDLT;`9`v>iO3o^R6+%f3__sP~iE-&bXjzp+ycDjamt!bOe!dqqd zLa~B>pH#My+VmR_|B+vNaz&4=__U{CJ zu%{d_rJE5Uk^VCeCqDG3QSP$_{b1jnEMT6kZ1{SOpFZ>Q+OZz6t>C*@s{awWH}7Ub z+X5Vqi$KXqgN$K$P2rimhDWpxto+Z{o$w{N;@G)~MU&kro02XafIplP+FS*0cx{X^ zXm7!bK)9g_Pc2+hos|DgFsl(J)Px5Wn8|#FFr!!AxO3GKvDaWq6p3q(>?$s;owfU8$ zzld7!dmLvs(lDnG7vHfRtOX)CPRH^;_^d{J@Q%AT>q^v{T3=^tVu6B{2H&ux-+i{@ znE2_3N8jM01GpsL7sMnQP3{Ue6W0+=_z0jF^oO3HaKvh;wX#3^lj5 zS*R5s48QdJ%`@@JILk0ZB!%p|SQG4sF+9;b*dXzOk+Cgm#0Q-h!j=*TQN8hX`wi`= zcou(nCwGGTYXht}oh?0DR*By&;(7Iqf@hm-qeIi=-ktZ&KF#qB9g<2~Ni&k3;R&Bi zr>MDACq>#O{D>@PinTKWz}u;R{fiV}awX!rbzOdR4fuTT?BTFT*%HFwuB5HWb zH@e`UGj!6tU6VpkJF%g#U@W*2@Oc_P|4NChX=#L&ab6BpzOJG7ihxd^@~M*65KH^r z5|y_r;j^R&dt-F=BjxX^onRW|6AXS^_L*pjc_YjtSI+d6S)0Mhcq!j@T6JS z*7V0}g01*~CJo~-wRMIx2q!Y$BuF}(9uGbyZVKxWT`?{wv#PZFD*fSUZ*t&nZ}~|e zdAaG`vMUZpDg1iT^-_Cg8AGpl28?}}N`1hAEDBu}JCAJNeWh@;jCQ{M`SK?Ft!mwq znX9j7lcR%P>XJ9<;+~WD%YQE^FyOoyv}+=*6v;H!8^8XkO&xk%J1kNIi3NKDSaA|u z^%Q({!qd|{a_jJW2u8*`P872QMZ(wU(O&3RS)}kNUZes0a1YuD#Df9eVJOS~C?(_G zH45&XPr#tDeIsm89fR4%g&^H!_KwonQzp)!L*E;xj57dv5NH@+3IX5igcL%m%#l0~ z^T@mttFMkN1Fl+}G45bJ*!C|+PQJx({+&e-ch-yYqy^lZy>8Ml#FHIP9%25cU>uzO zIxI6$<06#~>bCW*V+Us#8=}ayuRQ?#M-Rwz^i*xZIRd`U{iWESmbTTJx2_iLSJa`r zZLrw$+-)L><|%91h_@jX8omBS@PT#~$Dwf*mwPqUR!dAKrW|pUA4KDi-JF*YB&w#0%_jU2}6R+^xf#rXpC>0hU1bZ)i5hxSjL2 zN;7q7iU}{Z8RTtR)dpY6Yq^4@)f+iJWB(hP@?Wc!e->z^6~;>oh(pT~9v_%sPqg~3 zDZ9EBOB6|6oITwuxBb{{e%Fmp_LN{;h2LkUfLnNYyc}y}*X^~EPyOlc$FtNd$D!pm zpx+mGe0-;ujLA`xLdf{fo7j9pOaIx7bfMH=in62QmZ?ob0;c0PmKn=j?q~f-GZ=M4 zz9oLTxaUdEN&EBUOZrDGqUX0>8Ab^nhRzMmfds4ha|@1bmb95`bn?os3Cx_loX5@a z78&JRd+G7PwquoxIvl>w9W&ak8fL@HnJgq4W+pGPw6Q_{+tf`i7aW}Q7Y|3` zG=_d*F?W2HG29lTBGqS~s}cib;ex{S{%lqia2r(9)y8_fm66kWC3U|Hvm*9>OTXstU82zaM7yZek! zpJ0(}zMy^F@%*Et#Vu(_t3ZYOFfBX6ygweb4^ruv{GkRGThmAV+mi)yCqD|Jb-WT< z53It4Zbh$_(kRA%vbXrYmq`~^Oetqo`gR&=@HvnFL(vytyfct9;h(23IWux!_+b=X zB&p_D*#4zX+oggIO#pe6FF12?0=K;uzNXVn8Hu~X-?=cHv z+VLyG@uSA?YnNQ)Vn6WMe>`Et{rF)x+Ne)+ws7Koj0MMV zy0CcIjZG@_$yl{Oi?QZLmEBi@AUUfd>IoKO{+Oc0NvWG2eUj21ITsz3VOGCB%Qx{l z9zHz*FLyI^2^OeiIJPx;!qxum7#3%`_Y27_NAjbd9t?gFs*S%P=!qkG?P{1gJnz_W zn*p6yHdyDBxLBe{X$Tf?8%zgT&a>eDyS0pSJ~EKyJ}E#<1h&!UJO>%035QElSMFZ^ zsP=@8zwo&0{wywmcg#JENR?lm1F*tsVHQjVDfd{1)6h33MIC#u@^M%441FNbi$U$< zGTK(kfMagw-DQf-AB`B3iqSVuo~|yW>ZJp-?~A8`w>mYYfi)>$n5gTO*FmPfT?Y}p-0kdO&eKc1kU?8;beWlnjdo0)>9&+SmsJsmpg;L6< z(}Ur30x*E0jX`t(JCIMO3RyS5pe+S?R_r%#?|-hcZqdYj&(`i23L^ADiCEs`GwO6o z*5n2Jz+S*?04uYzhN?iJ;~i{mj}0$(TxYcdSuRa4NB#_u832Jt4`~b5EfQmLMLb#N zl}(+h$8aahaIkDot&_vvRv>yy_p~X^QV!xQgmNk^tQEe z`J)(5lez6XX(`n8AF>GdH@@t1WW|peE~k~SBp*VWlv48zTuiW8d4*&AKiIC8iX$RJ z)ZoRfX{h~oXZRz4mutdpc#DdH;1USk5dAwv0oTS;&vfG%sq-IycFS*wm-RSR3ESNz zXZ5Jc7~pT5k$h0~w#MltY^3(-oxSH3rh8&dY9C%R7#lUCl>-ANNCAKGv&3N1h2P1# zU{SPvVu7dIK&Pt=57CoeVl-zdV4_K&qqbXUcSm~WT3WA-RkP7XxyfflEa`?@uaoP^ z*wo46W*)w&tJ6|%R!y+YXl*{u46=#Z{PSz$ri{Kd$sZS<$nK~my85iV@~e4`g74-> zEvW3$cdPI-a43ZuH6Jj%LO0J)ddt+Ylfn!!E1pP3ZFL)mI%pHe&YecnkrDYX zEh`*K{2}4w8h#yWPyzL*)qg56`5%8sse3=hMDMo8+M~?+(2oj{bp`{(Y4!K!c(7Jf ze2s#WLHVILs6T&q10Lfto_*?2a1E6&5sxnM zeUL=liTZHmCXA5?se=7E+uly~n*6iy1TM`~rc?k1wM02^Q&%KaI5MSFL0CZo#ejdN zX{;(`G(;K~7wlo_WV+?}gx86wm*D$tWekHsRRr0J#Ulj}mmICJ3|_K^PGXDdwv)1B z0}$mhu=IswW3>tw7!9atrd4GQ<^^uAA0U=0xlvbUy$33m453kn!L7aLUo?J;al|#y`L4x1LTx%bHL@yB8z|fQ8 zsBenF+QgPhqQeurq}PhlqthA2c48RZMD?Ar>Cl*im`2>vUwW^l1F9mrry?6zqgzRO zUg}SZbSD9Q1aDEp!0iWiq9OKu*jC;qh4`fjdNKHAwMs>qF6;eVs_No!1g zxHi$c4rX7mvUwO)l;{vcT<3mWJ6)`fd71Nbd6(oAym;>{)QCE`)|Fej@R9cvOR!*| zvpnBIW&lj_{@gi`!dwz8K77<9>SLMKPD3*FESpzFJk8Z(-X7UZ-0WOw#KDx;b*3ly z?C`p1Q%pUxyxYCIgZIq6J;k#_oQ6KDSD(i58p*1ff;el|mU=vpZ3ck#96CG)~rTNhdXcTG`fU$1eo zTj^)vx`V)4NsGR=S2t}|i`=sF52LU2@?+OT*zP6ow#jiTMB4w(fzGuRz^nKmROs|` z(ZH{7pOzo`K6ASvA^U4y_DU1SsDex(8sR*gH7XJX}zFn#Y|b-=7sJXxiOjCYkIVPcn?oT7;LdyLo$A@s2IxLW!mtqGwxfJLrXO05G5dIvq^I{8 zPwiQ6a_Kv5fecf6p8;Ls}+Yw;jc%7~_?R4&>jhJ%3+vO}Wt^DN6K}5RQA(^ecpQ9-)=~!7& zq?WhFVK7#)VB~=16A*KS#+i z+E|~lU@_) zX<0>yz8Q$9Q5m7PaaZ|5ng5a3-JBz=y+{RH8>a(|mlalC9r!ggI7?NBdIKQzxCCR( zlU}bq0J#bOnA{9TA&ia^a_%51uBakUE}+(w(1@~h`T)p8dK$gw6RhCJF98wl17a_m zRr*ES%qWrmWoJ*KX=^}QjXqF$;M8eNEAPW_HJp51x=c7qV*YI@sof~u;!;+s4U0A850q5NNJ>nm}7KKMg3x0Er&aB@V$ zFmg?#y4>umy0AY>wF%Y&yAy@vreohgFw1L>yO=i#@}Lv64$X@kNdJTK3FaP!37C?gXKK7^_9~2QHmcJ_7)f$Z|BQ@rp&fnYr%l(QS{?2i zPnU+{^JEqZfNsj#qHK2*EWrCy7)MJzjG?Qg;5xc~?Aj-pnNR)yaQBvRReoK&=pO_n zq*GE-B}BSAR6sx)79b(L0O?qSbcaeeNJ`hDI|XThMGHuGBYEcXdH092&%2-J-Cxh| z#|Ok4n9O_5F|KiqF|LvFMx()TNW@*S^}&9@Ka)1m{~-0RF8fBg-kE;G987-25SKnS zs&emogO1@=kcUw2w2_K9;<2;F_@4rIw)s@?FxT5Z!JZ99Ux?MGOTXO8O~bvX_PIVB zYxS zHGF9J^%JYVem!n_fKw_17zh(J=XEl8M0<-(y&R&0^58WDS=09VxZMTbiut~_9R1lg zC>NSC@AT;hg>P)2g(5sFiXLi|56Ue1due^3XD@Y0y4ZPA!~$1SY#Uzp$A0&$=cBs! zE*^B&n!NR%RMiS8@t08t(~`%{@BDe#Vo|Ge@odBm4p)O@(A*#Hi@p_@m_BSfUED#S^X9EG5i}{g0vgT+TsFxywsztB$eqa?(6Fqc;2CcI= zGdwm@G-q#2!dw2FU!oyc{9A=2^@!$aYqbqErR$&Sq@$kXnj?))4~MY$7@2`@<)-Lg zYgicRb)M^&jN+N(CK)W^4+dF(pM{XI;gY}`h&fnjsgI+{gJbK)q+e1*l?fP629(U^ zgvR?Q$|5}6H@WIv_WW{Q+v<4T#hZ)AU3}O@OL=B3c)TwjQd>|?!gfebbw}Gg{MflT z8!IwgIzSG9KP$Z_|G6g54b|&Za3v6yK8j$coho8q-{5Y1KNuJHITFWKxf;oqX-s-o zX!xF`cG18@E=kO*;juo}YkkB6RMm1I zG^QN$Vj@?8OmMHxCkHb`2`R|%YYzB;j9Mz%t|A~UM_%zm3zyUFd9g{8GQtDsF%H&T zffD4Dz9ukn*Y)IV2gGo)Cy(iNw62(Awwi_M=R-}B~#m(T`^19_JK!Jub(8Z!co#C8C$sO8$Ct<98g2Ul zUjD|JlIxW*EHBoE<9k4fjz{y)(e3-YxfB{TO=j+F9x2aOLWf_rG9(mUPe7Pn{53Tl zV*k0O=^~|VBr;{S>$TdC<5vT}NpODG>G}(Ta9u^-6#79i+e?iE{wu%}jJY@}3Zlvx zBTVBStPzDu-Vm}O&QQ^j{L4>p5`2{ zrQ+9gFZ97PjaNku5cPH|ki3y=Yeyf?l)SgO(A)^C>+6^t$&yC5RJXtrIrv!k#}Y5( zH#_5ptlZC)=u23eDi;nqI^SsqT5LzENikIMFM%dieBxlpE^_ck&L>{G1wA3xJ*aCa ztj6)1N|v9V&&{d*Y=}$c;75|2DHuIw|zvh_bM$%x5Nt7zEGljvl|l=n+URG zN@t*xBPHjBC+%T+XL3qU;PCxW!l>69`dW`j5Y+uj*eNprR*xQY4ExF zu4bBqC3;t+_ZGP6B|_d$WEL#rZo6tJlT>Fn4K+DM{RZ&UDfO>ayz>PvzSm=AlA?uT zazqDCJ4L)j-{V$q#D9O)C>AtYeh&-jD)Wf;!#C4?wWWIS53dFydA>=f90H`M^#*1m zAHLpBF3o+q9ZmD(4bP#)+~FH;s(aL|u?qD@Ul~DiZOFOlh^lJ$<)(g7gPvw7TZ7ar z{Y~mOi|M9h7MH;bpR*yfz0#%IJ0eWuVYAoLgbFbsOkFKR-!N2#YhqQcEiJ9{a|__` zZ@YGw-qn+nle#9XHQ`M3e)zI%bnyl98$JtPJnhzo9QV#d&g;*`hHrjspNg!5kZA3P zdxm4Hx!I6;%L=-a{$V_?aO!S;vT(n$;Q4^>&3uxyX7xtXDuK6d*KxD9jmiGuR=e|5 z|E!h;gF-p){A>#P{-YJrGpSi+{`rx>t6g-BZTCHKmdCLScMLbgt{Lvp`rT*{1(@&S z;f=2bi8TvQqsiJ^MCth)ZI^I`c^(`C{zIB%_%!^{uqqvmO(X{sVryMg{?;P2+adqY z+}-3*`n4TDLW|H<2O6a?Q|py`g0OSrur8fGTk)-#{E%{zv`WqWMk{hx z)sKDXP?UqB>sXg=G&hdntmib_XENBs&Q(X!uY`>yj0lAQ|37??nXTze3?uwZ@Uios zH&zQ91xmto94t|DKVxze5(~ri+9v@<_v2$^xcX6Gyv_!X{^5c!dJx>g_=e1G)+3l0 zYX36OP~WChlqVaL}Aq*LZum-FfUMz-GNAMr5Fq9@2pC8i(aF zC(l~)+xz4zZQyUk(U7SkP_x~54^QO96NFT84TxTde~fi$2ckjjTK?n-0~F>r#TH=b zMp0$WheDQ=0m>C|4=F4?&Qe!3m`S0Z*0O?Wu+Cw#Hnq+vcIms%@~GP5^~K$78#eQd z8eUJX902Ipi2c0oF~%)c=q_6`8bmI8cL0tBZ*a4Z#H{2}SjqoA+mD@y&w0}Zv+4Mv zNd*-WDob_pPJdfFZXDh~d6U{RfpPA0@rm;AXO%3v`f7SF8U!2mb~eeNE|vtp0jL*N zZm)IAt#hQMt(kDx3NO{X<|Tlp@fl?ck76gC9nhy)YjNx_MO#l#VDH(w-AUJ$kjzt>@_S*c=}mK4R7jHZ$C1VFq?MMo}T#Z z*snL4;9&=IObn;B9?8RXCdbg^O_`JkNsvdG^fDV@9WH@^B%l`vN;h-`uyq5ARd!Mj z#i|LQD|P0fOz{{>d5QWFmINzKsSFG7Q(RU=zu)9TdyF_RWJmqHFvH>DTOyjW`#8zD zdNL8G39Z-NS-6Z;z(v{qSxp%3B*cavwD7#|i<$F2GTVDYqmq}|X-$MuK{}3kWSC1g zWC!R-T$=P{9!3376>KAdaTfZg3|+?A0;1!TNOqDgESS6}fla;NWpKzNMKt*6-RknY5@7qqL5 z@p^l2inpA?VKd6?FAcG}OPa{O9XCB-UXO;EHam0WYh3@F4WThO_}y|@COi+*5*`YV z^BnAG-Vu$!Iitx7LnlJ)?8tiX{~+C@K0adItF=>dN$@B$eBf4QxMoyT;>UjcPdv-j z@Ub79p}CxWu$8KPQefDsAR~z5RK#qVzcI-8;kWv-SVQYrviL|Excpx1{vTM7woU6k z+tSb@q4nmw>Wm-<$NlcoSi|k&(6YvNm#r7Kt6XJA@?ayCEY%z)!&V{}4P9yr<1-)j>q}H(42$p|b%%e%2>JIP60?|z5{0~i|2o*~HJ*u~ zIFaZ}$dPgbs&_luW8K?G3CqOphx3D)5SzGK4y6Pd^D9OKi);(ZIfI)dz6n3U66rEU zz+2Km(E68YahN`bi<6(21q==+#=GVL0q4W$~IhWH9kQp`F15KGeRIV86Zlh}WKU z$_31ZyKmsODODcSTdAR$bc`ZS0)6X}B4iK7D%gIF8d9n)II@O;Y*i)FzVYp{?;9j922Es};{Tx|~(#-JNv| z$B7o{V!)sNPQKL(DZk}$b9e0%Aiy z=OtoHG&SBz`Hc>78SV4(htHyaJJDPbWy$`1cTNhrkU<(ZMB{qu=HBT-(?P5$(xkfY zhBXUzkE2B`T8P$W`;bks0K>amd6B($$-CxO2J3Y+aQM+#4>Mn_enuUR32!-4TtDtz zF0?8pTTgn)H}G|4zyTei*y}NZ%~8*K6B||k(c)zLk>o4#<)(zX{Gc*}v7T4uaSR0{ z{}E&m6bPY=S5z~v828GTPf%nFY&-=s6> zz$WR)0Sz$^qIJ5+u)2>{$fLS%AV5BU4(N4l@=d@0Qm+40Jp9QbaM|N;l6juFjfMFH z=#i;mJEX-{sQ-E?1k?l{(@3#_DU{;pNo0^;OQB5%4mI7R5VW@xG;Kg7u>V)LH9!-1 zG&MiQe}XV`HyyTD|3PG&f?lE@i|;1O9nrBeZJMA@+NBzjhrx{Kn4JQdq=dLPA&r26 znfqC&rau`Q0?G=k53WgIn^KH{bx=TXN)iWaaWui$!Q`vG@=n|VVdZ$kZIBRh%D*UN zSwCO+tR%36wqKkNS>Rm7f(wMe%;xGJxZn|3u~+>71<<>-98b|Alv&y}6~EeS^W`r6 ze#39|#k@!!4T7N`b*9!Mdh(sE_A~6Na777XkM7#RN;EgIKUn!LpG|m#x_*bt_S0|o zqTg2F;MQcF_Z=U2SeujHs~ETPwi1)kkA@K_XeREUL+&*_E!6ZY*>3u1rOc7(Fu(5n z?g}R2N-#S}>}n1pm^Tg4zqWHG;ShnL;Dyw2pZ3!I`cvQfFPH!TQbVOst!@=N>x$W%IM8i^gVrE6n`~4%WG=_F&tA{EPv2i-ul1pDDXuHGyP9 z>y>oTIl7yKAN|Z-)Yn_vdnUtt*798`i(bRKJZG}Cd957Ea_6h%WWDv`%{NifF)q>P zaN=NNzY=9Q;>T%XV@jh}|COyUhqkcE2-jYs-S&*_43`_)b6kS377CQm)3)`sgAl~aYu1)cd55{kgrc# zcfBvhF1{%lS*;K2#(+hnaD5rO_*J>a zKM~oo{~nlt|INfgQ)C@UE)Jt+ZP&C8*-HF|FX7pBua7tgBNAWtFc^`?9az?^6^)#T zB7A-!gyHFNwv+TsF1#$MklNnlyaSs}h+|BQ;soAlkc&Ufj22OJAeKusXQ9^xX=j zs%s8=C>yC=5bgS4&L^%f^+FE5J%M65319z30v5b(G2hLI#8k>H@B357 zL*mdd;VfCaPuLCY7f#j4TvCd{x3|y*?k+D(YL5{KQht^Y+ev17^=IvqiX8tmbk623 zzDeGpIrb~TZ*X?x$D!VFxgJV=Cd=VtU3vA1Ec`LKF-t3V{N6sUfrnvH|0Inc`&3QQ zY-XFf5ABuZl!4r1RmMTGTbf^?#hL)m{8`4k8TVS-zdBt|n0$WI!X19Ib657}j%zMq zJJ0i1`jKB1epB7{eU6Li@A<1212@Eh!7!AF3@zTdFPH}9@M8qo9QLgcX?j^BYzRgL z=}{IoUvjilsP#O0bY9mwJb!b$KBd>mEV5G^*v!z! zwI_yT{=CVxvN6wlXYXvB!FDtMHDjXTz|r%XAB51z6H`fTm%|v6x#$~W_kb@=h6n0- zb|_c4bzwC@y4R~D(wVb4Qw%OIvqwO5~Sq*`F&=S_`0;kZ6q z-KOR*#~%iz?H=GAuBh8x-L03c9B3KfK*tNo-;`@?Zejz&CTwu`;BIr_@Vt_Aq2{S8 zcvTld?xgPk{y*HCA2_-uqXj2bQF@#HG3tN#P|-*2meI-`Qr|&XVZsF-B;%&yCoKd` z503D^prpRC$2tL=9@;w3+Q}<5`uGOe%%T(8MFnzXg%O3sbDGgnAiFy+v|YTC_?Z(I zBLkm@u1yLW=*sRL@PO)rMBW2-855Ahaark&#xtmgFL-Rnq`mPcU-trn_>Cy{?$>b- z2{2%6;j1N0aT7sxrk7Wiox9#CdL?4PX+R6G>-Zb~Kx^r8+02Jz?>sB2Ea};4MVzK% z_4BJ6#*DvC>t-L3G=$B$}E;h3Kt#)^OcD`kjf_<4a^eGeKveUY( z@oO_#4t^8<_InNsL5oe4q=f{0f;65bjdODjdirai;Xn6wVDRuCV)}uLspo#|`@VLs z7?oJQlDofdIYBMpzd457|VHVpC)CzEJIxh#( zyUsB7nw;&uGH%>=Zk#hr2ETqTVwWG})RYWITVFJinXnJVI=)Wa8{c0N{lHnXY&pQb z8Lmz6_a0Ud%d zdHv ztH)tmUP`(3r`lCuF?=D)&D40oG7sAFdO?)4eG3B;F9aq#I1Lrs>iK!?dxgGP9^9Usi&t zWDnX&qwGH1R*fqOuTm`ni@&vJ>7zzy$Rg{lZe3g zDy#}dR;wHbO^|HCBX;xsw#r=X`1egr4*XkwWI)LFK zieE_P_}Vp-4S_y~J-{Wl6!YJ9kz+;m96id>AkRLH&AyC;O*e}|V%tvKD6cku!OzFj z%tCGD*ZH1wZ+Z*CYp-LSTF=xd%~nro?kwvook`>SG__6>S&0ScT z3@m!+e9VZNt=d~jyDu#c`$JOujf~~SepM%Zr(f_n>tKq(T-Dwee@)!0^LO&F3|5U^L_osiqWCy!j`7zh+gyHoo zP1;;I+u~<32cNZA_jOYj(IA#OrMm7Rv%($*V>fZovfr|v?a~GgF=!A>e4DU;AMt_z zl_0?&Cen}VZ$VT{5JE-&*Liof0Fj5;QuL5MJ{_4EiANDepPcv z8xt-+I_~|SBZmK-xAe_pP*HT!z>=#lVFDqn^40(3ivMq{QF4?7=cvXr^6scO!y;nQ zU9$hcjs7>Qv=I91@C=EC0e)6JsebowX{rAf8)k0)eTRN;|9`X@a9zI=pxIF;yjR!x zHSe88ANt%LXUv20rfruw`MXKREUO+i#WF{rlcoWGhS{3#Is zH+2Fo(RWK5TVR+5UN4xPK4()sDwnj$c6=cO)dv;BQStu)js16UO@qM@HFxs8_6}ka z0}iBHe%rSESyPDx(@&ne{b123t$PSp5(5N{f&l0x|3pVS`|^ELy6tR>CN^AC+bHmZ z@y-7riSYlvD86i{%qpShx%N2R;bIpiKxrJ-K`l~EuEaK7;Z)X)r+coH!YqGo11Nr5FdmaVN@2Wv7XG|lQ(kKpybe>MwvYH=dX~l+r~FeS zT0VXJ7^Z=@C6o`Wo;60FK}}F{6aflB!2^`(A`g`*L14CYr6tb3@&0s*0FQ`*M<)Cm zhMu9)k5HgiYL#S7HuWaH=*B>}G`ttL2e+e^X`+&dp!|v&yO>!yeFuy|+s{)<+iC&% zj?Y@NwRZ1nfex2&Jn8Z^+t85dEL?E~seW?~inkjdahqv>p5uCxGP|S&rCpW^(51Ak zGqSDSWuP}uuC<{(i}eIyW9hHLf#va&znAO$hNBMsYg;lQfeaS?$Q+tFo%P;TSrM6U zlnhui!#sPO23m5;#~lsFMIZfU3@1jgWa>@Z!eZpZ@5_>}Znw8&GZ_eCnzvrLDwvY^ zt}#D`P0XFQjuj0PW@=LnxTQ6%10^1L<*XCxk00mFiL~h^DY(rPi{x8Y;~{G@kob40 zpVC;POhj2}cE`bRv(*+b-;~FF!Nrqp8)Q~8w-;M|@X7P8cG?8e>)d81EAj!u$B6`d zEcBUJIfyHcLyvrvAJ0Aj;`+xi8WTA>s)sKeTY%9*Q=7&H8(ay>&?R0rJ zJ*906v@kiSp0n8;%2m`a=SI-_KyJ^7N{x;M4nbV7DIgOLc>1p1uY< z{%;;veymU@mD)Yq!0y`v#sm*O@lK2RIPXfN9Z4hFFrgI+CQ!OAic;DA=}wxiUly3G zTCQ3iTNyJMH(B15+73KwOP4Q?lhv~aXO;=GKuVMF6Cq%nc`(2^y4oGy9)D1 zB4;O^l6)r^YxIj$=RE;GNdDzDQn<{f-y_ntl<&F=gav|kS7byBAyGu5NcqU}KGMra zT?nj95WKLp@{we)Eha=@TXwF#j)i{2_yJxXZ*brwa>2+eVzNjZr-UYBhzk}h$X3k^ zZa4ybC&kq*kJP4Osz~t>Cvp_28VEWh)(gBr0!FB$W zBIsylpqGWyWwDAihHO1OzgoOoh$QFiumRNw?!7nH>*B7o-WOTmdbD0G;rVRD8+dF= z&5-HDr z^9*shmSQ)TpW(d)3|m|`1bIYE@xkGJ_)4B0{1y0U$@2!IhOa0IaO_RgF~E+HBEM4e zPd4)NASM+&*eR%;s|zI6ed_d{mo1TnEF$Wq&=n7pOk6t)5Z?z6OsIc!t^hw*g8`f+ z-q`+E;B}^90&~gzODU!~RCAeW`-}{`dhC=&)PslES4~-T0x5NnrHD~L3Yxc@j?%yg ztv%2sI2_JeT>&<$0Z>_4BYRC3V4Q8A=o!L<&K9Uvx&%|ZXlwg`BD*;|@8gv6sNfP{ zMB0G272QY3&6S(ek!sV;c!12^JYaOG7rNvFnc}rON-FzV1S?24SFU&5gcEFLxmd+m zhsJsb1oWGflK*a$6Jk7%2s-a`ce9t5V(S2wB&$N1Es@h%Hg+((csn_&V}T-T`t_Mu z2~;;s0*1d~K~f3gvH_i>C3`Sr{J!g_-S)g1cjJ_FFsF5H2}FTKlzdQaTL>%IloAHR z)*CY-E9F#yQGHMqf_q+v0SA+_cejgo1I|OG08Q=1NaGgPC7wV=eN3}l_ZOnP zU!W6MFr(H~YmMiSP_&wlXuQHQ%CP3-Rwr$-~ z5Eb@}S%@uh7}1MSaJNKB%)9O3W#+@_-P~n|3mzEoi%4qcpKk?+^^sF~A%O1ajC%)K zLjQ&-+n_b6MR+6A-%2sZIls!BPQg%v<)ttmtG=dp;26@3nx;KbA}jmCxA45$;3@Ta zLm?W(ZSwNFviGtW=u)Lx*LRujj-(Rgs@31?AND@0`eijVmH`Bdju56Vs-ak@)Fo0q z;W(pyfpXV_V|2)(NC-ivLVQArAGo-)7*0H}33ySOBah2-QeUnk3EGXdgVAIR9(rH1 z8m&k-4s~X*vCC*ymSwdWzrTb_i7(SndgVwub&jGto$xvhe7i`-c6K;$KX)=#IR0Mk%%kCj9I3kz&K z>=Y>1jq5vnXA&e%fmVjjf>Y%Nn%X@+6)#xzYi-Q1Ept>t4YxPGM%%u1LWA%H8VUN9+})nHW{H2CUdBLnK~su( zx@nu|J^-A++QP1C8Kx2PEQT^3|O!0`BdF8?NkiTZoxlP)`=OOLjCR|8qr0iTu<1 zl+a%X@w%3;x)}(e8uBWe!uNc2XNpevpR{Y5yZJfc(5na|Z9+{WOWJF&S=@x+s7^eZ zP2RmxOg3aPsI>JfcKhyeS&J|ZuW=<%Si3{c>ZyP9318){oYeW=yniVg%7pI&8uDc& z!BygOAgLG(4q-n5bRM*t>}?g5;p&VAng2tn8-EAfmt^_c&&obdq9j06Hg6{+SUWYyq%$y z&!0!G^j?58knmh5XEz<59+;#w=h|{i%|E5*nETyvb~TJsg?1=aklXdIKWK2-O`cWK zdWs#nYZ|Z91LQS5>*ooft11?`uQ7i%N`cPNYD05mxEl;p+W;(o`J`lL=xEVbMt=8zxmvIcKiJT^Kwz?06rvSXtexa=JH5Y@2 z`(MYY|AaT9;nltI*_cUG%U9OE@@wEXo1_>en;&C@vFhdB(21TFOFj3iFp0P=e*yYM z>i{V~#n)L$)%eBrUDV53bb-PIUALZ1^mh`KkE(9XXnnUlAKANyZB-79>0-g@VS{nJuE z$n^uLn)$7ta^_Cf|D_|xCBlW?85bS6v`Zvbkl)s_r$n7S20$;!+kOl8XXMyz4x8$U z<7k4C7ltsh?qlSgda+l+%-1>_tw9eBU4zRiiwC27*~;NA7IQ;y#;qY}GLJJPN_I46 zT)#|^R)6N4Me|Z5E%xb$+q|A;-E@35F{!w1_;a%$IG2w79dv)J8tVF9xEmJG#&xqo zL(uzKeBmYBR$)Q(6c<@_el^v4OA;n|HQ%y&vNO$nl7vgi_hT1mN*ReS7Mbk6uBaSO z_;hBj?V*hve4RDiwu~H2caXlEB)XPp;;?!FKri_v2lQKaoR-1#%`#bQc_)Q~<*@8r zu#T1zX+!B=$p6irOq0kTDEzeYYQm(hd#`69zdaU zZr}U7F(x3T9d8;HuQ69zkJn-(vwXX@^`-;{rXjK=2?KOGA44bYFkAeg1WCOl%Jm8L z^?Oopu9+(wrTlG`WFpshd`)c+zUW~jo)&D zZ=QHS)%wan6{V5)B5<_=gJO0tpb*!t&*Ywq0tup)^h)#o!NQc9>CivmI+pXg9{PP9 zz(31RTF-rvURRHOmt_1@4`4IFEe5#=jMEIguAR7|(uRHzJ$lt|0GYc*o8|oTiZ(my zxAB2MAzmCIdW4)CcC<5YRaCMjKto9qJZsxHIPbO+Sr3NH$<>4Fc4c%0@D^Sq28Fl1 ziC<7L@6(r2RGY{I-rS)R{APvr4r6ub8=BhGGC2h+)?dgA9KI>j@7hQkccAU-(7_5t zu@RHAr_){pA|q_>8+~Fc5!?>5KL>8lYFk&~z}Ws8$?^gFxfUR@ljCiA7HBgR4m(6n zqIWe|#!U4Axj&rK(&Fe~;I3tc;9qW)eJ<7Td#h}H8?qyv7;x=3ftfLHl=k9c=Vur# zZN2q42Xg6XS&u>s%jkZ6MEA?*QSUT>qz?n-Y74yHv&FM^qpCqZY?pZ7f9%~r#Gvn~ zZ1}Qw5Y*C1uM?&PqaA5`oleY4KA&!r%MQs!N zy`c(Fh9aQXL`Kx4?ZGbm9C>%O-g!-=d2AI5YG0FrYSxSLn_ltT(L>5iG3n+W)Zq*- z?XGlc;6>o9wVoh+=&)NT?RFWttJ?Zj6tqZ?R$dk^0?))SRt-r@nk-<$d242df!Fx#lj zPfG{_Y1W|Ig5uk3-HD=N#gig6SE-mF(Fp0g+Z*W{I}qT8f310rN*^Pcsd*OWF%HPN zL{=0jl}pYsiN?^|g1R?ufFTS<;fjaXcs@^6i?Y4_jc@cAK>_K;+2lv|r7;NdRIA(feTqj>1DEf8Y%!YG|tcimlRM%p+G2U17a6j$3 zTzIpMW?@OO%Gmejq&C+d%cd2{=hrZRZ;P7Ri9T=Xr~6TvRJ8cWMX z4alXQ)icBvn@hh83)^@rTNbH5$+FvJ3&pednDDyi$K`PvlSqas64WyY2=&iI3tRy4 zkfGh|vXkPfA*)gIHh#JQ-G}|vZ6B+7C$$+KUVu)87{h^$AG$N#iL@yk4V7MjV>8~6 z9)MKOdjAWlYRZG>!kXGNq`2FX<6F%Tmw zD>>OTpRLZ2kNy~-^Ok&7j{Ydnj9#S(D~S`y^gui%zM=%;^HA6OrwMN6d^r-^iz9?C zeQz^>x+ulF#Xa_6d1&9(i9)?$?{@V4iL|*kRj*LmNg+F7oOacw%$1f#*gMceK(Frlg;Dg<<6J=j3vQ& z)L-VfW!wS-=saUg8~D%|yF0+$-9&OXO^gx0I#Y_#p`z&p-@jZN<3&(sRrQrh5A-Ad z77a*wV8Kb5&yDq7wx!ncbdU?BmrBJ!*xBQ>Jo`r0oB8piA1C60sAqwT@8^PJ^KvsV z+hw5JAU^6RC|X()BwYm*@aHKPZshf6VMb(&b+@h5`E0xtzkC~x5^Uo>MXwaO%^kw` z=mq(MrVpGRi>T?G;a<>6CuGj8S{!+`s&ORKe1%l9_|UYXgYmX#PnsbTB0~>01x9GH zl)i-33E*a-uUD!Rd1!bvr_#1RaAvri9YYDjfFun{13u(&3es{IOsur?>3ES8nrFK` zc7R;zsp51pd&fUamD4VW4=x#cpI__~ZhGA-9JH&Q8W&cB$P+LAB=xMFbn*R2&B&Cc zKc`7MY5LMZ@f$<9pqXDdI^-lyHF|hU87Z#RDdA0d;44kw#1(MS$anLtFou&c`6gOO zoSScg8{tTBP8|=S0mPHne@{G}RS)`=sAo#ZM#wG5QQ8o5t>2?z_^_hnt(U=-n~5&A zH7%0a#o4U26Nt@!S{DXy^B;csTBxyjtk z>E}(7!h3Y_Qii_zA^8;{tlK#p;Ba`$b$^PETa!;PvG_5wVJkz%M{)H;{Lkys^f;y# zb0OZ+c~s-DrOx2lJfvMS{YyzYeuTfJy13y^PE@jj~I`zqe=WFDZKkfD7hbkY1{S%h?c%NS%elYXhWF?5z&g2d|_itw1NR-dl z&Y92PJq=yWGVNtTns#v66P}6q9%bRv#iPrm*tXuB8GX5ZOqn$h{7U3OvRjxpgOEgt zey^cq6Z81}s*g9J`7Ez|&JlcDDsFw*^Su>^573XYjw3}T^&AIBqGg+(?LA<4Bc$4t zXvk{)4@0Y^kniSPPY^dbfs1{NA!}aNso7tu@Kt&DOLCF-y5f90?o+d|r!E{bm!-LO z4>_CBMQF!sNrKh!Nrx2)^2Zy1z1l_E1=AWj3*nKVOr>^yt{MF5&}9jqx;KwPY`!)d z4v`9^M8>k*5Ie!qVru6At@?K6Z z1|yO(OZPg{3BKPZHS<78r1j8E!d}EiA9+!)Mriy>hRpJdX(LUq&866vD+6@lt)I{# z4>z(!mBjr|KP8o-qr6zm#;h=8-BVai!S%XdVHkdkdGt$|d(lTHSu^mQ(ZJC?fomk( zW;+;M-K8Aa+ufF{JzIb;o`251ah-Pj#8l4W?DBsmhmm)bog(Fs2MgnAVgfgA#LiNC z1U5OP0*m|MhJhTVj(O555o~1Xp2Sv7Rw8-lk)e)adE8LofcvWqrIna4mOd>%_NPyI zhQn+ooslstFZ7`^cy*?fF=Jarkry0G6B)$?$8p(W8pcXcv14&r1+9 z{LaQ#qx(jGK*yFYoI=KI%qDVQx9z?$w|f#K#Ky=9(wBmV;TgkSLBY^SP_|^G0L)&d z2$EUbWkTqJn8Ck5q-FVM(VI(@Qe;8s_ex;|Twug7lVJdL8Ea>(>3GQcZI*9$uPSy( z!!khvX&KTn*&~0z!w@6G2y`JV{D5(H8{a6`8T*R$#JVrOPKE5tZe93*WcqCS1v0ku zF>_&ycc*QZl>S`c#jCY%MWy|+xu*?hgi!mNkeKBd16ufQ<-qd+d-=b}iy_Ak2gUo$ zx3gdJ3F#D7xD!Y7$(UY>zzss`<_m5Pf=K%kC86n$TgOdxj0ZJPZ1PEeFykgex0*vk z2^(Ujow+^y=~%ciFqCWB`{Z9&$COdQIUCXd6ce7=Jyx3hDHfrZYhyX}D*x%%2KJoR zEA_tD^P$lRlYFanpp9gJ+WTTDUKT$hR}GfqcMjlN6KRh>=H^JAp3{*|TM$E62s*u` z*XWqlGt{)Ck2mqwoEz)_MlN#gn=VX|j^TNcE>60#XTRM^K;I$r($Q?~d`|a^%N|{E zW1#ZJB^7C)PLY=@4o+8o&oiNus4Vc}US+qDG`>G!0eAO3G4f&}7!wl?=t7 zi}uhE(#HHG>fFY2AW8LrgjAKYx!W3K?SDDggUM}VbdIOsly+5-EIPPr z?q1okA(n;1n%@F(We z*!1;~h&Rz^{;d7@pd6Wh;d4}|>mE-&{PY8=$CBFiWe6$SB^U7pC2ijgkEiToy z7^=h~b4V~u_(f(yL-89?*2jF^QNXhUH(-nhfif_+L2wN$?&DHDwI@{pNfRuj!P#i4 zR6+|=S|?pj=6Q@EL2d||2U$<^puH9EWw@#FNXf~iMLBSEXzv^Qs=_ef2M2-WbU2#@ z_GjFFxEuii)oHU7FlsKAqi9@Ox$qt}s&3P#nlEdhhuR9}p8`Sca6lomP0DJ{>o0y5 z!^^5hFXzt8X*-&VC3I}sG*~YC<;&`#kaXR*WIuKxu}4r7UnS+^AzOR4N2e6ElA8gw zD59JDVtb2~A{UX%&w5esMUlG^Ke&I$ep^=SRGjOKg4@TtR&65P~#TRPSlLPlj`-jW34NF zA?Y$P`VA7mMoJ?2LmTM>`&2t~%UAh^rCrhwXn)&(#ve}if3gO`aSqpH-JeBcEk0%# zVd8EOqmAHbQFxxQheAHmX4s%Z4$OX0seRW8X(h<3a>_NB*-exhQ1yCVgAaA)6Arw2 z(q+s(IY0oVTVUa+%y z%L8A0c99c#@ukVQozw>R(ghn`#^msyYpKl{?uGPlHeZdx3fR@tHAS zcA{6Yggm(AZ$rRXUa(?d>#8$7f zY|<^rGu#GTR^t^QFrYf??0-f+T7=`_h4e%FvzlaPkm=BHBznE4W}GFwn^Q~xEflB* z*ydRuU?}r{Y@3FaBNTA%xfOghMemZR&`LyLJA#us_G!UBX#*poIij0S@TLuaze+@Y z+FBv_aX2o;eYy`~LO~l&FZLnvQKq09ie_L8MQ-!Kd#KBfufIsrOv|GtWa>ev= zMLan)-&sTrHYpR3XNeab;`TATJ9?EcD*x`a&$-URpD{Q!Y8dEY;@fw^c>CvtMHXSZ z=1fcEfcc+_t`yNLwysv|@Nrc%Az>ttKk-Vb?Dof54tC;uFs8As4+C4gDtGmTgWKo@ z!+pB6IZ$B9TX}L(7Af{dF03FZuuk4*K zZDu&#jFnsefXJ=pWi!_PpqqUu5Al_lwxxkQ2Wna*a`$$~i#sw&u#YCp&m=W>`6~QHP1W?Yl*y*IPb8@9%AW6LBc7H{Z@C;g+ zBTl4T`*U9>c|1x0hx>c(A`I$t{iZ4LmXQ={dWx>=9a&kuP7jjI-y&R~nhnL*Sh>St z!(jtL%E%Ox&HqX!eDS`%r*?UyK5|wFyW9Ikyqp5Th9a7k4xIw}=ZfG!hon5}nL|5L6a-M2 zb<`ob+&wm402GtMrgp`rNlTiD_$~!QCc539%F*2ra$0gMOs(;g8Bn#9D2uc`pn+V6 zT9d~BDS|v_W2@XwdKUdQsCLmC7A_}W`j0pIAt}v$*E#!M0bL{+05Er4bM{imO^7gc z;`0Z!3zmj5WYp-SAmCe$_H&6~S37*N?6T#qLzhk%a&x$`2BK7w?Fi)ozbVQ4L`Dc+6*|@NkIMk z|A2boMk{Q1Vkw1P0O>}!LcW?QEv@3=o~a}#(91IAMlyjcOb9<=TD1bmp(H2ngvS(D zH&!dGXuaD&2FyD_JiM$NbLcW1Ln2t4zgaoI5-D1b@qLd%!)-wKVJwKK4KoDxO@J2R zvsp402t|f>r{X!tK_n+3&roXN)Cifs8oJaRKgsaJiViH+-|j9?YydvBqC;#!UHUKK z;0Vq27PrcQg)h{*$76u9iNfppwpnF&4k45xlBPEQNoT0u)AfFnXE|nFVc|TMQxP0+Zwt5Cf z{(jEP&=E}<+5iY_IG-x)Aoa^;yjg>^0(11~HYSZ_)OSjXLRp!KRXe=NzM#>f(yU~3TeJ|XKSb`P(<1vMZyc~<*eEmE|rLn!SWhdku< zKABVN_Zd9U{GX~Kkp8Z_k3GkKxpEDF@JK_9mOX(i2kwr=1 z&8KQ_#8f20aS{d>#s6iqz8P$q4i7lNL0s>l<&}0b8&PU?$9)gXjKMqkjJOBTa))vL zbV?8ZQpzS>gxm#5Uf9CF{VkyNf3giRo8c*|8!80r;pexmQ~JD>7&Zmoa(uCzy5rw> z)GTmpI5!en#D&I>$+|9;cUw3~zk;gP?6L^HF#`AG`v{^f=f%{;%+!#EW zuvag4{Hn^g`ReD+r!RO~g=-4+yVKlRyZ_^&C1exJNwI2Dsa5j4wus5JPh3Ka5QgIM z1s#bEIoa_WW?%2nw3#6uZ{&SSSk7flGFJfT(x&?*0CXE z215ym_i_B>bB~Ve-kY*SKW5k0{>vbo;#v*rkJg}ivXuG_YMLT7*L!ebP`8ZhQ za^$WByW10!Eh>>N+|h6vXM%ljkD}FNyk75jx=p@2RQ(15xd*f$;yxJ`$6iyAn{M^J zrEHN!Pe!8?2sdJG!P1)_)ABg|Zb3E`6=8@DFvI=n8vV;3AAn6(5e#}X&7-ht7NBEc zYZuP~f-G_ZDLq|)?P$GmGmzGy8p4v#Z2#pM8Bo`jQ0c;kb3lR{vp85v`ecCEK${i# zo-skwJ}TIYd+@01Y7asae=U9r;&4>>hF*b!ZIs7{*pW9@=>nNa)srCoL8de{iTd(e zBiwPc#`%vVpvVYaNeyL)^}&(6*;Q@Q+V$QToNTw}wc^_sjR~jkgMoFv-|Q{p=5uqu zI3!efWKhz8#9uRYgrWP&xg!YG!{n|=k`a+5drz*;z7Dbi7sq!5gGF2)pm(0h3;1G^ zYL@iX)>;y5uD_wt25jD+PiL&jyq5{#Kwd!^QvVyaoXUhdQW6YwRlg5od>eq8U@&|U zZQw(!Tn=zx0~sm!y>bq#Mx0)zU+*b1s5p-AdDF>@TI7=aDT*8>L}u`A&r$~FTu42< zkN+EI3T&+>j@6O3HNahJfxw`&;ho_(FX)T!0S=9e;G6wA`f@cL8j9I)%wjChs)^YLC zEuID%rOb8y(EHC$G6F@r%P_4_)y_ArJMxo*)gnbhdF=GYl;x{V##NP&OznCdvVae( zBG|g|+0CYs@n^jI9yX zl6XetB&7C+5@Da0LP$Hfi#5;$>Tp=TZ-^`}05kb8dCet(qb-QG+wz=+2%niL&}1rR zri2HMwm&DeZ>rAEXTy3gcmXIs(cQ;`!0WJLBi1WIWuGz2OpXtvPin)WgBNpXJ0&zLDl?gY>}d5CO!G4L4`Z3_a-F5 z{4n^`q$|v53~B-B;KQu>fdf((TB1N{3@gEcr>fLNu6gB`SYjiP;g=De9!_5chbOfmlAXgM5pSHE`+mfpBa`8(b-zt z)qJIoZt+6rormRjQbh)rztNZ(lAJl8H3ElldM)FJx30A9Npng`)r38Jqzks6>7}y#{pWMBLKzK>c>bhZsEv_=Rw_JCiteg8WJkRjU);~v1=97w!=>-Hh^_y zAL34r*U|5Rl>2h$-OQCkX&E22hR~u~>><7eMepUe3_DKF{aV+t5#!+~E+z;c%ipQo z?PN>Iyt555(5rv=OAdaq;ZPu$l^j+#ss?hCxxFDA`awtngIIivejEgtt=>niK(=S& zjuYJzpeWMCN#wYL`7SnGKI(-5_o>6}qsA}t%yw4AEx@;H#q?m!lxkh6nSB)v!a4Xq z`jgrZ%o0;3YB#4sX!B(J;PSq$Hy22+)T;b*{IQe0{E9h6g)Jei!E8ig@*tB4OILm( z@mGn?F|o-P)U$sMoW{`G4dZ-I(QU%wbBxmQKL0>8cJRIkM^7$m0PB&=E)qOMfM_gg zgxnO7Cx6^TMRRLZq=IW?vl{pk1iF5C{VHhgk@j!kG>kSv&%KwYE>%A=?F$OvM zzg_%ZUdB>e>(qe!kWkl?jW&c`L2zoy zi^Dzq`-xyzZL~CVdQVQqg7@p<8WAJv-(7<`FNzb)b!?gMS(#K0*9oRx(!ias389dD zvHSa02FlPfCAKan=HC*XI$`3os{_x1{jU-O2fd`2Sre>k$NHq$0(!vz5-?Z$Mt|}- z8FS#D^wgiaU^sD25Z1ef&7$-lpet5dU`PFvA~m{2e)L8&e{HIgR^_whd?DK>Gj8R& zC80*lWeZvMp^$@hUX_t_*HB{j)E37A%PT?pK_&184aY&}M6c5Z_VnKr$6qAUSoS?8 zHk=>RP0OCC5+Yv@Q*>Ym{;Ie=sq`J#_N9qJ_0`%3vGdG(mX+2)+UeyM?Zw$A_oScQ zULOw^^MS_7?(3QEA#=ZY57=Ju+?|i-Tgln4)B@W>goys74LVX0nmz#Vq3wQp48z&QxTL_hT_#Y0utL)!K6N%JQltA5!B#e zst@C4QGW7*oldD21X2&u?v#U)h$+r1J=Y2K!zI?qi;}j8#WAI41H17?%%Nh;3Sv2v z1T}SzmMPUl)!vj@itYkkruC^{0e#eoo)}#_{SGhNtT)W!Gip(0nE2NF{!_EWSnq1e zh~4q%?kkU_gTp~7?04i;j~!Q`C#jtBykb{<>w>QARb)n(^zH;G0k5?W_4VI>7F0d0 zRdi3h>9zmmk5M^xG7%qY>M&b;p0}T;0JG2j>z{}w9{f51!b?P+ZUh82fozsK^(x8x zNC<_~Meles3C24|-;iZKnpVe`eaF+EPIc&*ql!@-zosc$B`NJ?)4$wglPUV#rR~?o zNM~M0U43QKk*r-Kh(D(yc{da8@0!hIgvsrYI58YDpMWx?4>AUaRtEx4_FcsBR;$L| zUEe;X8v*OO9J0#4D;v>9%mgxBuT-%Iv~A@O^{@BNwL&w)?*%%XH(2HZc|^h*Q1yLz zq-?qN>Mg58(|?}pWNlSgrUUp@Lpg)B9&J?WfaIf-3OL^tEm!_Py+&K-Xm@>7=?Yeq zKeDsZ5F>Qa$qma=^$j32%N9DtvG=tC12^KytCQK|%$U!3W(u>WUTV))--(YdLlQHi zKXa5=00GwWw$T6g{Tb=&4=c)1BFSp+KFTZ`qgULy(bLYuWkwg%Fkfq**9t?@?Q*3T zG+WTt?(zL)Z+1haRSTP3v2W}t%j##r*3}^Y#VO>85mspE|Ar^)a=&3E`d!dE0q21v zk^Tet!>T?bRz!_pF>8Pw3z`ZZREdFkvW4Ghpe6Q456omI8s`3jEGydUZ-L08AgUg{ zf=D)0xFXyrB9aXlm2&U~KHrHjeZwj80+O%gb>P)IG}vVec{mw(P4<8-pGX4BF;sYS zBk~#GQ|mISeb;zR1@btXN?n~ z*9;My6jzq=-%+gORKZaA40<_I%6sB_rd6%1&>0|9o2k`|`Z0U}yf3n6N92;C1%p`PoCc<3i=D%m=Fh%C+_qxm|qUrtE zVle*+kLCJDIulj_&J78rdjWJsbwg+_ZzvyxH*bJId`Uav(tL-EX^^y)lC&bYxgWw+^++K$)Ui#u+#Nqe<6elrFPSe&vO9 zg4jBAo=^unL*K8p;UYP4rs?H+h^PD+wEp2%m@yG7YgQlJ7qOjHSt$LP5cc4K(&;bB z?yS5O^ftFq3WzK9GY{B}a))K{|4vcl9cRTjAO3p$E7??23$OI#L-*toD%b8x2MTG3#7?X# z6%(?n6#aNiSS2a1Dcbu<;iK_pwV4-=#BN5&dGJ8XbZ1hbBu2=U8hV0UmQ7?x67@TU z9P-of5fLx$$Y+*gcVjYVKuWEHF+vK*Ml{lDWDgV%7k3jb@yRYx@T=6r`dJpm(p+*QzoZNrR?PJ&R=Yr+VKUVV}Nt#b|XEJ#fNTP$sY-%?G-=;h3 z$_f#6SH~XiBv?s+B;I@Fe)#*Vp6#eb;|O<>eT11G8}jmv0mISzkAFp_-63X03ltiu z!l^;j)myRLPdoz7Z49e(>Bbwd(p%?x#)5EwvEF1zjg49-Hnajos;N&rQZyGoi$Yz< zOd^BLnru<%7qO?n)P|+WoAB`{5rM;8YN^&d?ngX0z11=2UUHNhGR^0Qe4Ph{KV z;;_Tie9lXH!!qH&=T|%o5=soOqo~# zgJK485pCTKMwcjx;lKef3Wm1xj;~cECf40p9v|Y~@r=+a`|(-hajtgrjDJS*C5@|Y zlOXS#9Mzz+M-+lEifOgzCFdKUIVKGA$g-}DC1 z-U35SO}T)q|C?2k<7PC&EA&H`_k>fp$zX($9j2+7|1r(Xl<62G57L2n`2vNzthvKk zXl!QoKKOGp)#Xlyq*Wx7iNA5D{#*5qlFB4@`A+447v8gXo^x4S17|2(3?{;?H?x zK~Xm4qumf7d#B-XM!bcr!)ZaleyZS<@0vc=>6RA_DRV1IuWxg4FV1iZH!Tf|Ca0a=+HhB1tK@}d?Hj|gL3VJB)u_Pyw5-Ga zX%&yxtS{k58(pI(Y|5mMpva)w&yONTH!(=jx3YYKT-cSsHirkooUx?#Fbq`4{x&EMy4W#k4Q$|#!TMjOZ^D{zc zw+(_U?K#Cf$d(*WX^g>c?e=KuOFO6%#%LAx+5Y3e|8HzCPqq<<2yNkFz3zu&M(5tO z2{8@fhQ`4JHGS_PyD&ZE{>GoP(Jw`Dae!Ru*T|*k)WZ^puWc(K$vA(I+*$~r>`a4m z)SESW`wbU7o2S2aRh9(qKt3rfKM6^YYqV5G7@u;+8oLn{@uA%Mn}0(i?aL6u_^HUaoahlWh!HM>#-Hm;YX>MQ7f7n>OWmtqqz zG-`JdK=Ro*@OuASqcw2Kx`M{tjiA(75lj@)P!)+t`t-G0iWEci{+Dgww_9y2uHi)h z+gO=YgIyvNqO3r^r9{A%9xIL^1-m%pmDBmr1kvR{7uzC9uj(+Lo6Aq2k$s&O-Y$SU zSkn2M1Mq-EK_?h#e_O4?kXb|iD!UEK0!8xEji_>`>OaZoM1e%I^h7r1R5M zUmP(dLuyZ?!=8ZU3BZMfj@=;Fn?MU*hm3?QbnK*rCc~;!2{DKs=}^b}4MsShxb0~1 zdK|4%{jX?Vbcqog!P2ZMh z{|Jf_ga5gaw-kama_;MON^{9A&oY!5D;8qi1#Y>AzDH|_7bwj(Z|m93k_-P}Ivz@v zOa4h_KPzym7Etl%Nd+j$sEIu%sFAgNTmd3IVK6Z!;#&q;!7D`tuJ3>Q4 zxAHlOY;@DFqb<7rRL>tH{4j zNsDg!&1I+We=abrRs&j>7{HsjC{K6^o=FRM6I=a;765$1m<=rI|MtgeoQ0?=e{aIj z1s4Cm7g#guyOQ1Oze3N)Ybxc#^R|S^*P@O9j1TcR0Kf&v;Jpcg=HwMNeI3|-c)!{9 zv??l`dQgYp&($!!TC062`{$(iuDO)mH&Y*6uosxg|MthPdlKj+K!z{%IkP^XjXqL( z`&ae>ac8>RMf<|6@b-t2Ki_I_vab1vnAgM;nK0-uSL-&&|HZn#2TOm1b+x!qsUP?6 z*UWzoS@)Ii-c|p?5=3_5ki~HkFN~t+w`1+cUX3%xhy`b&SyT=U$(zwT_VhCUKqT1zu?=k zbHi|^KMwjG4!8w__OGq3y)DOC&cMClI0Dfd1R>r8*%FgAc&4Rz;F&Thnn8OL#KxGx z{ZIq3F_^$8EnQYK2Y0pm0`MmO$FJKle3?Py0Bu3=Eeqvr~ZfNXN2 zp~hu~QNL$PTGP>@o<@>eh_6Air;lEkul2{=Pd9L}&;F){XzBRZhsP2DZ2hLG$vuL+ z$D|(9Pb~k4iP^#Pok^~A0zq)|Iuyg};<2kNz12$$-m|1#PYZ+~B_!__eFLB$@LbB1%l`PIiYs z4~57jx%Sy;><9{y;3D4J)w5|pU;bW(<$a|F!?k1rgHyq^5pWEKbHU7a-I$%)3+AoH z=szDq)Y$~33Aa`{Oh*Jywi-l@LNv=idmB5mH-KFF-W-4SN+pN)cw+0$tr;_KyD%9 zOqK6kJIkJ1{**tfx5^Ga*+0|kItfSAmhibA;N44762ZKxH+)4kRjgZIHTZ0h_a@zb z?qsa!0<-uruJbD(X`&wf0P$ipoBH&?#f5{5D@9S&275srGq^an?y_%SH7bQhSvW^x zA{d~JU{JpPAHP1k#Py%g63e&0|MQ){p5>GOm?&#&T)I_>M9Cj