(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{144:function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return b}));var r=n(0),i=n.n(r);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function c(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,i=function(e,t){if(null==e)return{};var n,r,i={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var m=i.a.createContext({}),l=function(e){var t=i.a.useContext(m),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=l(e.components);return i.a.createElement(m.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},d=i.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,a=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),u=l(n),d=r,b=u["".concat(a,".").concat(d)]||u[d]||p[d]||o;return n?i.a.createElement(b,c(c({ref:t},m),{},{components:n})):i.a.createElement(b,c({ref:t},m))}));function b(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=d;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,a[1]=c;for(var m=2;m<o;m++)a[m]=n[m];return i.a.createElement.apply(null,a)}return i.a.createElement.apply(null,n)}d.displayName="MDXCreateElement"},91:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return a})),n.d(t,"metadata",(function(){return c})),n.d(t,"toc",(function(){return s})),n.d(t,"default",(function(){return l}));var r=n(3),i=n(7),o=(n(0),n(144)),a={title:"Implementation Notes"},c={unversionedId:"designDocs/implementation-notes",id:"designDocs/implementation-notes",isDocsHomePage:!1,title:"Implementation Notes",description:"\x3c!--",source:"@site/docs/designDocs/implementation-notes.md",slug:"/designDocs/implementation-notes",permalink:"/docs/designDocs/implementation-notes",editUrl:"https://github.com/apache/submarine/edit/master/website/docs/designDocs/implementation-notes.md",version:"current",sidebar:"docs",previous:{title:"Architecture and Requirment",permalink:"/docs/designDocs/architecture-and-requirements"},next:{title:"Environments Implementation",permalink:"/docs/designDocs/environments-implementation"}},s=[],m={toc:s};function l(e){var t=e.components,n=Object(i.a)(e,["components"]);return Object(o.b)("wrapper",Object(r.a)({},m,n,{components:t,mdxType:"MDXLayout"}),Object(o.b)("p",null,"Before digging into details of implementations, you should read ",Object(o.b)("a",{parentName:"p",href:"/docs/designDocs/architecture-and-requirements"},"architecture-and-requirements")," first to understand overall requirements and architecture."),Object(o.b)("p",null,"Here're sub topics of Submarine implementations:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",{parentName:"li",href:"/docs/designDocs/storage-implementation"},"Submarine Storage"),": How to store metadata, logs, metrics, etc. of Submarine."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",{parentName:"li",href:"/docs/designDocs/environments-implementation"},"Submarine Environment"),": How environments created, managed, stored in Submarine. "),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",{parentName:"li",href:"/docs/designDocs/experiment-implementation"},"Submarine Experiment"),": How experiments managed, stored, and how the predefined experiment template works."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",{parentName:"li",href:"/docs/designDocs/notebook-implementation"},"Submarine Notebook"),": How experiments managed, stored, and how the predefined experiment template works."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",{parentName:"li",href:"/docs/designDocs/submarine-server/architecture"},"Submarine Server"),": How Submarine server is designed, architecture, implementation notes, etc.")),Object(o.b)("p",null,"Working-in-progress designs, Below are designs which are working-in-progress, we will move them to the upper section once design & review is finished: "),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",{parentName:"li",href:"/docs/designDocs/wip-designs/submarine-clusterServer"},"Submarine HA Design"),": How Submarine HA can be achieved, using RAFT, etc."),Object(o.b)("li",{parentName:"ul"},Object(o.b)("a",{parentName:"li",href:"/docs/designDocs/wip-designs/submarine-launcher"},"Submarine services deployment module:")," How to deploy submarine services to k8s, YARN or cloud. ")))}l.isMDXComponent=!0}}]);