(window.webpackJsonp=window.webpackJsonp||[]).push([[39],{106:function(e,r,n){"use strict";n.r(r),n.d(r,"frontMatter",(function(){return c})),n.d(r,"metadata",(function(){return u})),n.d(r,"toc",(function(){return s})),n.d(r,"default",(function(){return p}));var t=n(3),a=n(7),i=(n(0),n(193)),c={title:"Building Submarine Spark Security Plugin"},u={unversionedId:"userDocs/submarine-security/spark-security/build-submarine-spark-security-plugin",id:"version-0.6.0/userDocs/submarine-security/spark-security/build-submarine-spark-security-plugin",isDocsHomePage:!1,title:"Building Submarine Spark Security Plugin",description:"\x3c!--",source:"@site/versioned_docs/version-0.6.0/userDocs/submarine-security/spark-security/build-submarine-spark-security-plugin.md",slug:"/userDocs/submarine-security/spark-security/build-submarine-spark-security-plugin",permalink:"/docs/userDocs/submarine-security/spark-security/build-submarine-spark-security-plugin",editUrl:"https://github.com/apache/submarine/edit/master/website/versioned_docs/version-0.6.0/userDocs/submarine-security/spark-security/build-submarine-spark-security-plugin.md",version:"0.6.0",sidebar:"docs",previous:{title:"Submarine Spark Security Plugin",permalink:"/docs/userDocs/submarine-security/spark-security/README"},next:{title:"MLflow UI",permalink:"/docs/userDocs/others/mlflow"}},s=[],o={toc:s};function p(e){var r=e.components,n=Object(a.a)(e,["components"]);return Object(i.b)("wrapper",Object(t.a)({},o,n,{components:r,mdxType:"MDXLayout"}),Object(i.b)("p",null,"Submarine Spark Security Plugin is built using ",Object(i.b)("a",{parentName:"p",href:"http://maven.apache.org"},"Apache Maven"),". To build it, ",Object(i.b)("inlineCode",{parentName:"p"},"cd")," to the root direct of submarine project and run:"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-bash"},"mvn clean package -Dmaven.javadoc.skip=true -DskipTests -pl :submarine-spark-security\n")),Object(i.b)("p",null,"By default, Submarine Spark Security Plugin is built against Apache Spark ",Object(i.b)("inlineCode",{parentName:"p"},"2.3.x")," and Apache Ranger ",Object(i.b)("inlineCode",{parentName:"p"},"1.1.0"),", which may be incompatible with other Apache Spark or Apache Ranger releases."),Object(i.b)("p",null,"Currently, available profiles are:"),Object(i.b)("p",null,Object(i.b)("strong",{parentName:"p"},"Spark"),": ",Object(i.b)("inlineCode",{parentName:"p"},"-Pspark-2.3"),", ",Object(i.b)("inlineCode",{parentName:"p"},"-Pspark-2.4"),", ",Object(i.b)("inlineCode",{parentName:"p"},"-Pspark-3.0")),Object(i.b)("p",null,Object(i.b)("strong",{parentName:"p"},"Ranger"),": ",Object(i.b)("inlineCode",{parentName:"p"},"-Pranger-1.2"),", ",Object(i.b)("inlineCode",{parentName:"p"},"-Pranger-2.0")))}p.isMDXComponent=!0},193:function(e,r,n){"use strict";n.d(r,"a",(function(){return l})),n.d(r,"b",(function(){return d}));var t=n(0),a=n.n(t);function i(e,r,n){return r in e?Object.defineProperty(e,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[r]=n,e}function c(e,r){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);r&&(t=t.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),n.push.apply(n,t)}return n}function u(e){for(var r=1;r<arguments.length;r++){var n=null!=arguments[r]?arguments[r]:{};r%2?c(Object(n),!0).forEach((function(r){i(e,r,n[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):c(Object(n)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(n,r))}))}return e}function s(e,r){if(null==e)return{};var n,t,a=function(e,r){if(null==e)return{};var n,t,a={},i=Object.keys(e);for(t=0;t<i.length;t++)n=i[t],r.indexOf(n)>=0||(a[n]=e[n]);return a}(e,r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(t=0;t<i.length;t++)n=i[t],r.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var o=a.a.createContext({}),p=function(e){var r=a.a.useContext(o),n=r;return e&&(n="function"==typeof e?e(r):u(u({},r),e)),n},l=function(e){var r=p(e.components);return a.a.createElement(o.Provider,{value:r},e.children)},b={inlineCode:"code",wrapper:function(e){var r=e.children;return a.a.createElement(a.a.Fragment,{},r)}},m=a.a.forwardRef((function(e,r){var n=e.components,t=e.mdxType,i=e.originalType,c=e.parentName,o=s(e,["components","mdxType","originalType","parentName"]),l=p(n),m=t,d=l["".concat(c,".").concat(m)]||l[m]||b[m]||i;return n?a.a.createElement(d,u(u({ref:r},o),{},{components:n})):a.a.createElement(d,u({ref:r},o))}));function d(e,r){var n=arguments,t=r&&r.mdxType;if("string"==typeof e||t){var i=n.length,c=new Array(i);c[0]=m;var u={};for(var s in r)hasOwnProperty.call(r,s)&&(u[s]=r[s]);u.originalType=e,u.mdxType="string"==typeof e?e:t,c[1]=u;for(var o=2;o<i;o++)c[o]=n[o];return a.a.createElement.apply(null,c)}return a.a.createElement.apply(null,n)}m.displayName="MDXCreateElement"}}]);