From cb7a1bcdc1d0a38f3b500d2cc310c285d17059ab Mon Sep 17 00:00:00 2001 From: Daniele Venzano Date: Tue, 26 Sep 2017 10:10:31 +0200 Subject: [PATCH] Put the ZApp shop sample files directly in the repository in the contrib directory --- contrib/zapp-shop-sample/zapp-boinc/README.md | 7 + contrib/zapp-shop-sample/zapp-boinc/Thumbs.db | Bin 0 -> 7168 bytes .../zapp-shop-sample/zapp-boinc/boinc.json | 40 +++++ contrib/zapp-shop-sample/zapp-boinc/logo.png | Bin 0 -> 3133 bytes .../zapp-shop-sample/zapp-boinc/manifest.json | 29 ++++ .../zapp-jupyter/README-datascience.md | 14 ++ .../zapp-shop-sample/zapp-jupyter/README-r.md | 11 ++ .../zapp-jupyter/README-scipy.md | 10 ++ .../zapp-jupyter/README-tensorflow.md | 11 ++ .../zapp-jupyter/datasci-notebook.json | 38 +++++ .../zapp-shop-sample/zapp-jupyter/logo.png | Bin 0 -> 12760 bytes .../zapp-jupyter/manifest.json | 34 ++++ .../zapp-jupyter/r-notebook.json | 38 +++++ .../zapp-jupyter/scipy-notebook.json | 38 +++++ .../zapp-jupyter/tf-notebook.json | 38 +++++ .../zapp-spark/README-devel.md | 41 +++++ .../zapp-spark/README-jupyter.md | 10 ++ .../zapp-spark/README-submit.md | 5 + contrib/zapp-shop-sample/zapp-spark/logo.png | Bin 0 -> 26999 bytes .../zapp-shop-sample/zapp-spark/manifest.json | 45 +++++ .../zapp-spark/spark-jupyter.json | 158 ++++++++++++++++++ .../zapp-spark/spark-submit.json | 147 ++++++++++++++++ .../zapp-tensorflow/README-batch.md | 6 + .../zapp-tensorflow/README-custom.md | 7 + .../zapp-tensorflow/README-devel.md | 14 ++ .../zapp-tensorflow/README-goog.md | 8 + .../zapp-tensorflow/README-magenta.md | 6 + .../zapp-tensorflow/README-syntaxnet.md | 9 + .../zapp-shop-sample/zapp-tensorflow/logo.png | Bin 0 -> 15982 bytes .../zapp-tensorflow/mag-google.json | 44 +++++ .../zapp-tensorflow/manifest.json | 42 +++++ .../zapp-tensorflow/stnet-google.json | 44 +++++ .../zapp-tensorflow/tf-google.json | 44 +++++ docs/figures/zapp-shop-demo.tar.gz | Bin 64956 -> 0 bytes docs/install.rst | 2 +- .../complex_zapp.json | 0 zoe_api/web/websockets.py | 15 +- zoe_lib/tests/applications_test.py | 2 +- 38 files changed, 941 insertions(+), 16 deletions(-) create mode 100644 contrib/zapp-shop-sample/zapp-boinc/README.md create mode 100644 contrib/zapp-shop-sample/zapp-boinc/Thumbs.db create mode 100644 contrib/zapp-shop-sample/zapp-boinc/boinc.json create mode 100644 contrib/zapp-shop-sample/zapp-boinc/logo.png create mode 100644 contrib/zapp-shop-sample/zapp-boinc/manifest.json create mode 100644 contrib/zapp-shop-sample/zapp-jupyter/README-datascience.md create mode 100644 contrib/zapp-shop-sample/zapp-jupyter/README-r.md create mode 100644 contrib/zapp-shop-sample/zapp-jupyter/README-scipy.md create mode 100644 contrib/zapp-shop-sample/zapp-jupyter/README-tensorflow.md create mode 100644 contrib/zapp-shop-sample/zapp-jupyter/datasci-notebook.json create mode 100644 contrib/zapp-shop-sample/zapp-jupyter/logo.png create mode 100644 contrib/zapp-shop-sample/zapp-jupyter/manifest.json create mode 100644 contrib/zapp-shop-sample/zapp-jupyter/r-notebook.json create mode 100644 contrib/zapp-shop-sample/zapp-jupyter/scipy-notebook.json create mode 100644 contrib/zapp-shop-sample/zapp-jupyter/tf-notebook.json create mode 100644 contrib/zapp-shop-sample/zapp-spark/README-devel.md create mode 100644 contrib/zapp-shop-sample/zapp-spark/README-jupyter.md create mode 100644 contrib/zapp-shop-sample/zapp-spark/README-submit.md create mode 100644 contrib/zapp-shop-sample/zapp-spark/logo.png create mode 100644 contrib/zapp-shop-sample/zapp-spark/manifest.json create mode 100644 contrib/zapp-shop-sample/zapp-spark/spark-jupyter.json create mode 100644 contrib/zapp-shop-sample/zapp-spark/spark-submit.json create mode 100644 contrib/zapp-shop-sample/zapp-tensorflow/README-batch.md create mode 100644 contrib/zapp-shop-sample/zapp-tensorflow/README-custom.md create mode 100644 contrib/zapp-shop-sample/zapp-tensorflow/README-devel.md create mode 100644 contrib/zapp-shop-sample/zapp-tensorflow/README-goog.md create mode 100644 contrib/zapp-shop-sample/zapp-tensorflow/README-magenta.md create mode 100644 contrib/zapp-shop-sample/zapp-tensorflow/README-syntaxnet.md create mode 100644 contrib/zapp-shop-sample/zapp-tensorflow/logo.png create mode 100644 contrib/zapp-shop-sample/zapp-tensorflow/mag-google.json create mode 100644 contrib/zapp-shop-sample/zapp-tensorflow/manifest.json create mode 100644 contrib/zapp-shop-sample/zapp-tensorflow/stnet-google.json create mode 100644 contrib/zapp-shop-sample/zapp-tensorflow/tf-google.json delete mode 100644 docs/figures/zapp-shop-demo.tar.gz rename contrib/zoeapps/eurecom_aml_lab.json => tests/complex_zapp.json (100%) diff --git a/contrib/zapp-shop-sample/zapp-boinc/README.md b/contrib/zapp-shop-sample/zapp-boinc/README.md new file mode 100644 index 0000000..9fd3232 --- /dev/null +++ b/contrib/zapp-shop-sample/zapp-boinc/README.md @@ -0,0 +1,7 @@ +# BOINC ZApp + +Maintainer: Daniele Venzano + +URL: [https://gitlab.eurecom.fr/zoe-apps/zapp-boinc](https://gitlab.eurecom.fr/zoe-apps/zapp-boinc) + +A ZApp for running a single [BOINC](https://boinc.berkeley.edu/) task. Run as many as you want, in parallel! diff --git a/contrib/zapp-shop-sample/zapp-boinc/Thumbs.db b/contrib/zapp-shop-sample/zapp-boinc/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..f090531a9709b9fbc310eb5e0b8abc7a016a4d5b GIT binary patch literal 7168 zcmeHLWl&t(mTnq{puwHSAq^o|u*SWC;1(Rh#X@km4$?r7BqX?`3Enu3B?Ko(a1ZVf zJU}4m>%2E}>(;G$Q#1AE&zrgH)OYr`)>&I>t-bfz=L`>#ExoIvTL%0|AOK9j%`H9v z=MQ!aH2;Oa3n>5qM3Z0o&F$^&Ka2nXn*JsKMiID1kM&pne&Ls3qZ9cn=eTI#p@EME z0UCs8+(F|%{r=(o*Zto;0=fV<^yLL$0Vn~UqDv2eKRV0*eW3zi|Gwsb-y8l(_1vUv z#%$3sj6d!d4*((nQGg}D79a)?M#CEL03Zms|91$XEp})o^iSIRW#$F|G5(l?|HAe6 zM_6dqNcOw>FO&ai|NnA_e`?@g>Hm*)|Kk7uB0z(lOPFZ9`;YY?$1gbS2il4I(-iwl z{XZIkf0qB4M_MXG1a!Y%{X}Z2in{3XJsN6wzYYgAZt;xh0>e{RMIKN-$gqu8upHzx zuf}$<^gV>6yjEoR5G-S;?6jgeStEqJ63WmD83LS=v zcY#gW{%M1cdmVebcvo1+5!VRrq+Y`vPx+qS25bHMy%tLm1h9;DF?#>wwPEAI!P>^U z-k0|HlU^g4zH6yoZ+AsU%KS1G=}$#uF**a08Y#v7oo{NrKVyilv}CrVs_6*a1$m@JuTvRuLP3L<# zF7?PMWiV4nl!}nZd06?{+USqG?USD)!WZB@gw+1lip*pkE12o5!Sd%DzY2wwg?GCj zTW0W>p^Gm^k+V(y3g0F_5-S;2Kq=+>QfPd;%%yl$%|gVFa0k8ygw^d!vr^>SsHKY) ztMs}*FP1MlxKuV)BFSn@KkbZAnapi~oIM)vaOKH;K?~eiHjv|$O}*Z5O$t^KsT(sL zyO`LXcT^}gU5|C?JPTWtyg+&DM`@;o5>ipGsz@o1B%*{Ox58}5*c)DX#&>hN6o3O0 z`-5L58gNKO)ZK#@n2H1mq<*@2eZcJ#@?eMZ9TkVg?dZ|<_5xLX4cT3AtY#8{ap%Y5 znZ$H08OS($ukOXG9F)^oim?3==VT2oqH{+po7vn+NU!|SE)1)G;Z|Tk^=n%|kUXq! zSkhg=%Pf6yOkng(CMP%UmD#h6-JE2f8*=k6JqRS9I0ZNOZF>i-*t$7g|HBi?CXMe# zv%=1~ffA84t5jw7(rQ5%KjJFjPW7oaUKlx~?C{0fjE!bg)6Za z4K`zGUjti?)n#37dwtDu(Pw6DTQAa^+9hKT(-svC5!x|%)LHbTO#`#Yt=$;k3ucLwD?8>V07I_}bG`WCg{_`dlelm;a(@9EET`a6((#QNs)t(+E zL(;XK4}YR2PHv(<7!NVQM=A0I&)>6PXeT=f!sw?^HJ|{p7&4wOF`h;vQG0>YcsX9~JSyrd%zMi<$3tl6FJk@Q?QW`4xGqpHu2g4e?+{Dz{h|vcgkI8LK97X2K z4cJP|xn6bmMa*bYigGz@32|xQQz2KgkKJz5V z&-$R6W+Lt~E;vydr6Hzi-&C)ppzuxG-If35jS_7m_K7dC%xVGk?4#@~mYsRASdxWzf2_J~k5z=c$BfpZTd8?I zUXfDu7Q2E_cX>u`-tnr4dvXj1!60fam?af#q4&af(VM>cKB#XGsd|!Z-_+Ugq*tS9 zG~IOSq&U=zoPZpZO4edH7V3?S=Lz%LQ;|N!qaVT9*W3LunjVgm3P ze$TCq9`%RUwQ5VGHX=R0i81rad8F8uFL86)(!Da(gK};ho)0Sch9~}w z>@rHFvnOvF3;%7|O$3TTuh@pW%tBbJ4(7DP#R;WX8?$Aa+RKmtA{J_05c9YBoR0IG z)rmVik7}2DLcOWsy8YZ%Pw2$OTTYGZY5nOW7#9X`ww3g@?Uy{@NDqd(s0Jtpv_4L5_l-xH7oQd8w$ z*%n-@Y+W*52rq2E$*JBd3Un5!Voq<&;10$fxvi_lz+jD!`8GsOaMuvzwC1uLj|zJF z;{KcBB_xZre;`ptTfh&+i0BbUB2cmNgt|+F_C@3!37-d=W88p+Kv|K=`NVFC+647G zqTHA_8xnV$1XpJ~(H zU){BB;r+bh7xK+xvIeK7Tk<%^K^ihhK;A{KXIU@cj0sNzp^C)<0M=b#^~uZ|{|byx ztE!HyJir=y3zhmoFp=k*Fry$<;|E55-rE7+q@9QvZOxd+x5#b7?ED#}DXi2Ik0T>V z4aStcjfdzOh$|7wuybyb^M29%x@6gcnEQ&pMB&_-@w4G9PP`Q0!xRzQlVS_cT%o_kO(_x|?l$iX;aE#?VQ{!4# z^?^fas?^Yqa@hretr){&5#hQHA)TinFqcHxfo+c(SOo2N?FdQDNc->pOkCWRY&T`! zEF}vVrdU5MRphy?t!1s2Uw#J;sN9^6C2z08;B)(E!SvzBO}l9~%lFyJ(0PN}tAQXc zqmjz-Yyy9A4%KtY0A_9ug-pW1M((JIy#9Hl{ZKY@s6CkQJV{v^8 z=>-5WCjYasjJt|vC2X24F(>hc^RhNS5@txzr3 z&WvZ~-S1)fQeIbgc4nSgXQ7H1VszxLrPj}^Ijr4Xw-#Quq<8OJoF==o(i!KD#-dXp z@~oT-G8?^M_R!FC@ihNVND(lS%!g$%HF$i~u)xuw^_a4>B+0<*dqjH~-AqRR%swS; zs_|hu3t5=bO~AyC?K(rrTN<*YLB1vJ@ON$N#u`dm1kN-)Z*q+D@W3*60)3%#pPgZf zlNdjp&y%&K#4LsO3i!*aiHcT}qgQ~e#5(6|x&=OmGm6X>In`}9&v{O^4viv9pPcrY zH7m*9wHI97^(xDS&N|5?KmQGz;c>QYqh@9|k6ini=SKLQupUI~cg^%;{vDIMRCHhF zO$l^EWrj?7VQy@^NrsCLd7zutMm|ethnMG)z$6uF*R&$zwxgGUoC)sgNr%^&{w$@3 zdr>p(CA7#^e-mP8d_C4Nw*Ok^0Wu#{S;E2P%5HF39VG&aGp~vDu|N-!DW|&1k5;^r z9vy7xqY+TwJqER9JaTt z5`t+yn3p{psc6Je*ul?{gll9WkgDwB;pEFP{%sY;g2M z)Q1_uKK|HPe@);yE6q$=C>zf%&=Q7{BJtsMI_hEy35I>}(@!EL^7x8>5b{O&Mn48&xa5gj0uKJZ-lABY9!BNF&)NUPK%ay z?Q-m_OX%czo@-HV#g>@++1YPOAoX!fDW{CXefMRQp3dU*xQC0eYf;2uc)#p%vy|+@ z5iSyuyTFR_=z=53emH0|&MvMKP&*KMDVgD(JWX4AhhoH_|LRkbGY~*^_{r?#1*PEy zAC0--esZK@s`7zCB2D-t4A*e$sN8kEZm$+>bPF{Fxn*y{wmp=!hdQV#&XYioBKNj> zntF#$!6zK9ZILt(IfZ0W+RiA)kLy|ppTZc4?AMBZ?GK`I+}kAqHWBu7!Aq%gpSwE3 zv9sqKx15(`G2D!pC^J}&lu;#>l#f`Y)yO%Pu=Cy16%tv6ybg{gF|i<4Uw|Kixf?KW zS}Kdi;pF?n{eo9m;f35(av-}`_idB+HLnY`Wi{PMQcrC8QJ$PsY4Afu7anL`XJ(Y#Oa!9cWKSUDVqx#s5NM$>ny97g#KjnZyS;>+Ha#YAFX+#x~QjsbV8%yOKH&3^2Of zzrPoW@qPTs3IxK_6DqKv%2&5X$+Uf^RttGrK!b5FU#Ku94bC%JNkXFZ!gRcx6;d^+ zD%j2#cB*i=P?sw&cjUOKPQ_R;-zgo`C;z?kH)jrdW#vbs?NxI~e60qWho(Wqi58Uz zh97GR!U0xO?Rp?T`Au*oj?~xif_QqX^BCfMZ1lPI)5y*>c(F2DB$gZ1iANgi@76*5 z6?F#xNbW=ReuL@Ta3-Q@fsNv-GPIfVGn>DSe#u;5of}9>c2SW&hxGkh8p=bZ%-))) z9fCb8j)sF_wXZh=tP-9QWrx4DzUUW^EcJx8ojMuhDW5uzn#b?xruYmr@P~o%(n;v* zRUrdL;q~(fjnY|e_sK0?11?9bE`C+%MQ=R8@+_gg{Nwfs*&=bHipFbS()yq$?KTq6 z9vU>9;Vyb_Xk0Qx2-6c3kAau@8qrkE0}Q$_pjO@d3iUY#&b|N z%@EU+QxP6cxpwL}^M>pn`KHX64t#wdX6MwHq5B6lW7)c4Rr_%WJ$}E%lz0JRbE!`) z`@8y%-KDUITM^&mvy&g2xW$i|Ld~9o)Gev==oE1m=1(Y%UN{|QKOy?ILXF+r6{&)a zZ@J_0gqRWH1rueG);2pcB_LO{(f32TDyRn?;kTIPfBPA0pJW7y_&Q#yZZ0XDhnq3! zBVJ~zTXomY3QF!A!_zR>Hz}S*LF+Z4b2|udTs?z&xyNw>e{pRMb7cE1&A7RN%7*yU}_Vm(4U7R~_2q-8~~1 z*eW*T@Ovteq_D4Op?k3RvcrI-g9<>I;(b^PpzM0u6% z828G}@M{vJ<}#`&y`b~5(!pm=fs)sky$Qr;3uPq7ctk9JosNNPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf3(`qMK~#8N?VV4k zB}Wy;XOV4|;z9@tqKhFQ?gUW@q9}m@70d{OkO{D8CFq6P^B)PXUhh;I=hlPCyc z3}hiAhzl9B35p^FveY07K}H7uMMIn4oqJyDo%_}4s=nR#cE70)J~Fwl|5Ts)^{G?U z{oXy*H8ssh4alZhsR7wED>WdSW~B`vPhGfL@B0s>@3{DMclW`Q-I+(8>dsz%w!8Ao z_3p)&Us<2&_S4^Q{@_Kn z$AbF0E!cDfaNhjKzt?9y*#g3k9vpUW`q-lzP9aR~V<+Q_RevnVUfTnyf`nZ_RnW-} zfcdZgyt+R7$Qc<}{u%-dOd|0_-&$NEH;E2JdyN0AtlDn1cVm|9frSnq`S0`dw!q-GI@ot~a%c z6ZSEcamT8kW^S(yAjcFPL_z=16W3M~84IxLjMNNwORFon)_0tFSb~_E>jPS@@y9=V zezo68Dp$7Eq(FKRc$R-6D6Qj|46sbH1aZ@)(B(|641`M^0d}FC0%-zFIwuFCnOcmR zY|f(YrLA|}^We(<8qBOFG!Xl>7a$R9kPKTn7|jfCfBf@27t_gh24ZU8eum|yGVKjW z6O)(-NKB{Bt^*KN1xHZEmFuv`57mloeY%mVfEPzDRSPDdJoqYO3 z53VKA`%@$G_BI9H`j9kxu8oWGW^`K=RIeE*=AAsDZi^ zMstI4T+I$hWQ)umMw|k`FsmRL;s{1+O|_4?!8o2~2_#ZbrZ8d!#}MaW z<9ONtlHiVIX0^<2$uJCgwX<24dN|Hd7#Yer|5v~BlhqKEFppR()t9h%3&Ssw)7(ey7%PY`^ zK6)hJC6lC57`Y)M_X(J|xm6o#OzgNW1wx;Aw*at-?N~KC_S!j+X71cl(dn!m_QA;7 zA{lU7mBLv1SX1q9j(`LLey;Z0#>9~X1GDz(2k0L!a8; zoCA_;QrnO1C@C;9jk%Jc>{SIM0F|0-_U?NRgTA$Q@W(6dfS8Z#iJxneb(j&7?UsAy8 z8t9jjp_;y>yrHHZVy{VoG)0pHYQvm>IrsChUL^Y|_#y-EYkF254WDG|KB@i83P@(N zYFkV!YgP{c3pmxW%&HAQs@6 zs=lQkwU1fBkc$@?D~eZ6KpAC9GO1T|Q(%5Rg?0jDREy+>Y=$j{1I*o6G$Uu|^)SBh z_Pi^g>#qT;43kRjV^%=shSp|&?SAdhQjKvFn!ktI(zSk^EYi!!85X2t}P z62OUJIc-a7mOye++nXDZ$F-Lso8dYFlT4&w#B#qK0f}Ah&_hoI;ralFmrmV~!qSs_o4U$m6O4lG?Av1U6cbRe?YZjp<9d={|C3 zoT7#lKvMUnZAmR_+qKm8<_6?(RRK9fbYk?@OztTMAS)mVl$6b~#{v?_owyd?9&?*z zkE6+fL}U+jJeHGE`??LGz;arS_sdQT>S0wtLqAS^7e-QZ0~uZ~H{63fpK>Ac2O4`ynoMbYZz+ z8;4oRpiIG3wrvbXF_DQxmQX->`L?It6_B}OVg+PW_hXX9-rt8LBa}K??nxajmqZKX z)G=XZV)#y$M*fkY+04!o_s_6lU*>=ZF9 zS}mD7#uP7$0;8|H=(xUmQ7Ju!_nd*`S{aGdK4aNyZ$NUP(Hk1%<&dnEiuRBR)Ki$8>7de^O6_l60+5LMnK$P9Zq{0R zZ2-yLFqY{sKw$_RvOEBceSeBCf{~0#8^~tX4&WoWe9p~5;Xd^4ryX49?Iik9^e3G$!%S`&W|uHx+C#Q&+Fr8* z(qN2$jMfClgpuQr{TQBdPn+xp!8Lyotx0QEK&CL}pyYRRa_f%NHe=2H+&)rhgg`Xbe7}<#V3KFf5lo76evq3 zpc#xgD9=3d)U1a+GA=`Y4n{NIx5G@msb4zbt(t=| zHP@6|$Zxu(Nr9w(A{+9E=U-Y!G^T2+d4#mfAtwcnr@9M69mYtYTzN<0<2f*L|Y;YtHuC z0P+a7605-AB!DWwX5T4fjirmM$CtO)z=&0R%xOGjys_$^1=wqHAh8NEw$3>Hz~iI7 zV7qTI3^Od3!iZITu#csTH&*?#0DEl*Bv!$}E|4nNm`P6V$;gsL*})Lb&87fMt>S`x z3}u|L>X(JsYkMHE3KDh!O@qxOhY8O~7b^vnA~`VAn56cxlkvr>KNe)KX@SJ+VBUT3 z05~ X|Jyg + +URL: [https://hub.docker.com/r/jupyter/tensorflow-notebook/](https://hub.docker.com/r/jupyter/tensorflow-notebook/) + +* Everything in [Scipy](https://github.com/jupyter/docker-stacks/tree/master/scipy-notebook) Notebook +* Tensorflow and Keras for Python 3.x (without GPU support) + +Please note that you need to retrieve the secret key from the service logs to be able to access the notebooks. + diff --git a/contrib/zapp-shop-sample/zapp-jupyter/datasci-notebook.json b/contrib/zapp-shop-sample/zapp-jupyter/datasci-notebook.json new file mode 100644 index 0000000..171d972 --- /dev/null +++ b/contrib/zapp-shop-sample/zapp-jupyter/datasci-notebook.json @@ -0,0 +1,38 @@ +{ + "name": "datasci-notebook", + "services": [ + { + "command": null, + "environment": [], + "essential_count": 1, + "image": "jupyter/datascience-notebook", + "monitor": true, + "name": "jupyter", + "ports": [ + { + "name": "Jupyter Notebook interface", + "port_number": 8888, + "protocol": "tcp", + "url_template": "http://{ip_port}/" + } + ], + "replicas": 1, + "resources": { + "cores": { + "max": 4, + "min": 4 + }, + "memory": { + "max": 4294967296, + "min": 4294967296 + } + }, + "startup_order": 0, + "total_count": 1, + "volumes": [] + } + ], + "size": 512, + "version": 3, + "will_end": false +} \ No newline at end of file diff --git a/contrib/zapp-shop-sample/zapp-jupyter/logo.png b/contrib/zapp-shop-sample/zapp-jupyter/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..480932523cd389416c1b7dfffb8b0580616e9051 GIT binary patch literal 12760 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 literal 0 HcmV?d00001 diff --git a/contrib/zapp-shop-sample/zapp-jupyter/manifest.json b/contrib/zapp-shop-sample/zapp-jupyter/manifest.json new file mode 100644 index 0000000..21a097d --- /dev/null +++ b/contrib/zapp-shop-sample/zapp-jupyter/manifest.json @@ -0,0 +1,34 @@ +{ + "version": 1, + "zapps": [ + { + "category": "Jupyter notebooks", + "readable_descr": "README-datascience.md", + "name": "Data science notebook", + "description": "datasci-notebook.json", + "parameters": [] + }, + { + "category": "Jupyter notebooks", + "readable_descr": "README-r.md", + "name": "R notebook", + "description": "r-notebook.json", + "parameters": [] + }, + { + "category": "Jupyter notebooks", + "readable_descr": "README-scipy.md", + "name": "SciPy notebook", + "description": "scipy-notebook.json", + "parameters": [] + }, + { + "category": "Jupyter notebooks", + "readable_descr": "README-tensorflow.md", + "name": "TensorFlow notebook", + "description": "tf-notebook.json", + "parameters": [] + } + ] +} + diff --git a/contrib/zapp-shop-sample/zapp-jupyter/r-notebook.json b/contrib/zapp-shop-sample/zapp-jupyter/r-notebook.json new file mode 100644 index 0000000..83b2a56 --- /dev/null +++ b/contrib/zapp-shop-sample/zapp-jupyter/r-notebook.json @@ -0,0 +1,38 @@ +{ + "name": "r-notebook", + "services": [ + { + "command": null, + "environment": [], + "essential_count": 1, + "image": "jupyter/r-notebook", + "monitor": true, + "name": "jupyter", + "ports": [ + { + "name": "Jupyter Notebook interface", + "port_number": 8888, + "protocol": "tcp", + "url_template": "http://{ip_port}/" + } + ], + "replicas": 1, + "resources": { + "cores": { + "max": 4, + "min": 4 + }, + "memory": { + "max": 4294967296, + "min": 4294967296 + } + }, + "startup_order": 0, + "total_count": 1, + "volumes": [] + } + ], + "size": 512, + "version": 3, + "will_end": false +} \ No newline at end of file diff --git a/contrib/zapp-shop-sample/zapp-jupyter/scipy-notebook.json b/contrib/zapp-shop-sample/zapp-jupyter/scipy-notebook.json new file mode 100644 index 0000000..f35dbe6 --- /dev/null +++ b/contrib/zapp-shop-sample/zapp-jupyter/scipy-notebook.json @@ -0,0 +1,38 @@ +{ + "name": "scipy-notebook", + "services": [ + { + "command": null, + "environment": [], + "essential_count": 1, + "image": "jupyter/scipy-notebook", + "monitor": true, + "name": "jupyter", + "ports": [ + { + "name": "Jupyter Notebook interface", + "port_number": 8888, + "protocol": "tcp", + "url_template": "http://{ip_port}/" + } + ], + "replicas": 1, + "resources": { + "cores": { + "max": 4, + "min": 4 + }, + "memory": { + "max": 4294967296, + "min": 4294967296 + } + }, + "startup_order": 0, + "total_count": 1, + "volumes": [] + } + ], + "size": 512, + "version": 3, + "will_end": false +} \ No newline at end of file diff --git a/contrib/zapp-shop-sample/zapp-jupyter/tf-notebook.json b/contrib/zapp-shop-sample/zapp-jupyter/tf-notebook.json new file mode 100644 index 0000000..3efdb5c --- /dev/null +++ b/contrib/zapp-shop-sample/zapp-jupyter/tf-notebook.json @@ -0,0 +1,38 @@ +{ + "name": "tf-notebook", + "services": [ + { + "command": null, + "environment": [], + "essential_count": 1, + "image": "jupyter/tensorflow-notebook", + "monitor": true, + "name": "jupyter", + "ports": [ + { + "name": "Jupyter Notebook interface", + "port_number": 8888, + "protocol": "tcp", + "url_template": "http://{ip_port}/" + } + ], + "replicas": 1, + "resources": { + "cores": { + "max": 4, + "min": 4 + }, + "memory": { + "max": 4294967296, + "min": 4294967296 + } + }, + "startup_order": 0, + "total_count": 1, + "volumes": [] + } + ], + "size": 512, + "version": 3, + "will_end": false +} \ No newline at end of file diff --git a/contrib/zapp-shop-sample/zapp-spark/README-devel.md b/contrib/zapp-shop-sample/zapp-spark/README-devel.md new file mode 100644 index 0000000..ff7b56c --- /dev/null +++ b/contrib/zapp-shop-sample/zapp-spark/README-devel.md @@ -0,0 +1,41 @@ +# Jupyter Notebook image + +This image contains the Jupyter notebook configured with Pythen and a Spark client. It is used by Zoe, the Container Analytics as a +Service system to create on-demand notebooks connected to containerized Spark clusters. + +Zoe can be found at: https://github.com/DistributedSystemsGroup/zoe + +## Setup + +The Dockerfile runs a start script that configures the Notebook using these environment variables: + +* SPARK\_MASTER\_IP: IP address of the Spark master this notebook should use for its kernel +* PROXY\_ID: string to use as a prefix for URL paths, for reverse proxying +* SPARK\_EXECUTOR\_RAM: How much RAM to use for each executor spawned by the notebook + +# Spark Scala master image + +This image contains the Scala master process. It is used by Zoe, the Container Analytics as a +Service system to create on-demand Spark clusers in Spark standalone mode. + +Zoe can be found at: https://github.com/DistributedSystemsGroup/zoe + +## Setup + +The Dockerfile automatically starts the Spark master process when the container is run. + +# Spark worker image + +This image contains the Scala worker process. It is used by Zoe, the Container Analytics as a +Service system to create on-demand Spark clusters in standalone mode. + +Zoe can be found at: https://github.com/DistributedSystemsGroup/zoe + +## Setup + +The Dockerfile runs the worker process when run. The following options can be passed via environment variables: + +* SPARK\_MASTER\_IP: IP address of the Spark master this notebook should use for its kernel +* SPARK\_WORKER\_RAM: How much RAM the worker can use (default is 4g) +* SPARK\_WORKER\_CORES: How many cores can be used by the worker process (default is 4) + diff --git a/contrib/zapp-shop-sample/zapp-spark/README-jupyter.md b/contrib/zapp-shop-sample/zapp-spark/README-jupyter.md new file mode 100644 index 0000000..14c0d6e --- /dev/null +++ b/contrib/zapp-shop-sample/zapp-spark/README-jupyter.md @@ -0,0 +1,10 @@ +# Spark ZApp + +URL: [https://gitlab.eurecom.fr/zoe-apps/zapp-spark](https://gitlab.eurecom.fr/zoe-apps/zapp-spark) + +Combine the full power of a distributed [Apache Spark](http://spark.apache.org) cluster with Python Jupyter Notebooks. + +The Spark shell can be used from the built-in terminal in the notebook ZApp. + +Spark is configured in stand-alone, distributed mode. This ZApp contains Spark version 2.1.0. + diff --git a/contrib/zapp-shop-sample/zapp-spark/README-submit.md b/contrib/zapp-shop-sample/zapp-spark/README-submit.md new file mode 100644 index 0000000..035ddb7 --- /dev/null +++ b/contrib/zapp-shop-sample/zapp-spark/README-submit.md @@ -0,0 +1,5 @@ +# Spark ZApp + +URL: [https://gitlab.eurecom.fr/zoe-apps/zapp-spark](https://gitlab.eurecom.fr/zoe-apps/zapp-spark) + +Traditional Spark submit jobs. Use the command-line parameter to specify which Python or JAR file to execute from your workspace. diff --git a/contrib/zapp-shop-sample/zapp-spark/logo.png b/contrib/zapp-shop-sample/zapp-spark/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..16702a9f022a301c3098122d2dd1e4f5a8595679 GIT binary patch literal 26999 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